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