При работе с конфигурациями на обычных формах (такими как 1С:Управление производственным предприятием 1.3, 1С:Управление торговлей 10.3 или 1С:Комплексная автоматизация 1.1) программисты часто сталкиваются с ситуацией, когда скачанная или созданная внешняя печатная форма после добавления в базу не появляется в меню «Печать» нужного документа или справочника. В этой статье мы подробно разберем, как устроен механизм регистрации внешних печатных форм, какие требования предъявляются к коду обработки и что делать, если форма «не видится» системой.
Для того чтобы система смогла корректно распознать и подключить внешнюю обработку как печатную форму, необходимо соблюдение нескольких критически важных условий на уровне метаданных и программного кода самой обработки. Проанализируем их по порядку:
СсылкаНаОбъект. Тип этого реквизита должен соответствовать (или включать в себя) тип объекта метаданных, для которого предназначена форма. Например, если форма для справочника СпецификацииНоменклатуры, тип реквизита должен быть СправочникСсылка.СпецификацииНоменклатуры. Если форма универсальная — можно использовать тип Произвольный или составной тип.Печать() с ключевым словом Экспорт. Именно эту функцию вызывает системный механизм при нажатии кнопки в интерфейсе. Она должна возвращать объект типа ТабличныйДокумент.Параметры_Авторегистрации.Выясним причину, по которой автоматическое назначение может не срабатывать. Механизм обычного приложения ищет в обработке текстовый макет. Важно: макет должен иметь тип «Текстовый документ», а не «Табличный документ».
В этом макете в каждой новой строке указывается полное имя объекта метаданных, к которому привязывается форма. Например:
Документ.РеализацияТоваровУслуг
Справочник.СпецификацииНоменклатуры
Если макет отсутствует или заполнен неверно, при загрузке обработки поле «Назначение» останется пустым («Не определено»), и вам придется указывать объекты вручную в интерфейсе программы. В качестве примера корректно настроенного макета можно использовать внешнюю печатную форму с авторегистрацией для УТ 10.3.
Посмотрим на пример реализации функции Печать для справочника спецификаций. В данном коде выполняется запрос к данным объекта через СсылкаНаОбъект, формируется табличный документ и заполняются области макета. Обратите внимание на использование менеджера временных таблиц для обработки сложных структур данных.
Функция Печать() Экспорт
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Спецификация";
Макет = ПолучитьМакет("Спецификация");
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект);
Запрос.Текст = "
|ВЫБРАТЬ
| СпецификацииНоменклатуры.Код КАК Код,
| СпецификацииНоменклатуры.Наименование КАК Наименование,
| СпецификацииНоменклатуры.Ответственный.Наименование КАК ОтветственныйНаименование
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
|ГДЕ
| СпецификацииНоменклатуры.Ссылка = &ТекущийЭлемент";
Шапка = Запрос.Выполнить.Выбрать();
Если Не Шапка.Следующий() Тогда
Возврат ТабДокумент;
КонецЕсли;
// Выводим заголовок из макета
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ОбластьМакета.Параметры.ТекстЗаголовка = "Спецификация номенклатуры: " + Шапка.Наименование;
ТабДокумент.Вывести(ОбластьМакета);
// Пример работы с комплектующими через временные таблицы
Отбор = Новый Структура("СписаниеКомплектующей", Перечисления.ВариантыСписанияКомплектующих.Всегда);
ТаблицаКомплектующих = УправлениеПроизводством.ПолучитьМатериалыПоСпецификации(СсылкаНаОбъект, 1, Отбор, ТекущаяДата(), Ложь);
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ЗапросКТаблице = Новый Запрос;
ЗапросКТаблице.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
ЗапросКТаблице.УстановитьПараметр("ТаблицаКомплектующих", ТаблицаКомплектующих);
ЗапросКТаблице.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ТаблицаКомплектующих ИЗ &ТаблицаКомплектующих КАК ТаблицаКомплектующих";
ЗапросКТаблице.Выполнить();
// ... дальнейшее формирование документа и вывод областей ...
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Возврат ТабДокумент;
КонецФункции
В этом примере мы видим, как СсылкаНаОбъект выступает связующим звеном между формой документа в базе и программным кодом обработки. Без этого реквизита запрос не получит параметр &ТекущийЭлемент, и печать завершится ошибкой.
Если код написан верно, но в справочнике или документе по-прежнему отображается только встроенная форма, проанализируем следующие моменты:
Часто путаница возникает из-за смешивания технологий. Рассмотрим подробнее: в современных конфигурациях на базе БСП (Библиотека Стандартных Подсистем) используется функция СведенияОВнешнейОбработке(). Однако в старых обычных формах этот механизм не работает. Если вы добавите функцию СведенияОВнешнейОбработке в обработку для УПП 1.3, система её просто проигнорирует. Для обычных форм актуальны именно макет Параметры_Авторегистрации и реквизит СсылкаНаОбъект.
Если форма не работает, выполним следующие шаги:
СсылкаНаОбъект в реквизитах обработки.Печать() является экспортной и находится в модуле объекта.Соблюдение этих правил гарантирует корректную работу внешних печатных форм в любом типовом решении 1С на обычных формах. В качестве практической основы для реализации собственных бланков подойдёт шаблон внешней печатной формы для обычных конфигураций.