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