Как сохранить оборотно-сальдовую ведомость во внешний отчет и устранить ошибку идентификатора объекта метаданных?

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

При попытке сохранить типовой бухгалтерский отчет (например, «Оборотно-сальдовую ведомость по счету») из конфигурации «1С:Бухгалтерия предприятия 3.0» как внешний отчет (.erf) разработчики часто сталкиваются с критической ошибкой при открытии формы:

«Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетоданных() Объект метаданных не найден по полному имени "ВнешнийОтчет.ОборотноСальдоваяВедомостьПоСчету"».

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

Выясним причину ошибки

Разберем внутренние механизмы платформы и Библиотеки стандартных подсистем (БСП), которые вызывают падение программы:

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

Решение 1. Быстрое отключение инициализации БСП в форме

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

В начале процедуры найдем и закомментируем строку вызова подсистемы бухгалтерских отчетов:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Закомментируем вызов типовой подсистемы:
    // БухгалтерскиеОтчетыВызовСервера.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

КонецПроцедуры

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

Важно понимать последствия такого решения: отключение базовой инициализации формы приводит к отключению связанных сервисных механизмов:

  1. Перестает работать типовая расшифровка ячеек (переход в карточку счета, анализ счета, проводки документов).
  2. Не инициализируются стандартные команды печати, отправки по электронной почте и сохранения результата.
  3. Отключается штатное сохранение и переключение вариантов отчета.
  4. Могут сбоить панели выбора субконто и зависимые отборы.

Решение 2. Реализация отчета через расширение конфигурации

Рассмотрим наиболее надежный и рекомендуемый разработчиками способ модификации отчетов в современных версиях 1С. Вместо сохранения в файл .erf отчет переносится в расширение конфигурации.

Разберем по шагам, как это сделать:

  1. Перейдем в меню Конфигурация — Расширения конфигурации и создадим новое расширение с назначением Дополнение или Адаптация.
  2. Добавим в дерево расширения новый отчет или добавим типовой отчет ОборотноСальдоваяВедомостьПоСчету в расширение для доработки.
  3. В отличие от внешних отчетов, у отчетов в расширении есть полноценный модуль менеджера, а метаданные автоматически регистрируются в служебном справочнике ИдентификаторыОбъектовРасширений.
  4. Сохраняем расширение. Основная конфигурация остается на полной поддержке поставщика, а отчет сохраняет все стандартные возможности: расшифровки, работу СКД и типовые команды панели отчетов.

Решение 3. Программная подмена метаданных для сохранения логики БСП

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

Посмотрим на пример адаптации кода в модуле формы внешнего отчета:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Принудительно передаем описание типового отчета из метаданных конфигурации,
    // чтобы служебные функции БСП нашли соответствующий идентификатор
    ЭтаФорма.ОтчетСсылка = Метаданные.Отчеты.ОборотноСальдоваяВедомостьПоСчету;

    БухгалтерскиеОтчетыВызовСервера.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

КонецПроцедуры

Кроме того, если требуется изменить логику формирования отчета, потребуется скопировать методы из модуля менеджера типового отчета в модуль объекта внешнего отчета, а в коде формы заменить обращения к менеджеру на вызовы через РеквизитФормыВЗначение("Отчет").

Решение 4. Программное формирование СКД без вызова общих модулей

Если перед нами стоит задача сделать независимый отчет на базе схемы компоновки данных оборотно-сальдовой ведомости, рассмотрим вариант полного отказа от общих модулей подсистемы БухгалтерскиеОтчеты.

В этом случае вывод результата реализуется в модуле объекта через стандартный программный цикл работы со схемой компоновки данных:


Процедура СформироватьОтчет(ТабличныйДокумент) Экспорт

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

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, );

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);

    ТабличныйДокумент.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры

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

← На главную