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