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