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