К статье
Практический материал

Отчеты и Аналитика · 11 мин

Как получить пользовательские настройки СКД в 1С

Как программно получить пользовательские настройки СКД в 1С: работа с КомпоновщикНастроек, отбор, параметры, сохранение и восстановление настроек отчёта.

Пользовательские настройки в системе компоновки данных (СКД) — это то, что конечный пользователь меняет в отчёте перед формированием: отборы, параметры, сортировку, группировки, оформление. Разработчику часто нужно получить эти настройки программно: чтобы сформировать отчёт в фоне, отправить его по почте, сохранить вариант или проверить, какие именно отборы применил пользователь.

Ключевая сложность в том, что в СКД существует два уровня настроек: основные настройки компоновщика (КомпоновщикНастроек.Настройки) и пользовательские настройки (КомпоновщикНастроек.ПользовательскиеНастройки), которые накладываются поверх основных. Если читать только основные настройки, можно получить отборы по умолчанию, а не те, что реально выбрал пользователь.

Ниже разобраны способы получения пользовательских настроек в управляемых формах, чтение значений отборов и параметров, сохранение настроек в хранилище и типичные ошибки, из-за которых код возвращает пустые или «не те» значения.

Где хранятся пользовательские настройки СКД

В типовом отчёте на СКД настройки живут в объекте КомпоновщикНастроек (в модуле объекта отчёта доступен через ЭтотОбъект.КомпоновщикНастроек). У него есть два ключевых свойства: Настройки — основная структура отчёта, и ПользовательскиеНастройки — коллекция элементов, которые пользователь изменил в режиме предприятия.

Каждый элемент пользовательских настроек имеет свойство Использование. Пользователь мог добавить отбор в список быстрых настроек, но снять у него флажок — тогда элемент существует, но в отчёт не попадает. Поэтому при программном чтении всегда проверяйте Использование = Истина, иначе получите лишние или неактуальные значения.

Связь между пользовательским элементом и основными настройками выполняется через свойство ИдентификаторПользовательскойНастройки у элементов основных настроек (отборов, параметров, порядка). Именно по этому идентификатору можно понять, к какому полю отчёта относится конкретная пользовательская настройка.

Как программно прочитать пользовательские отборы

Базовый приём — перебрать коллекцию КомпоновщикНастроек.ПользовательскиеНастройки.Элементы и отобрать элементы нужного типа. Отборы в пользовательских настройках представлены типом ОтборКомпоновкиДанных, а их элементы — ЭлементОтбораКомпоновкиДанных.

Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда

Для Каждого ЭлементОтбора Из Элемент.Элементы Цикл

Если ЭлементОтбора.Использование Тогда

Сообщить(Строка(ЭлементОтбора.ЛевоеЗначение) + " = "

+ Строка(ЭлементОтбора.ПравоеЗначение));

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

Если нужно найти конкретный отбор по известному полю, надёжнее искать не по имени поля в пользовательских настройках, а через основные настройки: найти в Настройки.Отбор.Элементы элемент с нужным ЛевоеЗначение, взять его ИдентификаторПользовательскойНастройки и затем найти соответствующий элемент в пользовательских настройках по Идентификатор. Такой подход устойчив к тому, что пользователь мог вообще не трогать этот отбор.

Учтите: если пользователь не менял отбор, элемента в пользовательских настройках может просто не быть. В этом случае действует значение из основных настроек или из варианта отчёта. Код должен корректно обрабатывать ситуацию «настройка не найдена», а не падать с ошибкой обращения к неопределённому значению.

Порядок чтения пользовательских отборов
  1. 1
    Получите КомпоновщикНастроек отчёта (в модуле объекта — ЭтотОбъект.КомпоновщикНастроек)
  2. 2
    Переберите КомпоновщикНастроек.ПользовательскиеНастройки.Элементы
  3. 3
    Отфильтруйте элементы типа ОтборКомпоновкиДанных
  4. 4
    Внутри проверяйте Использование у каждого элемента отбора
  5. 5
    Прочитайте ЛевоеЗначение, ВидСравнения и ПравоеЗначение
  6. 6
    Проверьте результат, сформировав отчёт с теми же настройками

Как получить значения параметров отчёта

Параметры СКД (период, организация, склад и т.п.) читаются похожим образом, но через тип ЗначениеПараметраНастроекКомпоновкиДанных. У элемента есть свойство Параметр (имя параметра в схеме) и Значение.

Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")

И Элемент.Использование Тогда

Сообщить(Строка(Элемент.Параметр) + " = " + Строка(Элемент.Значение));

КонецЕсли;

КонецЦикла;

Альтернатива — обратиться напрямую к параметру основных настроек через Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период")). Но важно понимать: если параметр вынесен в пользовательские настройки и пользователь его изменил, актуальное значение будет именно в пользовательских настройках, а основные настройки могут содержать устаревшее значение по умолчанию.

Получение настроек из формы отчёта

В управляемой форме отчёта компоновщик обычно доступен через реквизит формы Отчет.КомпоновщикНастроек. Поскольку на клиенте типы СКД недоступны в полном объёме, обработку настроек лучше выполнять в серверной процедуре формы: &НаСервере с обращением к Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.

Если отчёт построен на типовой форме отчёта БСП, полезные события — ПриЗагрузкеПользовательскихНастроекНаСервере и ПередЗагрузкойВариантаНаСервере в модуле объекта отчёта. Они позволяют перехватить момент, когда пользовательские настройки уже загружены, и дочитать или скорректировать их до формирования.

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

Сохранение и восстановление настроек

Для долговременного хранения настроек платформа предоставляет ХранилищеПользовательскихНастроекОтчетов. Методы Сохранить и Загрузить работают по ключу отчёта, ключу настройки и имени пользователя. Это стандартный механизм, которым пользуется сама платформа при сохранении вариантов.

ХранилищеПользовательскихНастроекОтчетов.Сохранить(

"Отчет.ПродажиПоМенеджерам",

"МойВариант",

КомпоновщикНастроек.ПользовательскиеНастройки);

Если нужно перенести настройки между базами или передать в фоновое задание, используйте сериализацию: ЗначениеВСтрокуВнутр(Настройки) для упаковки и ЗначениеИзСтрокиВнутр(Строка) для распаковки. Помните, что ссылки на объекты (организации, контрагенты) при переносе в другую базу станут битыми — для межбазового обмена храните представления или GUID.

Типичные ошибки при работе с настройками

Самая частая проблема — чтение основных настроек вместо пользовательских. Разработчик проверяет в конфигураторе, видит отбор по организации, пишет код, обращающийся к Настройки.Отбор, а в режиме предприятия получает другое значение, потому что пользователь переопределил отбор в быстрых настройках.

Вторая ошибка — игнорирование флага Использование. Элемент отбора существует, но выключен, и код всё равно подставляет его значение в запрос или в заголовок отчёта. Всегда проверяйте использование и у самого элемента, и у родительской группы, если отборы вложены.

Третья группа проблем связана с идентификаторами: после изменения схемы компоновки или варианта отчёта идентификаторы пользовательских настроек могут пересоздаться, и сохранённые ранее настройки «отвяжутся». Поэтому не храните идентификаторы жёстко в коде — ищите элементы по имени поля или имени параметра.

Типичные ошибки
01
Чтение Настройки.Отбор вместо ПользовательскиеНастройки — код получает значения по умолчанию, а не выбор пользователя
02
Отсутствие проверки Использование — в результат попадают выключенные отборы и параметры
03
Жёсткая привязка к идентификаторам настроек — после обновления отчёта код перестаёт находить элементы
04
Обращение к настройкам на клиенте без серверного вызова — типы СКД недоступны, код падает с ошибкой

Проверка результата и отладка

Надёжный способ проверить, что вы читаете правильные значения, — сформировать отчёт программно с полученными настройками и сравнить результат с формированием из формы. Совпадение табличного документа (или хотя бы итоговых сумм) подтверждает, что набор отборов и параметров идентичен.

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

Контрольные точки

Как проверить результат

Значение отбора в коде и в форме отчёта
Норма

Совпадают, отчёт формируется одинаково

Тревожный признак

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

Флаг Использование у элементов
Норма

Обрабатываются только включённые элементы

Тревожный признак

В выборку попадают отключённые пользователем отборы

Фоновое формирование
Норма

Настройки явно переданы и применены

Тревожный признак

Фоновый отчёт формируется с настройками по умолчанию

FAQ

Чем пользовательские настройки отличаются от варианта отчёта?

Вариант отчёта — это сохранённая структура настроек целиком (группировки, поля, ресурсы). Пользовательские настройки — это только та часть, которую пользователь меняет поверх варианта: отборы, параметры, сортировка. Один вариант может иметь много разных пользовательских настроек.

Как получить настройки другого пользователя?

Через ХранилищеПользовательскихНастроекОтчетов с методом Загрузить, указав параметр ИмяПользователя. Для этого у текущего пользователя должны быть административные права на работу с настройками, иначе платформа вернёт данные только текущего сеанса.

Почему коллекция пользовательских настроек пуста?

Так бывает, если пользователь ещё не открывал панель настроек и ничего не менял, либо если код выполняется до загрузки настроек в компоновщик. Проверьте, что обращение идёт после события загрузки варианта и пользовательских настроек, а не в момент создания формы.

Как передать настройки в фоновое задание?

Сериализуйте объект настроек через ЗначениеВСтрокуВнутр, передайте строку как параметр фонового задания, а в фоне восстановите через ЗначениеИзСтрокиВнутр и загрузите в компоновщик. Ссылки на объекты базы при этом переносятся корректно в пределах одной информационной базы.

Можно ли изменить пользовательские настройки программно?

Да. Найдите нужный элемент в коллекции пользовательских настроек, установите Использование и новое значение, затем сформируйте отчёт. Если элемента нет, его можно создать и добавить в коллекцию, указав тип и идентификатор связи с основными настройками.

Работает ли этот подход в обычных формах?

Да, объектная модель СКД одинакова. Отличие только в способе доступа к компоновщику: в обычной форме отчёта он доступен напрямую через реквизит формы без разделения на клиентский и серверный контекст, поэтому код чтения настроек проще.

Итог

Что важно запомнить

Реальные значения, выбранные пользователем, находятся в КомпоновщикНастроек.ПользовательскиеНастройки, а не в основных настройках. Всегда проверяйте флаг Использование, ищите элементы по имени поля или параметра, а для сохранения и фонового формирования используйте хранилище настроек или сериализацию.