При разработке внешних обработок часто возникает задача: пользователь открывает форму обработки, указывает параметры, нажимает кнопку печати, после чего сама вспомогательная форма должна закрыться, а на экране должен появиться готовый документ для предварительного просмотра и отправки на принтер. Рассмотрим типичные ошибки начинающих разработчиков при реализации этого механизма и разберем правильный алгоритм формирования печатной формы на платформе 1С:Предприятие 8.3.
Проанализируем частую путаницу в понятиях. Макет типа ТабличныйДокумент — это всего лишь шаблон будущей печатной формы. В нем размечены области (шапка, строки таблицы, подвал), задано форматирование, границы ячеек и прописаны имена параметров. Если просто вызвать метод Показать() непосредственно у макета, пользователь увидит сырой шаблон с именами параметров в угловых скобках вида <НомерДокумента> или <Организация>, но не реальные данные.
Для создания итогового печатного представления нам требуется:
ТабличныйДокумент.ЭтотОбъект.ПолучитьМакет().ПолучитьОбласть().Параметры у полученных областей.Вывести() или Присоединить().Показать().Посмотрим на пример ошибки, которая часто встречается в коде обработчика команды печати:
&НаКлиенте
Процедура Печать(Команда)
ПечатьНаСервере();
Закрыть();
Макет = ПолучитьМакет();
Макет.Показать();
КонецПроцедуры
В приведенном фрагменте допущены сразу две логические ошибки:
Закрыть() разрушает контекст текущей формы. Любой последующий код в этой же процедуре либо не выполнится корректно, либо приведет к неожиданному поведению клиентского приложения. Закрытие формы должно выполняться в самом конце процедуры.Разберем по шагам, как построить взаимодействие между модулем объекта внешней обработки и ее управляемой формой.
Шаг 1. Формирование табличного документа в модуле объекта
Вынесем процедуру компоновки печатного листа в модуль объекта обработки. Это обеспечит чистоту архитектуры и позволит при необходимости вызывать печать не только из формы, но и программно из других мест конфигурации.
Функция СформироватьПечатнуюФорму() Экспорт
ТабДок = Новый ТабличныйДокумент;
Макет = ЭтотОбъект.ПолучитьМакет("УПД_литры");
// Получаем и заполняем область шапки
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// ОбластьШапка.Параметры.Номер = "001";
// ОбластьШапка.Параметры.Дата = ТекущаяДатаСеанса();
ТабДок.Вывести(ОбластьШапка);
// Вывод строк документа (если есть табличная часть)
// ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// ТабДок.Вывести(ОбластьСтрока);
// Получаем и заполняем область подвала
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьПодвал);
Возврат ТабДок;
КонецФункции
Шаг 2. Вызов формирования и отображение результата в модуле формы
В модуле управляемой формы связываем серверное получение объекта и клиентский показ. Обратите внимание, что объект ТабличныйДокумент прекрасно сериализуется платформой и без проблем передается с сервера на клиент.
&НаКлиенте
Процедура Печать(Команда)
// 1. Получаем готовый табличный документ с сервера
ТабДок = СформироватьНаСервере();
// 2. Открываем табличный документ в отдельном окне
ТабДок.Показать("Универсальный передаточный документ");
// 3. Закрываем текущую форму обработки
ЭтаФорма.Закрыть();
КонецПроцедуры
&НаСервере
Функция СформироватьНаСервере()
// Преобразуем данные формы в прикладной объект внешней обработки
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// Вызываем экспортную функцию модуля объекта
Возврат ОбработкаОбъект.СформироватьПечатнуюФорму();
КонецФункции
При использовании метода ТабличныйДокумент.Показать() важно учитывать специфику клиентского окружения:
Показать() пытается открыть новое окно в интернет-браузере. Если в настройках браузера включена блокировка всплывающих окон (pop-up), окно с печатной формой может быть заблокировано без явного предупреждения. Рекомендуется разрешить всплывающие окна для адреса публикации базы 1С.Показать() открывает базовое окно просмотра платформы. В нем нет сервисных механизмов, привычных пользователям типовых конфигураций (например, отправки формы на электронную почту в формате PDF, автоматического добавления факсимиле подписи или сохранения в архив).Если разработка ведется в современной типовой конфигурации (например, 1C:ERP, УТ, КА, БП), то создавать собственную форму для внешних печатных форм вообще не требуется. Достаточно реализовать стандартный интерфейс БСП:
СведенияОВнешнейОбработке().ВызовСерверногоМетода или ПечатьФормы.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода).В таком случае типовые механизмы БСП автоматически отобразят сформированный ТабличныйДокумент в удобной форме ПечатьДокументов с полноценной панелью управления, реестром отправки и предварительным просмотром перед печатью.