Как исправить ошибку «Поле объекта не обнаружено» при создании внешнего отчета в 1С:Бухгалтерия 3.0

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

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

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

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

Проблема заключается в следующей строке кода внутри общего модуля:

МенеджерОтчета = Отчеты[БухгалтерскиеОтчеты.ИмяОтчета(Форма)];

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

Решение проблемы: Модификация модуля формы

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

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

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

Перенос логики из модуля менеджера в модуль объекта

В типовых конфигурациях на платформе 8.3 значительная часть логики формирования отчета (построение запроса, установка параметров, обработка расшифровок) вынесена в Модуль менеджера. Однако у внешних отчетов (файлов .erf) модуль менеджера отсутствует как класс — у них есть только модуль объекта и модули форм.

Рассмотрим, как правильно перенести этот код:

  1. Откроем конфигуратор и найдем оригинальный отчет, на базе которого вы создаете внешний.
  2. Скопируем все содержимое его модуля менеджера.
  3. Вставим этот код в Модуль объекта вашего внешнего отчета.
  4. Проанализируем код на наличие ключевого слова МенеджерОтчета. Во внешнем отчете нам нужно заменить такие обращения. Если метод вызывается внутри самого модуля, просто вызывайте его напрямую.
  5. Все экспортные процедуры, которые раньше были в модуле менеджера, теперь должны быть доступны в модуле объекта.

Пример адаптации вызова формирования отчета в модуле объекта:


// В типовом отчете это было в модуле менеджера
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    // Здесь располагается логика настройки СКД
    // Вместо обращения к МенеджерОтчета используем методы текущего объекта
    ИнициализироватьОтчет(ЭтотОбъект); 
КонецПроцедуры

Решение проблем с СКД и виртуальными таблицами

Часто при переносе запроса из типового отчета во внешний, возникает ошибка вида: Поле не обнаружено ХозрасчетныйОборотыДтКт.СубконтоКт2. Разберем ситуацию: в бухгалтерских регистрах поля субконто являются динамическими. Они «появляются» в виртуальных таблицах только тогда, когда система понимает, по каким видам субконто идет обращение. Если вам нужны нестандартные выборки, посмотрите, как реализован срез последних N записей в СКД, это поможет лучше понять работу с компоновкой.

Выясним причину ошибки в СКД:

  1. Проанализируем параметры виртуальной таблицы в схеме компоновки данных.
  2. Найдем параметр ВидыСубконто. Если он не заполнен, платформа не может определить состав полей Субконто1, Субконто2 и т.д.
  3. Убедимся, что в коде при формировании отчета этот параметр передается в запрос. Во внешнем отчете это нужно делать явно через КомпоновщикНастроек.Настройки.ПараметрыДанных.

Использование расширений как альтернатива

Если ваша задача — не просто создать отдельный файл, а модифицировать логику существующего типового отчета (например, «Валовая прибыль»), рассмотрим более современный путь — Расширение конфигурации.

Почему расширение лучше внешнего отчета в данном контексте?

Для реализации через расширение достаточно добавить типовой отчет в расширение и создать в нем процедуру-перехватчик (например, &Вместо для формирования запроса).

Регистрация в системе

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

Для этого в модуле объекта обязательно должна быть функция СведенияОВнешнейОбработке(). Рассмотрим пример минимально необходимой структуры этой функции:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "Отчет");
    ПараметрыРегистрации.Вставить("Наименование", "Анализ продаж (внешний)");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    
    НоваяКоманда = Команды.Добавить();
    НоваяКоманда.Представление = "Открыть отчет";
    НоваяКоманда.Идентификатор = "ОткрытьОтчет";
    НоваяКоманда.Использование = "ОткрытиеФормы";
    
    ПараметрыРегистрации.Вставить("Команды", Команды);
    Возврат ПараметрыРегистрации;
КонецФункции

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

← На главную