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