Как программно найти и распечатать любую печатную форму в 1С?

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

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

Как найти все объекты, у которых есть печатные формы

Первый вопрос, который возникает у разработчика: как понять, для каких документов или справочников в системе предусмотрена печать? В БСП регистрация команд печати происходит программно в модуле менеджера каждого объекта. Рассмотрим, как мы можем собрать эту информацию.

Для получения списка команд печати конкретного объекта используется метод УправлениеПечатью.КомандыПечатиОбъекта(). Чтобы составить глобальный список по всей конфигурации, нам придется выполнить обход метаданных. Проанализируем пример кода, который перебирает документы:


// Массив для хранения имен объектов, поддерживающих печать
ОбъектыСПечатью = Новый Массив;

Для Каждого МетаданныеДокумента Из Метаданные.Документы Цикл
    // Пытаемся получить команды печати для текущего типа документа
    КомандыПечати = УправлениеПечатью.КомандыПечатиОбъекта(МетаданныеДокумента.Имя);
    
    Если КомандыПечати.Количество() > 0 Тогда
        ОбъектыСПечатью.Добавить(МетаданныеДокумента.ПолноеИмя());
    КонецЕсли;
КонецЦикла;

Стоит учитывать, что метод КомандыПечатиОбъекта возвращает только те команды, которые зарегистрированы через стандартный механизм ДобавитьКомандыПечати в модуле менеджера. Если печать реализована «кустарным» способом через добавление кнопки прямо на форму, БСП о ней знать не будет.

Поиск внешних печатных форм

Не забудем и про дополнительные (внешние) печатные формы. Они хранятся в справочнике ДополнительныеОтчетыИОбработки. Чтобы найти формы, привязанные к объекту, нужно анализировать табличную часть Назначение этого справочника. Выясним причину, почему это важно: зачастую пользователи используют именно внешние макеты для специфических нужд бизнеса, и универсальная обработка должна их учитывать.

Для получения списка внешних печатных форм можно использовать запрос к справочнику ДополнительныеОтчетыИОбработки, фильтруя по полю Вид (значение Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма) и проверяя наличие ссылки на нужный тип метаданных в табличной части назначения.

Как программно запустить печать выбранной формы

Когда мы уже знаем Ссылку на объект и Идентификатор печатной формы (ее имя), нам нужно вывести результат пользователю. Здесь есть два основных пути в зависимости от того, хотим ли мы просто получить данные или показать стандартное окно предпросмотра.

Способ 1: Использование клиентского метода БСП

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


// Параметры для вызова:
// ИмяМенеджераПечати - например, "Документ.РеализацияТоваровУслуг"
// ИменаФорм - идентификатор печатной формы (строка или массив строк)
// ОбъектыНазначения - массив ссылок на документы
// ВладелецФормы - форма, из которой вызывается печать

УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
    "Документ.СчетНаОплатуПокупателю", 
    "СчетЗаказ", 
    МассивСсылок, 
    ЭтаФорма
);

Этот метод является наиболее "правильным" с точки зрения БСП, так как он автоматически обрабатывает и встроенные, и внешние печатные формы, а также корректно работает с правами доступа пользователя.

Способ 2: Прямое формирование Табличного Документа на сервере

Иногда требуется получить печатную форму "тихо" (например, для программного формирования PDF-файла) или отобразить её в своем поле на форме обработки. В этом случае рассмотрим серверный метод УправлениеПечатью.СформироватьПечатныеФормы().

Посмотрим на пример работы с этим методом:


// Подготовим переменные
ИмяМенеджераПечати = "Документ.РеализацияТоваровУслуг";
ИменаМакетов = "ПОРС"; // Идентификатор формы
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
ПараметрыПечати = Новый Структура;

// Вызываем формирование
Результат = УправлениеПечатью.СформироватьПечатныеФормы(
    ИмяМенеджераПечати, 
    ИменаМакетов, 
    МассивОбъектов, 
    ПараметрыПечати
);

// В переменной Результат.КоллекцияПечатныхФорм будет лежать таблица
// В колонке "ТабличныйДокумент" будет находиться сам результат
Если Результат.КоллекцияПечатныхФорм.Количество() > 0 Тогда
    МойТабДок = Результат.КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецЕсли;

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

Особенности работы с расширениями и правами доступа

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

Также стоит помнить о правах доступа. Стандартные методы БСП фильтруют список доступных печатных форм согласно правам текущего пользователя. Если ваша задача — вывести форму в привилегированном режиме, стандартные методы УправлениеПечатьюКлиент могут не подойти, и придется обращаться к модулям менеджера напрямую через ВыполнитьПроцедуруМодуляМенеджера или аналогичные механизмы.

Итоги

Для реализации универсальной печати в 1С мы рекомендуем придерживаться следующего алгоритма:

  1. Использовать УправлениеПечатью.КомандыПечатиОбъекта для получения списка доступных форм (идентификаторов).
  2. Для интерактивного вывода применять УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.
  3. Для получения табличного документа "в коде" использовать УправлениеПечатью.СформироватьПечатныеФормы.
  4. Не забывать про проверку наличия внешних печатных форм в справочнике ДополнительныеОтчетыИОбработки.

Такой подход обеспечит совместимость вашего решения с обновлениями конфигурации и позволит корректно работать со всеми стандартными механизмами 1С.

← На главную