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