При разработке внешних печатных форм на управляемых формах разработчики часто сталкиваются с ситуацией, когда макет не выводится на экран, при этом система не выдает явных ошибок. Давайте разберем, почему это происходит и как привести код в соответствие со стандартами 1С.
Основная причина заключается в том, что в клиент-серверной архитектуре 1С серверная часть (модуль объекта) и клиентская часть (интерфейс пользователя) жестко разделены. Метод ТабличныйДокумент.Показать() является клиентским. При попытке вызвать его из модуля объекта, который выполняется на сервере, система блокирует вывод окна, так как на сервере нет активного окна пользователя.
В файловом варианте базы клиент и сервер работают в одном процессе, поэтому иногда разработчики ошибочно полагают, что использование Показать() — это верный путь. Однако для корректной работы в клиент-серверном режиме необходимо использовать механизмы Библиотеки Стандартных Подсистем (БСП).
В современных конфигурациях 1С функция Печать в модуле объекта не должна сама выводить форму на экран. Её задача — сформировать ТабличныйДокумент и передать его в коллекцию печатных форм. Система сама позаботится о том, чтобы открыть документ в нужном интерфейсном окне.
Давайте рассмотрим структуру правильной функции Печать для внешней печатной формы:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Наименование формы должно совпадать с тем, что указано в СведенияОВнешнейОбработке
Наименование = \"Наименование вашей печатной формы\";
// Проверяем, нужно ли печатать данную форму
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, Наименование) Тогда
// Формируем табличный документ (логику вывода областей оставляем здесь)
ТабДокумент = СформироватьТабличныйДокумент(МассивОбъектов);
// Выводим документ в коллекцию, откуда его заберет система
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
Наименование,
Наименование,
ТабДокумент
);
КонецЕсли;
КонецФункции
СведенияОВнешнейОбработке для команды печати указано Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(). Это позволит системе правильно обратиться к функции Печать в модуле объекта.Печать в модуле объекта обязательно должна принимать параметры: МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода. Если сигнатура функции отличается, платформа не сможет корректно передать данные.СформироватьТабличныйДокумент), которая будет возвращать объект ТабличныйДокумент.ТабДок.Показать() из кода модуля объекта. Если вам нужно отладить вывод документа, используйте отладчик: поставьте точку останова в функции Печать и проверьте состояние объекта ТабДокумент перед завершением функции.Если вы работаете с устаревшей или специфической конфигурацией, где механизмы БСП отсутствуют, вам необходимо реализовать вызов метода Показать() на стороне клиента.
В этом случае работа строится так:
ТабДок.Показать().СведенияОВнешнейОбработке установите Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода().Важное примечание: Всегда отдавайте предпочтение интеграции через механизмы УправлениеПечатью (БСП). Это гарантирует, что печатная форма будет корректно работать во всех режимах, поддерживать сохранение настроек печати, выбор принтера и формирование пакета документов, что невозможно при ручном использовании метода Показать().