При разработке и отладке внешних отчетов на базе подсистемы «Варианты отчетов» Библиотеки стандартных подсистем (БСП) в конфигурациях уровня 1С:ERP разработчики часто сталкиваются с неприятной особенностью платформы и СКД. Если для параметра отчета включен признак Использовать список значений и значение выведено на панель быстрых настроек, попытка полностью очистить список часто приводит к его повторному появлению при следующем открытии отчета. Проанализируем, почему это происходит и как гарантированно сбросить сохраненные настройки.
Разберем внутренний механизм платформы 1С:Предприятие и типовой подсистемы БСП, который приводит к этой проблеме:
СписокЗначений становится пустым. В механизмах компоновки данных и наложения пользовательских настроек БСП полностью пустая коллекция зачастую интерпретируется как отсутствие изменений. Платформа считает, что настройка не была переопределена, и автоматически восстанавливает ранее сохраненное значение из хранилища.Администрирование -> Обслуживание) ориентированы в первую очередь на встроенные метаданные конфигурации. Ключи настроек внешних отчетов формируются динамически (например, по пути ВнешнийОтчет.<ИмяОтчета> или с использованием GUID дополнительной обработки) и стандартными процедурами очистки могут игнорироваться.Для гарантированного удаления зависших настроек конкретного внешнего отчета необходимо обратиться напрямую к объекту ХранилищеСистемныхНастроек. Выясним, как правильно выполнить удаление данных параметров.
Вместо полной очистки всех настроек пользователя воспользуемся точечным удалением ветки нужного отчета:
// Укажем имя внешнего отчета так, как оно зарегистрировано в системе
ИмяОтчета = "ВнешнийОтчет.ИмяВашегоОтчета";
ИмяПользователя = "ИмяПользователя"; // или Неопределено для текущего сеанса
// Удаляем настройки конкретного отчета
ХранилищеСистемныхНастроек.Удалить(ИмяОтчета, Неопределено, ИмяПользователя);
Если точный ключ неизвестен, можно временно очистить системные настройки полностью (например, в тестовой базе):
ХранилищеСистемныхНастроек.Удалить(Неопределено, Неопределено, Неопределено);
Важное условие: после выполнения программного кода очистки обязательно перезапустите сеанс 1С:Предприятия. Если используется клиент-серверный вариант работы, может потребоваться перезапуск сеанса на сервере 1С или перезапуск службы сервера, чтобы полностью сбросить кэш сеанса в оперативной памяти.
Если требуется гарантировать, что параметр всегда открывается чистым либо принудительно сбрасывается при компоновке, переопределим его в модуле отчета в событии ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Поиск параметра в основных настройках компоновщика
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ИмяПараметра"));
Если ПараметрСКД <> Неопределено Тогда
Если ПараметрСКД.Значение.Количество() = 0 Тогда
ПараметрСКД.Использование = Ложь;
КонецЕсли;
КонецЕсли;
// Проверка и сброс в коллекции пользовательских настроек
Для Каждого ЭлементНастройки Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
Если ЭлементНастройки.Параметр = Новый ПараметрКомпоновкиДанных("ИмяПараметра") Тогда
Если ЭлементНастройки.Значение.Количество() = 0 Тогда
ЭлементНастройки.Использование = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Такой подход отключает использование параметра, если в списке нет значений, предотвращая наложение старых данных из кэша.
Рассмотрим альтернативное архитектурное решение. Механизм списков значений в параметрах данных СКД исторически чувствителен к пустым коллекциям. Если параметр используется исключительно для фильтрации строк в запросе, рекомендуется перенести условие на вкладку Отбор схемы компоновки данных:
В списке.Механизм отборов платформы 1С корректно обрабатывает флаг включения отбора: при очистке списка отбор становится неактивным, а при повторном открытии отчета не восстанавливает удаленные элементы.