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