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