Как открыть печатную форму и закрыть форму внешней обработки в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних обработок часто возникает задача: пользователь открывает форму обработки, указывает параметры, нажимает кнопку печати, после чего сама вспомогательная форма должна закрыться, а на экране должен появиться готовый документ для предварительного просмотра и отправки на принтер. Рассмотрим типичные ошибки начинающих разработчиков при реализации этого механизма и разберем правильный алгоритм формирования печатной формы на платформе 1С:Предприятие 8.3.

В чем заключается принципиальная разница между макетом и табличным документом

Проанализируем частую путаницу в понятиях. Макет типа ТабличныйДокумент — это всего лишь шаблон будущей печатной формы. В нем размечены области (шапка, строки таблицы, подвал), задано форматирование, границы ячеек и прописаны имена параметров. Если просто вызвать метод Показать() непосредственно у макета, пользователь увидит сырой шаблон с именами параметров в угловых скобках вида <НомерДокумента> или <Организация>, но не реальные данные.

Для создания итогового печатного представления нам требуется:

  1. Создать новый экземпляр результирующего объекта ТабличныйДокумент.
  2. Получить исходный шаблон из метаданных обработки методом ЭтотОбъект.ПолучитьМакет().
  3. Поочередно считывать области макета с помощью метода ПолучитьОбласть().
  4. Заполнять свойства структуры Параметры у полученных областей.
  5. Выводить заполненные области в результирующий документ методами Вывести() или Присоединить().
  6. Передать готовый результат на клиента и отобразить его через метод Показать().

Типичные ошибки в коде и последовательность выполнения

Посмотрим на пример ошибки, которая часто встречается в коде обработчика команды печати:


&НаКлиенте
Процедура Печать(Команда)
    ПечатьНаСервере();
    Закрыть();
    Макет = ПолучитьМакет();
    Макет.Показать();
КонецПроцедуры

В приведенном фрагменте допущены сразу две логические ошибки:

  1. Преждевременный вызов закрытия формы: вызов метода Закрыть() разрушает контекст текущей формы. Любой последующий код в этой же процедуре либо не выполнится корректно, либо приведет к неожиданному поведению клиентского приложения. Закрытие формы должно выполняться в самом конце процедуры.
  2. Попытка вывода шаблона: функция возвращает непосредственно макет, а не заполненный табличный документ.

Пошаговое решение задачи

Разберем по шагам, как построить взаимодействие между модулем объекта внешней обработки и ее управляемой формой.

Шаг 1. Формирование табличного документа в модуле объекта

Вынесем процедуру компоновки печатного листа в модуль объекта обработки. Это обеспечит чистоту архитектуры и позволит при необходимости вызывать печать не только из формы, но и программно из других мест конфигурации.


Функция СформироватьПечатнуюФорму() Экспорт

    ТабДок = Новый ТабличныйДокумент;
    Макет = ЭтотОбъект.ПолучитьМакет("УПД_литры");

    // Получаем и заполняем область шапки
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    // ОбластьШапка.Параметры.Номер = "001";
    // ОбластьШапка.Параметры.Дата = ТекущаяДатаСеанса();
    ТабДок.Вывести(ОбластьШапка);

    // Вывод строк документа (если есть табличная часть)
    // ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    // ТабДок.Вывести(ОбластьСтрока);

    // Получаем и заполняем область подвала
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ТабДок.Вывести(ОбластьПодвал);

    Возврат ТабДок;

КонецФункции

Шаг 2. Вызов формирования и отображение результата в модуле формы

В модуле управляемой формы связываем серверное получение объекта и клиентский показ. Обратите внимание, что объект ТабличныйДокумент прекрасно сериализуется платформой и без проблем передается с сервера на клиент.


&НаКлиенте
Процедура Печать(Команда)

    // 1. Получаем готовый табличный документ с сервера
    ТабДок = СформироватьНаСервере();

    // 2. Открываем табличный документ в отдельном окне
    ТабДок.Показать("Универсальный передаточный документ");

    // 3. Закрываем текущую форму обработки
    ЭтаФорма.Закрыть();

КонецПроцедуры

&НаСервере
Функция СформироватьНаСервере()

    // Преобразуем данные формы в прикладной объект внешней обработки
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    
    // Вызываем экспортную функцию модуля объекта
    Возврат ОбработкаОбъект.СформироватьПечатнуюФорму();

КонецФункции

Особенности и ограничения платформы

При использовании метода ТабличныйДокумент.Показать() важно учитывать специфику клиентского окружения:

  1. Работа в веб-клиенте: метод Показать() пытается открыть новое окно в интернет-браузере. Если в настройках браузера включена блокировка всплывающих окон (pop-up), окно с печатной формой может быть заблокировано без явного предупреждения. Рекомендуется разрешить всплывающие окна для адреса публикации базы 1С.
  2. Ограниченный интерфейс окна: метод Показать() открывает базовое окно просмотра платформы. В нем нет сервисных механизмов, привычных пользователям типовых конфигураций (например, отправки формы на электронную почту в формате PDF, автоматического добавления факсимиле подписи или сохранения в архив).

Альтернативный вариант: печать через Библиотеку стандартных подсистем (БСП)

Если разработка ведется в современной типовой конфигурации (например, 1C:ERP, УТ, КА, БП), то создавать собственную форму для внешних печатных форм вообще не требуется. Достаточно реализовать стандартный интерфейс БСП:

  1. В модуле объекта определить экспортную функцию СведенияОВнешнейОбработке().
  2. Задать команду с типом ВызовСерверногоМетода или ПечатьФормы.
  3. Определить экспортную процедуру Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода).

В таком случае типовые механизмы БСП автоматически отобразят сформированный ТабличныйДокумент в удобной форме ПечатьДокументов с полноценной панелью управления, реестром отправки и предварительным просмотром перед печатью.

← На главную