Почему возникает ошибка «Тип возвращаемого результата процедуры печати должен быть Табличный документ» и как ее исправить?

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

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

Разберем основную причину: Процедура или Функция?

Выясним причину ошибки, исходя из основ языка программирования 1С. Главное различие между процедурой и функцией заключается в том, что функция возвращает значение с помощью оператора Возврат, а процедура — нет. Когда платформа или вызывающий механизм БСП обращается к внешней печатной форме, он ожидает получить объект типа ТабличныйДокумент, чтобы вывести его на экран или отправить на принтер.

Если в модуле объекта внешней обработки основной метод объявлен как Процедура Печать(), то при попытке вызова система не получает никакого результата (фактически возвращается Неопределено). Это и приводит к ошибке типизации. Рассмотрим, как должен выглядеть правильный заголовок метода в простейшем случае:


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

// Правильно:
Функция Печать(МассивОбъектовНазначения, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Код формирования
    Возврат ТабличныйДокумент; // Или заполнение КоллекцияПечатныхФорм в БСП
КонецФункции

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

Проанализируем требования БСП (Библиотеки стандартных подсистем)

В типовых решениях (таких как ERP, УТ 11, БП 3.0) печать реализуется через стандартные механизмы БСП. Здесь крайне важно соблюдать структуру экспортных методов. Рассмотрим по шагам, что должна содержать внешняя печатная форма.

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

Посмотрим на пример правильной реализации метода Печать в модуле объекта:


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

Если в этом коде мы не заполним свойство ТабличныйДокумент в строке коллекции, вызывающий код БСП сочтет, что результат не получен, и выдаст ошибку о несоответствии типа.

Выясним особенности отладки на сервере

Как упоминалось в сообщениях форума, разработка часто ведется в «серверной базе», где отладка кода в модулях объектов внешних обработок может не работать по умолчанию. Это мешает быстро найти место, где «теряется» табличный документ. Разберем, как настроить среду для эффективной работы.

Включение режима отладки на сервере 1С:

Если точки останова не срабатывают, убедимся, что сервер 1С запущен с ключом -debug. В операционной системе Windows это обычно настраивается в реестре в параметре ImagePath службы 1C:Enterprise 8.3 Server Agent. После добавления ключа службу необходимо перезапустить.

Метод "Сообщить" и Журнал регистрации:

Когда полноценная отладка недоступна, используем альтернативные методы. Метод Сообщить() на стороне сервера во время вызова печатной формы из формы документа может не вывести текст пользователю. В этом случае рекомендуется использовать ЗаписьЖурналаРегистрации. Это позволит проверить, заходит ли выполнение в нужные блоки условий и какой тип имеет переменная перед возвратом.


ЗаписьЖурналаРегистрации("ОтладкаВПФ", УровеньЖурналаРегистрации.Информация, , , 
    "Тип документа: " + ТипЗнч(ТабличныйДокумент));

Типичные ошибки при формировании результата

Рассмотрим еще несколько ситуаций, которые приводят к появлению ошибки типа возвращаемого результата:

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

Резюме и план действий

Подводя итог, для устранения ошибки выполним следующие действия:

Соблюдение этих архитектурных правил позволит избежать ошибок типизации и сделает ваши внешние печатные формы совместимыми с любыми типовыми конфигурациями на платформе 1С:Предприятие 8.3.

← На главную