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