Как скопировать макет 1с
Необходимо скопировать макет табличного документа, можно ли это сделать без выгрузки в файл, и без использования временного хранилища?
Как бы так объяснить, есть некий бланк, на который надо печатать и соответственно попадать в ячейки, и для этого будет вестись отдельный справочник макет для разных принтеров, люди сами будут настраивать макеты. Так вот есть макет образец, его соответственно надо копировать при создании на его основе нового элемента справочника макетов.
Что такое "макет"? Табличный документ можно "скопировать", например, так: ТабДокКопия=Новый ТабличныйДокумент; ТабДокКопия.Вывести(ТабДокОригинал); возможно, еще сопосбы есть
Reset через вывести теряются параметры с шаблонами, а через ХЗ я уже пробывал, думал мож покультурней есть вариант
Выведи макет в табличный документ, затем сохрани его как файл и запихни полученный файл в хранилище значения. И "копируй" таким образом сколько угодно
"Выведи макет в табличный документ", и мы сразу теряем параметры и шаблоны, он перестает быть макетом.
тогда сразу храни макет в виде двоичных данных, а не как стандартный макет и копируй себе на здоровье
В любом случае программно добавить новый "макет" в каком-нибудь виде к любому объекту конфигурации просто НЕВОЗМОЖНО. и тебе придется сохранять полученный в результате "копирования" макет в хранилище значения.
Да проблемы то особо нет. Есть макет черновика и оригинала(он без линий и текстов, только параметры и шаблоны с разметкой) бланка. Я сделал макеты по умолчанию оригинала и черновика (чтоб пользователь мог посмотреть как красиво смотрится на черновике , а для печати использовал оригинал). Но так-как принтеры бывают разные возникла необходимость реализации редактирования и хранения различных версий макетов для принтеров. Сейчас у меня сделано так: есть макеты в конфе, они являются макетами по умолчанию; есть справочник, каждый элемент которого хранит одновременно оригинал и черновик. Пользователь редактирует только черновик, а специальная процедура копирует черновик, и из копии делает оригинал убирая все линии и тексты, оставляя форматирование параметры и шаблоны.
Была мысля держать только макет черновика а на печать выводить копию его прошедшую обработку на отсев всего лишнего, но подумал буду держать два варианта на всякий.
Иногда требуется модифицировать встроенные печатные формы. Один из вариантов - выносить их во внешние печатные формы (чтобы конфигурацию не сильно портить). Но сталкиваемся с проблемой: хотя в типовой конфигурации логически выделяется в виде функции печать каждой печатной формы, но идет непосредственно обращение к реквизитам документа. А во внешней печатной форме этих реквизитов нет, есть только ссылка на объект. Приходится менять код формирования печатной формы не только там, где это нужно нам, но и везде. Плюс это вызовет проблему при возможном обновлении этого участка кода у поставщика конфигурации - придется или вникать в изменения после обновления, или заново вносить все наши изменения.
Как вариант решения этой проблемы - завести во внешней обработке, содержащей печатную форму, переменные, аналогичные реквизитам и табличным частям документа. А чтобы не уподобляться мастерам китайского кода, и не писать вещи, такие как: Реквизит1 = Док.Реквизит1 и т.д., можно воспользовать хорошей функцией ЗаполнитьЗначенияСвойств. Только переменные в обработке нужно объявлять экспортными. Вот пример кода модуля для внешней печатной формы заказа на производство (текст модуля ПечатьЗаказа() убран из соображений краткости).
Перем мВалютаРегламентированногоУчета Экспорт;
Перем //реквизиты док-та
ВремяНапоминания Экспорт,
ДатаИсполнения Экспорт,
Комментарий Экспорт,
НапомнитьОСобытии Экспорт,
Организация Экспорт,
Ответственный Экспорт,
Подразделение Экспорт,
Исполнитель Экспорт,
ОсновнойЗаказНаПроизводство Экспорт,
ДатаЗапуска Экспорт;
Перем
Номер Экспорт, Дата Экспорт, Проведен Экспорт, Ссылка Экспорт;
Перем //табличные части док-та
Продукция Экспорт,
ПараметрыВыпускаПродукции Экспорт,
Материалы Экспорт;
ЗаполнитьЗначенияСвойств ( ЭтотОбъект , СсылкаНаОбъект );
Функция Печать () Экспорт
Если Не УправлениеДопПравамиПользователей . РазрешитьПечатьНепроведенныхДокументов ( СсылкаНаОбъект . Проведен ) Тогда
Предупреждение ( "Недостаточно полномочий для печати непроведенного документа!" );
Возврат Неопределено;
КонецЕсли;
Такой подход позволяет нетронутыми использовать участки типового кода, внося изменения только там, где это нужно. На всякий случай выкладываю саму внешнюю печатную форму, как образец.
Необходимо скопировать макет табличного документа, можно ли это сделать без выгрузки в файл, и без использования временного хранилища?
Как бы так объяснить, есть некий бланк, на который надо печатать и соответственно попадать в ячейки, и для этого будет вестись отдельный справочник макет для разных принтеров, люди сами будут настраивать макеты. Так вот есть макет образец, его соответственно надо копировать при создании на его основе нового элемента справочника макетов.
(9) Что такое "макет"?
Табличный документ можно "скопировать", например, так:
Reset через вывести теряются параметры с шаблонами, а через ХЗ я уже пробывал, думал мож покультурней есть вариант
Выведи макет в табличный документ, затем сохрани его как файл и запихни полученный файл в хранилище значения. И "копируй" таким образом сколько угодно
"Выведи макет в табличный документ", и мы сразу теряем параметры и шаблоны, он перестает быть макетом.
(22) тогда сразу храни макет в виде двоичных данных, а не как стандартный макет и копируй себе на здоровье
Например, если в реквизитие с типом ХЗ, то вообще без огороженного огорода:
Реквизит=Новый ХранилищеЗначения(ПолучитьОбщийМакет("Имя"));
В любом случае программно добавить новый "макет" в каком-нибудь виде к любому объекту конфигурации просто НЕВОЗМОЖНО. и тебе придется сохранять полученный в результате "копирования" макет в хранилище значения.
Да проблемы то особо нет.
Есть макет черновика и оригинала(он без линий и текстов, только параметры и шаблоны с разметкой) бланка. Я сделал макеты по умолчанию оригинала и черновика (чтоб пользователь мог посмотреть как красиво смотрится на черновике , а для печати использовал оригинал). Но так-как принтеры бывают разные возникла необходимость реализации редактирования и хранения различных версий макетов для принтеров.
Сейчас у меня сделано так: есть макеты в конфе, они являются макетами по умолчанию; есть справочник, каждый элемент которого хранит одновременно оригинал и черновик. Пользователь редактирует только черновик, а специальная процедура копирует черновик, и из копии делает оригинал убирая все линии и тексты, оставляя форматирование параметры и шаблоны.
Была мысля держать только макет черновика а на печать выводить копию его прошедшую обработку на отсев всего лишнего, но подумал буду держать два варианта на всякий.
Как в ячейке макета печатной формы сделать перенос строк
Подскажите, пожалуйста. Делаю макет печатной формы. Объединил ячейки. Задал высоту строки. Пытаюсь.
Модуль менеджера для печатной формы. Вывод на печать данных одного документа.
Задача обстоит в том плане что при данном коде он на печать выводит абсолютно все документы. Хотя.
Перенос документа с одного сервера на другой
Предположим, есть некий сервер, на который каждую неделю скидывают xls документ. (доступа по FTP у.
Перенос данных одного документа в другой
Добрый вечер. При создании нового документа "Путевой лист" необходимо заполнить реквизит "остаток.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ТабДок = Новый ТабличныйДокумент;
Печать(ТабДок, ПараметрКоманды);
ТабДок.АвтоМасштаб=Истина;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
Процедура Печать(ТабДок, Ссылка) Экспорт
Макет = Документы.ЗаказМонтажа.ПолучитьМакет("Печать");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказМонтажа.Выполнено,
| ЗаказМонтажа.Дата,
| ЗаказМонтажа.Клиент,
| ЗаказМонтажа.Номер,
| ЗаказМонтажа.ОбщаяСтоимость,
| ЗаказМонтажа.Оплачено,
| ЗаказМонтажа.ОтветственныйЗаРаботу,
| ЗаказМонтажа.СрокВыполненияРабот,
| ЗаказМонтажа.Услуга,
| ЗаказМонтажа.РасходныеМатериалы.(
| НомерСтроки,
| Оборудование,
| Количество,
| ЦенаОборудования,
| СтоимостьОборудования,
| ЦенаЗаМонтаж,
| СтоимостьМонтажа
| )
|ИЗ
| Документ.ЗаказМонтажа КАК ЗаказМонтажа
|ГДЕ
| ЗаказМонтажа.Ссылка В (&Ссылка)";
Запрос.Параметры.Вставить("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьРасходныеМатериалыШапка = Макет.ПолучитьОбласть("РасходныеМатериалыШапка");
ОбластьРасходныеМатериалы = Макет.ПолучитьОбласть("РасходныеМатериалы");
ОбластьИтог=Макет.ПолучитьОбласть("Всего");
Подвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Очистить();
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ТабДок.Вывести(ОбластьРасходныеМатериалыШапка);
ВыборкаРасходныеМатериалы = Выборка.РасходныеМатериалы.Выбрать();
СуммаИтог=0;
СуммИтог=0;
Пока ВыборкаРасходныеМатериалы.Следующий() Цикл
Если ВыборкаРасходныеМатериалы.Количество > 0 Тогда
ОбластьРасходныеМатериалы.Параметры.Заполнить(ВыборкаРасходн ыеМатериалы);
ТабДок.Вывести(ОбластьРасходныеМатериалы, ВыборкаРасходныеМатериалы.Уровень());
СуммаИтог=СуммаИтог+ВыборкаРасходныеМатериалы.СтоимостьОбору дования;
СуммИтог=СуммИтог+ВыборкаРасходныеМатериалы.СтоимостьМонтажа ;
Иначе Продолжить;
КонецЕсли;
КонецЦикла;
ОбластьИтог.Параметры.ВсегоПоДокументу=СуммаИтог;
ОбластьИтог.Параметры.ВсегоПоДокумент=СуммИтог;
ТабДок.Вывести(ОбластьИтог);
В этой статье мы научимся создавать внешнюю печатную форму для управляемого приложения 1С 8.3, которое написано на БСП («1С: Бухгалтерия предприятия 3.0», «1С: Управление торговлей 11»). Причем создавать с нуля, не используя так называемые шаблоны. Вы сами научитесь создавать шаблоны внешних печатных форм.
Все это делается довольно просто))
И так, создадим новую обработку 1С.
Мы будем создавать внешний счет на оплату покупателю, поэтому обработку так и назовем: «СчетНаОплатуВнешний».
Сохраним ее на жесткий диск.
Зайдем в модуль обработки, и создадим экспортную функцию СведенияОВнешнейОбработке.
Внутри этой функции создадим структуру ПараметрыРегистрации, которая будет содержать определенный список полей. Каждое поле мы разберем в отдельности.
Создадим первый элемент структуры, он будет иметь ключ с название «Вид».
Значением данной связки КлючИЗначение идет одна из строк:
В нашем случае должна быть строка «ПечатнаяФорма».
Следующий элемент структуры должен иметь ключ с названием Назначение.
В качестве значения данного элемента должен выступать массив, где перечислены будут все документы или справочники, в которых будет выходить данная печатная форма.
Они должны иметь тип строка, и быть в следующем формате:
Документ.»НазваниеДокумента»
Справочник.»НазваниеСправочника»
У нас этот массив будет возвращать отдельная функция ПолучитьНазначениеОбработки.
Допишем созданный последним элемент структуры.
Создадим новый элемент структуры, ключ которого будет называться «Наименование», а в значении будет содержаться наименование обработки, которое будет отображаться в справочнике «Дополнительные внешние печатные формы».
Следующий элемент структуры будет иметь название «Версия», значением данного элемента будет версия обработки. Задается программистом на его усмотрение.
Следующий элемент имеет название «Информация», который содержит краткую информацию по обработке.
Следующий элемент имеет название «БезопасныйРежим», его необходим устанавливать в значение истина или ложь, в зависимости от того необходимо устанавливать или отключать безопасный режим во время выполнения обработки. Мы установим значение Истина.
И в последнем параметре необходимо добавить команды, которые будут поставляться обработкой. Для этого нам необходимо создать и заполнить таблицу команд. Разработаем функцию, которая создает и возвращает таблицу с определенным набором полей. Делать это будем в функции ПолучитьТаблицуКоманд.
Создадим функцию и таблицу значений внутри нее.
Теперь создадим пять колонок этой таблицы.
И первая колонка – Представление (тип строка).
Эта колонка – представление команды в пользовательском интерфейсе, т.е. то, что пользователь увидит при нажатии меню»Печать» в документе или справочнике.
Вторая колонка – Идентификатор.
Это может быть любая текстовая строка, уникальная в пределах данной обработки.
Третья колонка – Использование.
Параметр данной колонки типа строка, должен принимать одно из четырех значений –
- ОткрытиеФормы – Открывает форму обработки.
- ВызовКлиентскогоМетода – будет вызвана клиентская процедура из модуля формы обработки.
- ВызовСерверногоМетода — будет вызвана серверная процедура из модуля обработки.
- СценарийВБезопасномРежиме – тоже будет вызвана серверная процедура из модуля обработки в безопасном режиме.
Конкретно мы будем использовать вызов серверного метода.
Следующая колонка – показывать оповещение. Принимает значение истина или ложь, в зависимости от того надо показывать оповещение или нет.
И последняя колонка – модификатор. Это дополнительный модификатор команды. В нашем случае будет иметь название ПечатьMXL.
Теперь создадим процедуру, которая будет заполнять данную таблицу значений.
В данном коде все понятно.
В функции СведенияОВнешнейОбработке создадим команду и заполним ее.
Создаем таблицу значений:
Теперь заполним ее.
Еще раз пройдемся по параметрам.
- Первый параметр, непосредственно таблица команд вновь созданная.
- Второй параметр, как будет отображаться команда пользователю на форме (документа, справочника).
- Третий – уникальный идентификатор команды, запомните его, он нам еще пригодится!
- Четвертый параметр – использование, что вызовет Ваша команда.
- Пятый параметр – показывать оповещение, мы не будем это делать.
- Шестой параметр – модификатор, в нашем случае он всегда один ПечатьMXL.
Теперь передадим вновь созданную таблицу команд в структуру ПараметрыРегистрации.
И пусть наша функция СведенияОВнешнейОбработке возвращает данную структуру.
Все теперь наша обработка будет передавать нужные параметры регистрации, которые будут необходимы при создании элемента справочника дополнительные печатные формы и обработки. Обращаю ваше внимание, что название всех полей в структуре Параметры регистрации, а также название и типы всех колонок в таблице команд, должны быть те которые приведены в примере, иначе Ваша обработка не зарегистрируется.
Теперь в модуле объекта создадим процедуру Печать. Это процедура с четырьмя параметрами: МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода.
И вот начинается самое интересное, теперь вам необходимо войти в аналогичную процедуру в менеджере объекта счет на оплату покупателю, или в обработке, которая, по сути, является менеджером печати.
Как узнать, где находится нужная нам функция?
Откроем модуль менеджера документа Счет на оплату покупателю.
И найдем процедуру ДобавитьКомандыПечати, которая заполняет список команд .
В этой процедуре найдем код, где добавляется команда для нужной нам печатной формы (список команд добавляется в таблицу значений КомандыПечати). И обратим внимание на свойство МенеджерПечати. Если этому свойству присваивается какое-нибудь значение — это путь к объекту метаданных, как правило к обработке, то значит при выводе нужной печатной формы будет отработан код в процедуре Печать, которая находится в модуле менеджере этого объекта (в обработке). А если это свойство в принципе не фигурирует при заполнении команды печати, то значит будет отработан код в процедуре Печать, которая находится в модуле менеджера нашего основного объекта (в нашем случае это документ СчетНаОплатуПокупателю)
Посмотрим на процедуру ДобавитьКомандыПечати в модуле менеджера документа «Счет на оплату покупателя».
оскольку мы делаем внешнюю печатную форму счета на оплату, то нас интересует первое добавление в таблицу значений (см. свойство Представление), и мы видим, что в этом случае заполнено свойство МенеджерПечати, где указан объект Обработка.ПечатьСчетаНаОплату. Это значит, что нам нужно найти процедуру Печать в модуле менеджера обработки ПечатьСчетаНаОплату.
А если бы мы решили сделать внешнюю печатную форму договора счета на оплату (второе добавление в таблицу значений КомандыПечати), то нам нужно было бы найти процедуру Печать в модуле менеджера документа СчетНаОплатуПокупателя.
Откроем модуль менеджера обработки ПечатьСчетаНаОплату.
И раскроем процедуру Печать.
Нас интересует второе условие (где фигурирует строка «СчетЗаказ», см. идентификатор нужной команды в процедуре ДобавитьКомандыПечати модуля менеджера документа), скопируем это условие в процедуру Печать нашей внешней обработки.
Внимание! Копировать напрямую процедуру Печать из модуля менеджера (без разницы обработка это, документ или справочник) не следует. Поскольку у них отличается количество параметров, в последствие это приводит к ошибкам при работе.
Так же из модуля менеджера обработки скопируем процедуру СформироватьПечатнуюФорм
В этом коде есть строка, где заполняется таблица сведений счета на оплату.
Эта таблица получается при помощи процедуры модуля менеджера объекта (в нашем случае это документ СчетНаОплатуПокупателю). Найдем эту процедуру в модуле менеджера документа СчетНаОплатуПокупателю.
И скопируем её в модель нашей внешней обработки.
А сам код процедуры СформироватьПечатнуюФорму в модуле внешней обработки исправим, убрав все не нужное от туда.
Если мы сейчас сделаем проверку модуля внешней обработки, то выйдет две ошибки. Первая, что не определена переменная ПараметрыПечати в процедуре Печать, и, что не найдена функция ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в функции ПолучитьТаблицуСведенийСчетаНаОплату.
Создадим переменную ПараметрыПечати в процедуре Печать. Это будет простая структура.
А потом найдем функцию ПолучитьТекстЗапросаДляФормированияТаблицыСведенийСчетаНаОплату в модуле менеджера документа СчетНаОплатуПокупателю и скопируем её в модуль внешней обработки.
Должен получится следующий состав процедур и функций модуля внешней обработки (для удобства я разделил их на две области).
Еще раз делаем проверку модуля. Ошибок не обнаружено.
Продолжаем, теперь нам необходимо, что бы брался наш макет, и печатался по нашей команде.
Нас интересует процедура СформироватьПечатнуюФорму, а в ней мы уделим внимание методу ПечатьСчетаНаОплату общего модуля ПечатьТорговыхДокументов.
Очевидно, она непосредственно формирует табличный документ. Перейдем в этот общий модуль, и скопируем функцию ПечатьСчетаНаОплату в модуль нашей внешней обработки.
Делаем проверку модуля внешней обработки. Ругается на несуществующие методы ВывестиЗаголовокПредупреждение и НомерСчетаНаОплату.
Переходим в общий модуль, от куда мы взяли функцию ПечатьСчетаНаОплату, находим процедуру ВывестиЗаголовокПредупреждение , и копируем ее в модуль внешней обработки.
А функция НомерСчетаНаОплату в общем модуле ПечатьТорговыхДокументов экспортная, поэтому мы просто исправим код в процедуре ПечатьСчетаНаОплату, где используется проблемная функция, сделав вызов этой функции из вышеупомянутого общего модуля.
Проверяем еще раз ошибки. Все нормально.
Не забудем в процедуре СформироватьПечатнуюФорму убрать вызов метода ПечатьСчетаНаОплату из общего модуля.
Теперь зайдем в скопированную функцию ПечатьСчетаНаОплату, и посмотрим, где в ней подтягивается макет.
Находим данный макет в общих макетах и копируем его в макеты нашей обработки.
Исправляем выделенный код, где подтягивается макет, следующий образом.
Теперь зайдем в наш скопированный макет, и сделаем какое-нибудь изменение, чтобы вы видели, что команда подтянула именно макет из внешней обработки.
Вернемся обратно в процедуру Печать нашей внешней обработки.
И теперь осталась одна небольшая хитрость, без которой ваш внешний отчет не будет работать. Необходимо текст «СчетЗаказ» (это идентификатор типовой печатной формы).
Заменить на название идентификатора команды («СчетНаОплатуВнешний»).
Все, сохраняем данную обработку. И запускаем «1С: Предприятие» из конфигуратора 1С.
Идем в администрирование. В дополнительные отчеты и обработки.
Нажимаем на кнопку «Добавить из файла» и выбираем нашу созданную обработку.
Записываем. И смотрим, как выходит наша печатная форма.
Ссылка на дубль статьи на Инфостарте. В конце этой статьи приведены примеры внешних печатных форм счета на оплату, ТОРГ 12, ПКО , М11 и Требование накладная в одной обработке (документ Требование накладная). Все внешние печатные формы сделаны для конфигурации «1С: Бухгалтерия предприятия» (релиз 3.0.67.67).
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
2 thoughts on “ Создание внешней печатной формы в типовых конфигурациях 1С 8.3 ”
программирование не для всех.
то ПечатьXML, то ПечатьMXL, потом опять ПечатьXML. где правильно?
открыть модуль менеджера документа Счет на оплату покупателю — у меня там пусто. приехали, конечная. вот и поучились программированию.
Не суть так важно. Такая задача вероятно не так часто бывает. Но в любом случае внешние формы и т.п. наверное надо научиться делать.
Читайте также: