Как правильно передавать дополнительные параметры печати в 1С

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

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

1. Формирование структуры и вызов команды печати на клиенте

В типовых конфигурациях для вызова стандартной формы печати используется процедура УправлениеПечатьюКлиент.ВыполнитьКомандуПечати. Проанализируем пример клиентского кода:


&НаКлиенте
Процедура ПечатьЛистаСогласования()
    ПараметрыПечати = Новый Структура();
    ПараметрыПечати.Вставить("Ответственный", Строка(Объект.Ответственный));
    
    МассивДокументов = Новый Массив;
    МассивДокументов.Добавить(Объект.Ссылка);
    
    УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
        "Справочник.ДокументыПредприятия",
        "ЛистСогласования",
        МассивДокументов,
        ЭтаФорма,
        ПараметрыПечати
    );
КонецПроцедуры

Рассмотрим подробнее назначение параметров метода:

  1. ИмяМенеджераПечати — строковое имя объекта конфигурации, чей модуль менеджера отвечает за печать (например, "Справочник.ДокументыПредприятия").
  2. ИменаМакетов — идентификатор печатной формы (или список идентификаторов через запятую).
  3. МассивОбъектов — массив ссылок на печатаемые объекты.
  4. ВладелецФормы — управляемая форма, из которой инициируется печать (обычно ЭтаФорма).
  5. ПараметрыПечати — структура с произвольными пользовательскими параметрами, которая передается в алгоритм формирования макета.

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

2. Обработка переданных параметров на стороне сервера

В зависимости от того, где именно реализован алгоритм формирования печатной формы (в модуле менеджера объекта метаданных или во внешней печатной форме), порядок и состав параметров обработчика печати различаются. Это частая причина ошибок вида «Недостаточно фактических параметров».

Вариант А: Печать через модуль менеджера встроенного объекта

В модуле менеджера объекта (документа или справочника) экспортная процедура печати БСП принимает пять параметров, где структура ПараметрыПечати располагается второй по счету:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Проверяем наличие переданного параметра
    ОтветственныйСтрокой = "";
    Если ПараметрыПечати <> Неопределено И ПараметрыПечати.Свойство("Ответственный", ОтветственныйСтрокой) Тогда
        // Используем полученное значение при заполнении параметров макета
    КонецЕсли;
    
КонецПроцедуры

Вариант Б: Внешняя печатная форма (ВПФ)

Для внешних обработок печати стандартная сигнатура БСП состоит из четырех параметров:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Параметры печати в ВПФ передаются через структуру ПараметрыВывода или реквизиты обработки
КонецПроцедуры

3. Почему типовая печатная форма не выводит переданный параметр

Выясним причину, по которой параметр, успешно отправленный через ВыполнитьКомандуПечати, может не отображаться в макете. Передача структуры лишь доставляет данные в серверную процедуру. Стандартный типовой алгоритм листа согласования формирует данные на основании реквизитов документа и записей регистров. Типовой код не ожидает ключ "Ответственный" и попросту игнорирует его.

Чтобы параметр действительно вывелся, необходимо модифицировать заполнение табличного документа одним из способов:

  1. Доработка через расширение: перехватить процедуру формирования листа согласования аннотацией &Вместо, &После или &ИзменениеИКонтроль, прочитав значение из структуры ПараметрыПечати.
  2. Переопределяемый модуль: использовать экспортную процедуру ПриПечати общего модуля УправлениеПечатьюПереопределяемый. В ней доступны параметры КоллекцияПечатныхФорм и ПараметрыПечати, что позволяет найти готовый ТабличныйДокумент в коллекции и скорректировать нужные ячейки перед отправкой на экран.

4. Низкоуровневый запуск формирования печати и контроль фоновых заданий

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


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

Для проверки состояния фонового задания на сервере используется следующий метод:


&НаСервереБезКонтекста
Функция ЗаданиеЕщеВыполняетсяНаСервере(ИдентификаторЗадания)
    Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
    Возврат (Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно);
КонецФункции

Таким образом, для корректной передачи дополнительных параметров достаточно упаковать их в структуру простых сериализуемых типов, передать пятым параметром в УправлениеПечатьюКлиент.ВыполнитьКомандуПечати и явно извлечь их во втором параметре ПараметрыПечати в процедуре Печать модуля менеджера объекта.

← На главную