Почему отчет на СКД в конфигурации формирует старые данные и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и доработке отчетов на базе системы компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией: внешний отчет (файл с расширением .erf) формирует данные корректно, однако после его переноса или загрузки схемы в дерево метаданных конфигурации отчет в режиме «1С:Предприятие» продолжает выдавать устаревший результат. Очистка локального клиентского кэша и перезапуск сервера при этом часто не дают нужного эффекта.

Разберем детально, почему платформа сохраняет старое поведение отчета и какими способами можно гарантированно обновить схему и применить актуальные настройки.

Причина проблемы: как 1С хранит настройки вариантов отчетов

Главная причина расхождения результатов кроется в механизме идентификации и наложения пользовательских настроек:

  1. Идентификация по имени отчета и варианта. Платформа 1С сохраняет пользовательские настройки компоновщика, ориентируясь на связку ИмяОтчета + ИмяВарианта. При запуске встроенного отчета система ищет ранее сохраненный слепок настроек и автоматически накладывает его поверх исходной схемы из макета СКД. Если структура полей, группировок или формул ресурсов изменилась, наложенные старые настройки приводят к неверным расчетам.
  2. Подсистема «Варианты отчетов» в БСП. В типовых конфигурациях на базе Библиотеки стандартных подсистем встроенные отчеты регистрируются в служебных справочниках (Справочник.ВариантыОтчетов и Справочник.ПредопределенныеВариантыОтчетов). При обычном обновлении конфигурации данные в этих справочниках не всегда обновляются автоматически, из-за чего отчет использует устаревшие настройки предопределенного варианта. Внешний же отчет или отчет из справочника ДополнительныеОтчетыИОбработки обращается к схеме напрямую из файла.
  3. Специализированные хранилища настроек. Помимо стандартного ХранилищеСистемныхНастроек, платформа использует системные объекты ХранилищеВариантовОтчетов и ХранилищеПользовательскихНастроекОтчетов, которые не очищаются при простом удалении локального кэша сеанса.

Способ 1. Сброс настроек отчета в пользовательском режиме

Проанализируем первый шаг, который необходимо выполнить в пользовательском интерфейсе:

  1. Откроем проблемный отчет в режиме «1С:Предприятие».
  2. Нажмем кнопку Еще в командной панели формы отчета.
  3. Выберем команду Установить стандартные настройки (или перейдем в меню вариантов и выберем возврат к стандартным настройкам схемы).
  4. После сброса переформируем отчет и сохраним текущую настройку как основной вариант.

Если в схеме были кардинально изменены ресурсы или вычисляемые поля, этого шага может быть недостаточно из-за сохраненных настроек на уровне БСП или платформенных хранилищ.

Способ 2. Принудительное обновление предопределенных вариантов БСП

Если конфигурация использует Библиотеку стандартных подсистем, выполним обновление таблиц предопределенных вариантов отчетов программно. Для этого запустим внешнюю обработку или клиентскую консоль кода с полными правами:


// Принудительное обновление описания предопределенных вариантов БСП
ВариантыОтчетов.ОбновитьПредопределенныеВариантыОтчетов();

Этот вызов заново считает макеты СКД из дерева метаданных конфигурации и обновит служебные записи в справочниках ВариантыОтчетов и ПредопределенныеВариантыОтчетов.

Способ 3. Программная очистка хранилищ настроек отчета

Разберем, как полностью удалить сохраненные слепки отчета для конкретного пользователя или по всей базе. Очистку необходимо производить по объектам ХранилищеВариантовОтчетов и ХранилищеПользовательскихНастроекОтчетов:


ИмяОтчета = "Отчет.НашОтчетПоПродажам";
ИмяПользователя = ИмяПользователя();

// Удаление сохраненных вариантов отчета
ХранилищеВариантовОтчетов.Удалить(ИмяОтчета, Неопределено, ИмяПользователя);

// Удаление пользовательских настроек компоновщика
ХранилищеПользовательскихНастроекОтчетов.Удалить(ИмяОтчета, Неопределено, ИмяПользователя);

// Очистка системных настроек формы
ХранилищеСистемныхНастроек.Удалить(ИмяОтчета, Неопределено, ИмяПользователя);

Параметр Неопределено во втором аргументе метода Удалить() указывает платформе на необходимость очистки всех ключей настроек, привязанных к данному объекту метаданных.

Способ 4. Проверка модулей отчета и программной инициализации СКД

Если в отчете используется собственная форма или переопределен модуль объекта, проверим код на наличие явного переопределения схемы компоновки данных. Обратим внимание на событие ПриКомпоновкеРезультата в модуле объекта:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Если схема или макет загружаются программно:
    // СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    // КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    
КонецПроцедуры

Если в коде выполняется ручная инициализация КомпоновщикНастроек без учета новых настроек по умолчанию, отчет будет игнорировать изменения, внесенные в конструкторе СКД. Убедимся, что при модификации схемы компоновщик корректно загружает актуальные настройки через КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию).

Способ 5. Сброс кэша структуры метаданных на сервере

В случаях, когда конфигурация базы данных обновлялась динамически («демо-обновление»), рабочий процесс rphost сервера 1С может удерживать скомпилированный макет СКД в оперативной памяти. Для решения проблемы:

  1. Внесем незначительное изменение в свойства отчета в конфигураторе (например, отредактируем поле «Комментарий»).
  2. Выполним полноценное обновление конфигурации базы данных (клавиша F7) в монопольном режиме.
  3. Если проблема сохраняется, перезапустим службу кластера серверов 1C:Enterprise Server с очисткой серверного каталога кэша метаданных (snccntx).
← На главную