При разработке дополнительных отчетов на схеме компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией: в консоли отчетов или при автономном тестировании схема работает идеально, но стоит подключить отчет к базе данных через стандартную общую форму конфигурации (например, ФормаОтчета в «1С:Розница 2.2» или других конфигурациях на базе БСП), как начинается непредвиденное поведение. Пользователь указывает на форме определенный период или отбор, запускает формирование (которое часто выполняется в фоновом задании), однако в сформированном результате значения параметров выводятся совсем другими либо сбрасываются вовсе.
Проанализируем детально архитектурные причины возникновения этой неполадки и разберем по шагам, как быстро восстановить корректную работу отчета.
В типовых конфигурациях 1С, использующих Библиотеку стандартных подсистем (БСП), работа отчетов тесно связана с подсистемой вариантов отчетов. Когда пользователь открывает отчет, система производит сопоставление структуры СКД с ранее сохраненными настройками.
Рассмотрим ключевые механизмы, которые приводят к сбою:
ИдентификаторПользовательскойНастройки. Каждый параметр или элемент отбора, вынесенный в состав пользовательских настроек, получает уникальный внутренний идентификатор (GUID). Если разработчик в процессе доработки отчета удалял параметры, создавал их заново или менял структуру настроек, платформа создавала новые идентификаторы. В базе данных при этом остаются сохраненные пользовательские настройки со старыми GUID. При вызове метода КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки() платформа не может сопоставить новые элементы со старыми и подставляет либо значения по умолчанию, либо пустые значения.ХранилищеВариантовОтчетов и справочнике ВариантыОтчетов. Если внешний отчет загружается повторно под тем же метаданным именем, подсистема восстанавливает закэшированный вариант по ключу отчета и накладывает его поверх обновленной СКД.ПользовательскиеНастройки над веткой Настройки. В объекте КомпоновщикНастроекКомпоновкиДанных параллельно присутствуют две структуры. При выполнении компоновки макета через метод КомпоновщикМакета.Выполнить() значения из коллекции КомпоновщикНастроек.ПользовательскиеНастройки обладают безусловным приоритетом и перекрывают значения, заданные в основной ветке Настройки.Самый простой и действенный путь избавиться от конфликта идентификаторов — очистить закэшированные варианты.
Разберем по шагам, как это сделать:
Если сбросить настройки через интерфейс не удается или требуется очистить кэш сразу у всех пользователей информационной базы, применим встроенные возможности платформы 1С.
Посмотрим на пример программного удаления настроек отчета через объект ХранилищеВариантовОтчетов:
КлючОбъекта = "ВнешнийОтчет.МойНовыйОтчет";
ХранилищеВариантовОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);
Если в конфигурации используется типовая БСП, можно воспользоваться методами подсистемы вариантов отчетов:
КлючОтчета = "ВнешнийОтчет.МойНовыйОтчет";
ВариантыОтчетов.СброситьПользовательскиеНастройки(КлючОтчета);
В процессе активной отладки схемы компоновки данных можно избежать наложения старых кэшированных вариантов путем переименования.
Рассмотрим, как это реализовать:
Если требуется жестко зафиксировать применение переданных параметров при компоновке результата, откроем модуль объекта отчета и переопределим обработчик ПриКомпоновкеРезультата.
Посмотрим на пример кода:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Синхронизируем пользовательские настройки с основными настройками компоновщика
КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроек.ПолучитьНастройки());
КонецПроцедуры
Если же параметры не должны зависеть от действий пользователя и сохраненных вариантов вовсе, перенесем их в коллекцию ФиксированныеНастройки. Параметры, добавленные в КомпоновщикНастроек.ФиксированныеНастройки, имеют высший приоритет в системе компоновки данных и не перезаписываются механизмами автосохранения БСП.