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