Почему в отчете на СКД неверно применяются параметры и отборы из пользовательских настроек?

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

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

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

Выясним причину: почему подменяются параметры

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

Рассмотрим ключевые механизмы, которые приводят к сбою:

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

Способ 1. Сброс и удаление сохраненных вариантов (Основное решение)

Самый простой и действенный путь избавиться от конфликта идентификаторов — очистить закэшированные варианты.

Разберем по шагам, как это сделать:

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

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

Если сбросить настройки через интерфейс не удается или требуется очистить кэш сразу у всех пользователей информационной базы, применим встроенные возможности платформы 1С.

Посмотрим на пример программного удаления настроек отчета через объект ХранилищеВариантовОтчетов:


КлючОбъекта = "ВнешнийОтчет.МойНовыйОтчет";
ХранилищеВариантовОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);

Если в конфигурации используется типовая БСП, можно воспользоваться методами подсистемы вариантов отчетов:


КлючОтчета = "ВнешнийОтчет.МойНовыйОтчет";
ВариантыОтчетов.СброситьПользовательскиеНастройки(КлючОтчета);

Способ 3. Смена имени отчета или идентификатора варианта

В процессе активной отладки схемы компоновки данных можно избежать наложения старых кэшированных вариантов путем переименования.

Рассмотрим, как это реализовать:

  1. В конфигураторе откройте свойства внешнего отчета и измените его реквизит Имя (например, добавив суффикс версии).
  2. Либо в самой схеме компоновки данных перейдите на вкладку Настройки и измените имя варианта отчета.
  3. Загрузите отчет в базу данных заново. Платформа воспримет его как совершенно новый объект и сформирует чистую структуру пользовательских настроек без устаревших привязок.

Способ 4. Принудительная синхронизация настроек в модуле отчета

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

Посмотрим на пример кода:


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

Если же параметры не должны зависеть от действий пользователя и сохраненных вариантов вовсе, перенесем их в коллекцию ФиксированныеНастройки. Параметры, добавленные в КомпоновщикНастроек.ФиксированныеНастройки, имеют высший приоритет в системе компоновки данных и не перезаписываются механизмами автосохранения БСП.

← На главную