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