Как программно распечатать внешнюю печатную форму в 1С:Предприятие?

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача программного формирования и печати документов. Если со встроенными печатными формами всё достаточно прозрачно — мы вызываем менеджер объекта или специализированные модули печати, то с внешними печатными формами (ВПФ) ситуация сложнее. Внешние формы хранятся в справочниках (например, ДополнительныеОтчетыИОбработки), и для их запуска требуется соблюдение определенных протоколов взаимодействия, предусмотренных Библиотекой стандартных подсистем (БСП) или старыми универсальными механизмами.

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

Решение для конфигураций на обычных формах (Универсальные механизмы)

В старых редакциях конфигураций (например, «Бухгалтерия предприятия 2.0», «Управление производственным предприятием 1.3») работа с внешними печатными формами реализована через общий модуль УниверсальныеМеханизмы. Рассмотрим ситуацию, когда нам нужно найти форму в дереве доступных макетов и распечатать её.

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


// Получаем дерево всех доступных макетов для документа
ДеревоМакетовПечати = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(СсылкаНаДокумент, Неопределено);

// Ищем строку с нашей внешней печатной формой по её названию
СтрокаКнопки = ДеревоМакетовПечати.Строки.Найти("ИМЯ-ВАШЕГО-МАКЕТА", "Текст");

Если СтрокаКнопки <> Неопределено Тогда
    // В расшифровке строки хранится структура с параметрами внешней обработки
    Расшифровка = СтрокаКнопки.Расшифровка;
    
    Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
        // Вызываем штатную функцию печати внешней формы
        ТабДокумент = УниверсальныеМеханизмы.НапечататьВнешнююФорму(СсылкаНаДокумент, Расшифровка);
        
        // Показываем результат пользователю
        ТабДокумент.Показать();
    КонецЕсли;
КонецЕсли;

В данном примере функция ПолучитьДеревоМакетовПечати возвращает структуру всех кнопок печати, которые видит пользователь. Мы имитируем выбор пользователя, находя нужную строку. Метод НапечататьВнешнююФорму берет на себя всю работу по извлечению обработки из хранилища и её запуску.

Программная печать в управляемых формах (БСП 2.0 - 3.0)

В современных конфигурациях, таких как «Зарплата и управление персоналом 3.1», «Бухгалтерия предприятия 3.0» или «ERP 2.5», внешние печатные формы регистрируются в справочнике ДополнительныеОтчетыИОбработки. Механизм работы здесь в корне отличается от старых версий. Нам необходимо взаимодействовать с менеджером этого справочника или специализированными методами БСП.

Рассмотрим серверный метод формирования табличного документа. Этот способ удобен, если вам нужно получить ТабличныйДокумент для дальнейшей отправки по почте или сохранения в файл без участия пользователя.


&НаСервереБезКонтекста
Процедура ПечатьВнешнейФормыНаСервере(ИмяВПФ, СсылкаНаДокумент)
    // 1. Находим ссылку на внешнюю обработку в справочнике
    СсылкаНаВПФ = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяВПФ);
    
    Если СсылкаНаВПФ.Пустая() Тогда
        ВызватьИсключение "Внешняя печатная форма не найдена!";
    КонецЕсли;

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

Здесь важно отметить, что внешняя обработка должна соответствовать стандартам БСП. Это значит, что в её модуле объекта должна присутствовать процедура Печать с соответствующими параметрами. Если вы используете конфигурации типа ЗУП 3.0 или вам нужно вывести счет из расходной накладной, может потребоваться использование метода ДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику.

Открытие стандартного окна печати из кода (Клиентский метод)

Иногда требуется не просто получить табличный документ «в тишине», а полностью имитировать действия пользователя, чтобы открылась стандартная форма 1С «Печать документов» с кнопками выбора принтера, количества копий и предпросмотром. Для этого в БСП существуют служебные клиентские методы.

Рассмотрим пример вызова через УправлениеПечатьюСлужебныйКлиент:


&НаКлиенте
Процедура ВыполнитьПечатьВПФ(ИмяВПФ, ИдентификаторКоманды, СсылкаНаДокумент, Форма)
    // Поиск ссылки на ВПФ (лучше делать на сервере или использовать кэширование)
    СсылкаНаВПФ = НайтиВПФНаСервере(ИмяВПФ);
    
    ОбъектыНазначения = Новый Массив;
    ОбъектыНазначения.Добавить(СсылкаНаДокумент);
    
    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
    ДополнительныеПараметры.Вставить("ИсточникДанных", СсылкаНаВПФ);
    ДополнительныеПараметры.Вставить("Форма", Форма);
    
    // Вызов штатного завершения формирования печатной формы
    УправлениеПечатьюСлужебныйКлиент.ВыполнитьОткрытиеПечатнойФормыЗавершение(ОбъектыНазначения, ДополнительныеПараметры);
КонецПроцедуры

Этот способ является наиболее «чистым» с точки зрения архитектуры БСП, так как он задействует все стандартные механизмы проверок, регистрации событий печати и формирования интерфейса. ИдентификаторКоманды — это внутреннее имя команды, которое указывается при регистрации внешней обработки (обычно совпадает с именем макета).

Низкоуровневый метод для нестандартных ситуаций

Если конфигурация сильно изменена или вы работаете с отраслевым решением (например, от ВДГБ), стандартные модули могут отсутствовать или работать иначе. В таком случае можно прибегнуть к универсальному методу (для отладки пригодится консоль кода с ИИ): программное извлечение файла обработки во временный каталог и ручной запуск метода печати.

Разберем этот алгоритм подробнее:

  1. Находим внешнюю обработку в справочнике.
  2. Извлекаем двоичные данные файла из хранилища.
  3. Записываем данные во временный файл с расширением .epf.
  4. Подключаем файл через ВнешниеОбработки.Создать().
  5. Передаем в созданный объект контекст документа и вызываем процедуру формирования макета.

// Пример упрощенной логики
ИмяФайла = КаталогВременныхФайлов() + "temp_vpf.epf";
ДвоичныеДанные = СсылкаНаВПФ.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);

Обработка = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
// Если обработка требует передачи объекта документа
Обработка.СсылкаНаОбъект = СсылкаНаДокумент; 

ТабДок = Обработка.Печать(); // Вызов функции печати в обработке
ТабДок.Показать();

Внимание: при использовании этого метода помните о безопасности. В современных версиях платформы работа с внешними файлами может быть ограничена профилями безопасности или требовать подтверждения пользователя.

Дополнительные возможности и автоматизация

Выясним, какие еще задачи можно решить при программном доступе к ВПФ:

1. Тихая печать напрямую на принтер. Если вам нужно отправить документ на печать без вывода на экран, используйте метод табличного документа ТабДокумент.Напечатать(РежимИспользованияПринтера.Использовать). Это особенно актуально для автоматизации складов или торговых точек.

2. Сохранение в PDF. Программный вызов ВПФ часто используется для автоматической рассылки счетов или актов клиентам — для этого подойдёт обработка программного формирования и массовой рассылки печатных форм. Получив ТабличныйДокумент, мы можем сохранить его одной строчкой: ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF).

3. Массовое формирование. Передавая в массив ОбъектыНазначения не одну ссылку, а целый список документов, вы можете получить один сводный табличный документ или коллекцию документов, что значительно ускоряет процесс обработки данных по сравнению с поштучным вызовом кнопок в интерфейсе.

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

← На главную