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