Почему отчет СКД не видит изменений и возвращает старые данные?

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

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

Разберем природу этого поведения платформы, выясним первопричину сбоя и рассмотрим проверенные способы решения проблемы.

Причина: совпадение внутреннего идентификатора (UUID) с конфигурацией

Проанализируем типичный сценарий разработки. Очень часто внешний отчет создается путем сохранения уже существующего отчета из состава метаданных конфигурации через команду «Сохранить как внешний отчет». В этом случае платформа копирует внутренний уникальный идентификатор (UUID) объекта метаданных один в один.

В режиме «1С:Предприятие» (особенно при работе в управляемом интерфейсе с использованием Библиотеки стандартных подсистем — БСП) механизмы подсистемы вариантов отчетов сопоставляют открываемый файл по его внутреннему UUID:

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

Способ 1. Смена внутреннего UUID внешнего отчета через выгрузку в файлы

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

Разберем этот процесс по шагам:

  1. Откроем отчет в Конфигураторе.
  2. Выгрузим отчет в каталог файлов (формат исходных текстов 1С) через меню конфигуратора.
  3. Откроем корневой файл описания объекта отчета в текстовом редакторе.
  4. Найдем строку, содержащую тег <uuid>, и заменим старый GUID на любое новое сгенерированное значение.
  5. Сохраним изменения в текстовом редакторе и выполним загрузку отчета обратно из каталога файлов.

После этой процедуры платформа воспримет внешний отчет как абсолютно новый независимый объект и перестанет ассоциировать его со встроенным оригиналом конфигурации.

Способ 2. Пересоздание управляемой формы отчета

Если нет возможности выгружать отчет в файлы, разорвать связь со старыми настройками можно через формы объекта:

  1. Скопируем существующую форму отчета (или форму настроек) внутри этого же внешнего отчета.
  2. Удалим старую форму.
  3. Переименуем скопированную форму, вернув ей исходное имя, и назначим ее основной в свойствах отчета.
  4. В свойствах формы найдем параметр КлючНазначенияИспользования и изменим его значение на произвольную строку. Это разорвет привязку к старым кэшированным настройкам клиента.

Способ 3. Очистка сохраненных настроек в режиме «1С:Предприятие»

Иногда отчет продолжает оперировать старыми данными из-за кэша вариантов, сохраненных под текущим пользователем. Выполним сброс настроек:

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

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


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

Особенности программной передачи Таблицы Значений в СКД

Если проблема с UUID исключена, но СКД по-прежнему не видит изменения в переданной таблице значений, проверим обработчик формирования отчета в модуле объекта.

Рассмотрим правильный шаблон переопределения процедуры ПриКомпоновкеРезультата:


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

Обратим внимание на следующие критические точки этого кода:

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