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