Как очистить зависшие параметры типа СписокЗначений в отчете СКД

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

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

В чем причина сохранения очищенного списка значений

Разберем внутренний механизм платформы 1С:Предприятие и типовой подсистемы БСП, который приводит к этой проблеме:

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

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

Для гарантированного удаления зависших настроек конкретного внешнего отчета необходимо обратиться напрямую к объекту ХранилищеСистемныхНастроек. Выясним, как правильно выполнить удаление данных параметров.

Вместо полной очистки всех настроек пользователя воспользуемся точечным удалением ветки нужного отчета:


// Укажем имя внешнего отчета так, как оно зарегистрировано в системе
ИмяОтчета = "ВнешнийОтчет.ИмяВашегоОтчета";
ИмяПользователя = "ИмяПользователя"; // или Неопределено для текущего сеанса

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

Если точный ключ неизвестен, можно временно очистить системные настройки полностью (например, в тестовой базе):

ХранилищеСистемныхНастроек.Удалить(Неопределено, Неопределено, Неопределено);

Важное условие: после выполнения программного кода очистки обязательно перезапустите сеанс 1С:Предприятия. Если используется клиент-серверный вариант работы, может потребоваться перезапуск сеанса на сервере 1С или перезапуск службы сервера, чтобы полностью сбросить кэш сеанса в оперативной памяти.

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

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


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

Такой подход отключает использование параметра, если в списке нет значений, предотвращая наложение старых данных из кэша.

Способ 3. Перевод фильтрации из параметров в отборы СКД

Рассмотрим альтернативное архитектурное решение. Механизм списков значений в параметрах данных СКД исторически чувствителен к пустым коллекциям. Если параметр используется исключительно для фильтрации строк в запросе, рекомендуется перенести условие на вкладку Отбор схемы компоновки данных:

  1. В схеме компоновки данных перейдем на вкладку Настройки -> Отбор.
  2. Добавим требуемое поле с видом сравнения В списке.
  3. Вынесем отбор в состав пользовательских настроек (быстрый доступ).

Механизм отборов платформы 1С корректно обрабатывает флаг включения отбора: при очистке списка отбор становится неактивным, а при повторном открытии отчета не восстанавливает удаленные элементы.

← На главную