Отчеты и Аналитика · 11 мин
Как получить пользовательские настройки СКД в 1С
Как программно получить пользовательские настройки СКД в 1С: работа с КомпоновщикНастроек, отбор, параметры, сохранение и восстановление настроек отчёта.
Пользовательские настройки в системе компоновки данных (СКД) — это то, что конечный пользователь меняет в отчёте перед формированием: отборы, параметры, сортировку, группировки, оформление. Разработчику часто нужно получить эти настройки программно: чтобы сформировать отчёт в фоне, отправить его по почте, сохранить вариант или проверить, какие именно отборы применил пользователь.
Ключевая сложность в том, что в СКД существует два уровня настроек: основные настройки компоновщика (КомпоновщикНастроек.Настройки) и пользовательские настройки (КомпоновщикНастроек.ПользовательскиеНастройки), которые накладываются поверх основных. Если читать только основные настройки, можно получить отборы по умолчанию, а не те, что реально выбрал пользователь.
Ниже разобраны способы получения пользовательских настроек в управляемых формах, чтение значений отборов и параметров, сохранение настроек в хранилище и типичные ошибки, из-за которых код возвращает пустые или «не те» значения.
Где хранятся пользовательские настройки СКД
В типовом отчёте на СКД настройки живут в объекте КомпоновщикНастроек (в модуле объекта отчёта доступен через ЭтотОбъект.КомпоновщикНастроек). У него есть два ключевых свойства: Настройки — основная структура отчёта, и ПользовательскиеНастройки — коллекция элементов, которые пользователь изменил в режиме предприятия.
Каждый элемент пользовательских настроек имеет свойство Использование. Пользователь мог добавить отбор в список быстрых настроек, но снять у него флажок — тогда элемент существует, но в отчёт не попадает. Поэтому при программном чтении всегда проверяйте Использование = Истина, иначе получите лишние или неактуальные значения.
Связь между пользовательским элементом и основными настройками выполняется через свойство ИдентификаторПользовательскойНастройки у элементов основных настроек (отборов, параметров, порядка). Именно по этому идентификатору можно понять, к какому полю отчёта относится конкретная пользовательская настройка.
Как программно прочитать пользовательские отборы
Базовый приём — перебрать коллекцию КомпоновщикНастроек.ПользовательскиеНастройки.Элементы и отобрать элементы нужного типа. Отборы в пользовательских настройках представлены типом ОтборКомпоновкиДанных, а их элементы — ЭлементОтбораКомпоновкиДанных.
Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда
Для Каждого ЭлементОтбора Из Элемент.Элементы Цикл
Если ЭлементОтбора.Использование Тогда
Сообщить(Строка(ЭлементОтбора.ЛевоеЗначение) + " = "
+ Строка(ЭлементОтбора.ПравоеЗначение));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если нужно найти конкретный отбор по известному полю, надёжнее искать не по имени поля в пользовательских настройках, а через основные настройки: найти в Настройки.Отбор.Элементы элемент с нужным ЛевоеЗначение, взять его ИдентификаторПользовательскойНастройки и затем найти соответствующий элемент в пользовательских настройках по Идентификатор. Такой подход устойчив к тому, что пользователь мог вообще не трогать этот отбор.
Учтите: если пользователь не менял отбор, элемента в пользовательских настройках может просто не быть. В этом случае действует значение из основных настроек или из варианта отчёта. Код должен корректно обрабатывать ситуацию «настройка не найдена», а не падать с ошибкой обращения к неопределённому значению.
- 1Получите КомпоновщикНастроек отчёта (в модуле объекта — ЭтотОбъект.КомпоновщикНастроек)
- 2Переберите КомпоновщикНастроек.ПользовательскиеНастройки.Элементы
- 3Отфильтруйте элементы типа ОтборКомпоновкиДанных
- 4Внутри проверяйте Использование у каждого элемента отбора
- 5Прочитайте ЛевоеЗначение, ВидСравнения и ПравоеЗначение
- 6Проверьте результат, сформировав отчёт с теми же настройками
Как получить значения параметров отчёта
Параметры СКД (период, организация, склад и т.п.) читаются похожим образом, но через тип ЗначениеПараметраНастроекКомпоновкиДанных. У элемента есть свойство Параметр (имя параметра в схеме) и Значение.
Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
И Элемент.Использование Тогда
Сообщить(Строка(Элемент.Параметр) + " = " + Строка(Элемент.Значение));
КонецЕсли;
КонецЦикла;
Альтернатива — обратиться напрямую к параметру основных настроек через Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период")). Но важно понимать: если параметр вынесен в пользовательские настройки и пользователь его изменил, актуальное значение будет именно в пользовательских настройках, а основные настройки могут содержать устаревшее значение по умолчанию.
Получение настроек из формы отчёта
В управляемой форме отчёта компоновщик обычно доступен через реквизит формы Отчет.КомпоновщикНастроек. Поскольку на клиенте типы СКД недоступны в полном объёме, обработку настроек лучше выполнять в серверной процедуре формы: &НаСервере с обращением к Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.
Если отчёт построен на типовой форме отчёта БСП, полезные события — ПриЗагрузкеПользовательскихНастроекНаСервере и ПередЗагрузкойВариантаНаСервере в модуле объекта отчёта. Они позволяют перехватить момент, когда пользовательские настройки уже загружены, и дочитать или скорректировать их до формирования.
Для отладки удобно временно вывести структуру настроек в сообщения: пройтись по элементам пользовательских настроек и вывести их типы, идентификаторы и значения. Это быстро показывает, какие элементы реально присутствуют, а какие вы ожидали увидеть ошибочно.
Сохранение и восстановление настроек
Для долговременного хранения настроек платформа предоставляет ХранилищеПользовательскихНастроекОтчетов. Методы Сохранить и Загрузить работают по ключу отчёта, ключу настройки и имени пользователя. Это стандартный механизм, которым пользуется сама платформа при сохранении вариантов.
ХранилищеПользовательскихНастроекОтчетов.Сохранить(
"Отчет.ПродажиПоМенеджерам",
"МойВариант",
КомпоновщикНастроек.ПользовательскиеНастройки);
Если нужно перенести настройки между базами или передать в фоновое задание, используйте сериализацию: ЗначениеВСтрокуВнутр(Настройки) для упаковки и ЗначениеИзСтрокиВнутр(Строка) для распаковки. Помните, что ссылки на объекты (организации, контрагенты) при переносе в другую базу станут битыми — для межбазового обмена храните представления или GUID.
Типичные ошибки при работе с настройками
Самая частая проблема — чтение основных настроек вместо пользовательских. Разработчик проверяет в конфигураторе, видит отбор по организации, пишет код, обращающийся к Настройки.Отбор, а в режиме предприятия получает другое значение, потому что пользователь переопределил отбор в быстрых настройках.
Вторая ошибка — игнорирование флага Использование. Элемент отбора существует, но выключен, и код всё равно подставляет его значение в запрос или в заголовок отчёта. Всегда проверяйте использование и у самого элемента, и у родительской группы, если отборы вложены.
Третья группа проблем связана с идентификаторами: после изменения схемы компоновки или варианта отчёта идентификаторы пользовательских настроек могут пересоздаться, и сохранённые ранее настройки «отвяжутся». Поэтому не храните идентификаторы жёстко в коде — ищите элементы по имени поля или имени параметра.
Проверка результата и отладка
Надёжный способ проверить, что вы читаете правильные значения, — сформировать отчёт программно с полученными настройками и сравнить результат с формированием из формы. Совпадение табличного документа (или хотя бы итоговых сумм) подтверждает, что набор отборов и параметров идентичен.
Полезно также вывести в расшифровку или в служебное поле отчёта текстовое описание применённых настроек. Если пользователь видит в шапке отчёта тот же отбор, что установил в форме, значит, цепочка чтения работает корректно.
Как проверить результат
Совпадают, отчёт формируется одинаково
В коде значение по умолчанию или пусто — читаются основные настройки вместо пользовательских
Обрабатываются только включённые элементы
В выборку попадают отключённые пользователем отборы
Настройки явно переданы и применены
Фоновый отчёт формируется с настройками по умолчанию
FAQ
Чем пользовательские настройки отличаются от варианта отчёта?
Вариант отчёта — это сохранённая структура настроек целиком (группировки, поля, ресурсы). Пользовательские настройки — это только та часть, которую пользователь меняет поверх варианта: отборы, параметры, сортировка. Один вариант может иметь много разных пользовательских настроек.
Как получить настройки другого пользователя?
Через ХранилищеПользовательскихНастроекОтчетов с методом Загрузить, указав параметр ИмяПользователя. Для этого у текущего пользователя должны быть административные права на работу с настройками, иначе платформа вернёт данные только текущего сеанса.
Почему коллекция пользовательских настроек пуста?
Так бывает, если пользователь ещё не открывал панель настроек и ничего не менял, либо если код выполняется до загрузки настроек в компоновщик. Проверьте, что обращение идёт после события загрузки варианта и пользовательских настроек, а не в момент создания формы.
Как передать настройки в фоновое задание?
Сериализуйте объект настроек через ЗначениеВСтрокуВнутр, передайте строку как параметр фонового задания, а в фоне восстановите через ЗначениеИзСтрокиВнутр и загрузите в компоновщик. Ссылки на объекты базы при этом переносятся корректно в пределах одной информационной базы.
Можно ли изменить пользовательские настройки программно?
Да. Найдите нужный элемент в коллекции пользовательских настроек, установите Использование и новое значение, затем сформируйте отчёт. Если элемента нет, его можно создать и добавить в коллекцию, указав тип и идентификатор связи с основными настройками.
Работает ли этот подход в обычных формах?
Да, объектная модель СКД одинакова. Отличие только в способе доступа к компоновщику: в обычной форме отчёта он доступен напрямую через реквизит формы без разделения на клиентский и серверный контекст, поэтому код чтения настроек проще.
Что важно запомнить
Реальные значения, выбранные пользователем, находятся в КомпоновщикНастроек.ПользовательскиеНастройки, а не в основных настройках. Всегда проверяйте флаг Использование, ищите элементы по имени поля или параметра, а для сохранения и фонового формирования используйте хранилище настроек или сериализацию.