Как сделать внешний отчет из типового в 1С и исправить ошибки метаданных?

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

При попытке сохранить типовой отчет из современных конфигураций 1С (особенно построенных на базе БСП — Библиотеки стандартных подсистем, таких как «Бухгалтерия предприятия 3.0», «ERP Управление предприятием», «Управление торговлей 11») в виде внешнего файла (.erf), разработчики часто сталкиваются с аппаратными ошибками. Система отказывается формировать отчет, выдавая сообщения вида «Неизвестный тип объекта метаданных "ВнешнийОтчет..."» или «Получение элемента по индексу для значения не определено». В этой статье мы подробно разберем причины возникновения этих ошибок и рассмотрим несколько практических способов их решения.

Выясним причину: почему типовой отчет не работает как внешний?

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

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

Рассмотрим по шагам четыре эффективных способа решения этой проблемы — от быстрой настройки «обхода» до правильной современной разработки.

Способ 1. Быстрый «обман» системы (Подмена идентификатора)

Если вам нужно запустить внешний отчет в кратчайшие сроки, внеся минимальные изменения в код, мы можем принудительно заставить систему думать, что она работает с оригинальным встроенным отчетом.

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

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

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


ПараметрыОтчета.СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Способ 2. Использование расширения конфигурации (Рекомендуемый метод)

Начиная с платформы 1С v8.3, для модификации типовых отчетов настоятельно рекомендуется использовать механизм расширений, а не создавать разрозненные внешние файлы .erf. Это избавит вас от необходимости переписывать код БСП.

Разберем алгоритм работы с расширением:

  1. Создадим новое расширение конфигурации в режиме Конфигуратора (меню Конфигурация -> Расширения конфигурации).
  2. Найдем в дереве метаданных основной конфигурации нужный типовой отчет (например, ЗадолженностьПоставщикам).
  3. Нажмем по нему правой кнопкой мыши и выберем пункт «Добавить в расширение».
  4. Внутри расширения мы можем безопасно изменять схему компоновки данных (СКД), добавлять собственные макеты, изменять формы и переопределять процедуры модуля менеджера с помощью аннотаций &Вместо, &Перед или &После.

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

Способ 3. Перенос логики во внешний отчет (Полная автономность)

Если перед вами стоит задача сделать полностью автономный внешний отчет (например, для передачи заказчику без изменения его базы данных), придется полностью отвязать логику отчета от вызовов общих модулей, завязанных на метаданные.

Разберем этот процесс подробно:

  1. Откроем модуль менеджера оригинального встроенного отчета в конфигураторе.
  2. Скопируем все экспортные функции, отвечающие за инициализацию параметров (например, ПустыеПараметрыКомпоновкиОтчета, ПодготовитьПараметрыОтчета), и перенесем их в Модуль объекта нашего внешнего отчета.
  3. В модуле формы внешнего отчета исправим вызовы этих функций. Вместо обращения через менеджер: ПараметрыОтчета = МенеджерОтчета.ПустыеПараметрыКомпоновкиОтчета(); Напишем прямое обращение к методам самого объекта отчета:
    
    ПараметрыОтчета = РеквизитФормыВЗначение("Отчет").ПустыеПараметрыКомпоновкиОтчета();
    
  4. Полностью закомментируем обращения к процедурам общего модуля БухгалтерскиеОтчетыВызовСервера, которые пытаются получить доступ к коллекции Отчеты[Идентификатор]. Вместо этого реализуем стандартный вывод отчета в табличный документ через программную инициализацию процессора компоновки данных.

Способ 4. Регистрация в справочнике «Дополнительные отчеты и обработки»

Если запускать внешний отчет интерактивно через меню Файл -> Открыть, контекст его выполнения будет сильно ограничен. Чтобы отчет корректно инициализировал свои параметры и окружение БСП, его рекомендуется внедрить в информационную базу как дополнительный отчет.

Для этого выполним следующие действия:

  1. В модуле объекта внешнего отчета создадим обязательную экспортную функцию СведенияОВнешнейОбработке():
    
    Функция СведенияОВнешнейОбработке() Экспорт
        ПараметрыРегистрации = Новый Структура;
        ПараметрыРегистрации.Вставить("Вид", "ДополнительныйОтчет");
        ПараметрыРегистрации.Вставить("Наименование", "Задолженность поставщикам (внешний)");
        ПараметрыРегистрации.Вставить("Версия", "1.0");
        ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
        
        ТаблицаКоманд = Новый ТаблицаЗначений;
        ТаблицаКоманд.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
        ТаблицаКоманд.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
        ТаблицаКоманд.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
        
        НоваяСтрока = ТаблицаКоманд.Добавить();
        НоваяСтрока.Представление = "Открыть отчет";
        НоваяСтрока.Идентификатор = "ОткрытьОтчет";
        НоваяСтрока.Использование = "ОткрытиеФормы";
        
        ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
        Возврат ПараметрыРегистрации;
    КонецФункции
    
  2. Сохраним отчет.
  3. В режиме «1С:Предприятие» перейдем в раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  4. Добавим новый элемент, загрузив наш файл .erf, и настроим для него разделы командного интерфейса и права доступа.

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

← На главную