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