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