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