Как программно выполнить внешнюю печатную форму на управляемых формах 1С?

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

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

Анализ проблемы: почему старый код не работает

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

Рассмотрим основные причины сбоев:

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

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

Решение 1: Вызов печатной формы по стандарту БСП

Если ваша конфигурация современная (УТ 11, БП 3.0, ERP 2.5 и др.), то внешние печатные формы хранятся в справочнике ДополнительныеОтчетыИОбработки. Вместо того чтобы вручную извлекать двоичные данные и создавать файл, правильнее использовать штатные механизмы подсистемы управления печатью.

Рассмотрим по шагам, как программно сформировать печатную форму через БСП:


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

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

КонецПроцедуры

Решение 2: Ручное создание объекта внешней обработки

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


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Логика формирования табличного документа
КонецПроцедуры

Рассмотрим, как изменить ваш код, чтобы он заработал. Вместо установки свойства ПечатнаяФорма.СсылкаНаОбъект = ДокументОбъект, мы должны подготовить параметры и передать их в метод Печать.

Проанализируем исправленный алгоритм:

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

Пример кода для реализации этого подхода:


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

Важные технические нюансы

Безопасный режим и профили: Если внешняя печатная форма обращается к методам, запрещенным в безопасном режиме (например, запись файла в произвольный каталог или работа с COM-объектами), выполнение прервется. Если вы вызываете ВнешниеОбработки.Создать() с параметром БезопасныйРежим = Истина, убедитесь, что код обработки адаптирован под эти ограничения.

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

Отладка "пустых" ошибок: Если в блоке Исключение вы получаете пустое описание, это часто означает, что ошибка произошла на уровне ядра платформы при попытке вызова метода. Проверьте:

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

← На главную