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

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

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

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

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

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

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

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

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

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

Между сеансами настройки хранятся в системном хранилище ХранилищеПользовательскихНастроекОтчетов. Ключ объекта — обычно имя отчёта или полное имя формы, ключ настроек — вариант настроек. Понимание этой структуры важно, когда нужно не только прочитать, но и сохранить или перенести настройки другому пользователю.

Базовый код: обход коллекции пользовательских настроек

Минимальный рабочий пример — обойти коллекцию элементов и распечатать их типы и значения. Это первое действие при отладке, потому что позволяет увидеть реальную структуру настроек конкретного отчёта.

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Порядок действий
  1. 1
    Получите компоновщик настроек отчёта: Отчет.КомпоновщикНастроек
  2. 2
    Обойдите коллекцию ПользовательскиеНастройки.Элементы
  3. 3
    Проверяйте ТипЗнч каждого элемента и свойство Использование
  4. 4
    Прочитайте значения отборов, параметров и порядка
  5. 5
    Проверьте результат выводом в Сообщить или в журнал регистрации

Как получить конкретный отбор или параметр

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

ИскомыйИД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0]

.ИдентификаторПользовательскойНастройки;

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

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

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

Если Парам.ИдентификаторПользовательскойНастройки = ИскомыйИД Тогда

ЗначениеПараметра = Парам.Значение;

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

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

Отличие Настройки от ПользовательскиеНастройки

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

Сравнение вариантов

ПользовательскиеНастройки.Элементы

Подходит, когда нужно узнать, что именно изменил пользователь. Требует обхода и проверки типов.

ПолучитьНастройки()

Возвращает итоговые настройки с применёнными изменениями. Проще для чтения значений, но не показывает источник изменения.

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

Для чтения сохранённых настроек других пользователей или других вариантов отчёта вне текущего сеанса.

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

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

Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();

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

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

"Основной",

Настройки,

,

"ИвановИИ");

Для передачи настроек между базами или в фоновое задание используют сериализацию. Классический способ — ЗначениеВСтрокуВнутр(Настройки) с обратным восстановлением через ЗначениеИзСтрокиВнутр. Либо сериализация в XML через СериализаторXDTO. Учтите: сериализованные настройки привязаны к структуре схемы компоновки — после изменения СКД (добавления полей, переименования параметров) старые сохранённые настройки могут примениться некорректно.

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

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

Вторая ошибка — чтение ПравоеЗначение отбора без проверки ВидСравнения. Для видов «ВСписке» и «НеВСписке» значение хранится как СписокЗначений, и прямое присваивание в строку даст нечитаемый результат. Проверяйте тип значения перед обработкой.

Третья ошибка — игнорирование свойства Использование. Отключенный пользователем отбор всё равно присутствует в коллекции со значением, но на результат отчёта не влияет. Если по такому значению строится дальнейшая логика (например, проверка заполненности обязательного отбора), выводы будут неверными.

Типичные ошибки
01
Чтение ПользовательскиеНастройки до загрузки настроек в компоновщик — коллекция пуста
02
Игнорирование свойства Использование — учитываются отключенные отборы
03
Прямое чтение ПравоеЗначение без проверки ВидСравнения — ошибка при списках значений
04
Поиск параметра на верхнем уровне, хотя он вложен в ЗначенияПараметровДанных
05
Хранение сериализованных настроек без учёта изменений схемы компоновки

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

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

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

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

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

Количество элементов в ПользовательскиеНастройки.Элементы
Норма

Больше нуля и совпадает с числом доступных пользователю настроек в форме отчёта

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

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

Значения отборов
Норма

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

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

Значения по умолчанию из схемы вместо пользовательских

Свойство Использование
Норма

Отражает реальное состояние флажков в форме

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

Все элементы с Использование = Истина, хотя часть отключена пользователем

Часто задаваемые вопросы

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

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

Почему коллекция ПользовательскиеНастройки.Элементы пустая?

Чаще всего компоновщик настроек не инициализирован: настройки не загружены из схемы компоновки. Вторая причина — в схеме ни одному элементу не назначен режим пользовательской настройки, тогда пользователю просто нечего менять. Проверьте вызов ЗагрузитьНастройки и свойства элементов в конструкторе СКД.

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

Сериализуйте настройки через ЗначениеВСтрокуВнутр или СериализаторXDTO и передайте строку как параметр фонового задания. Внутри задания восстановите настройки обратным методом и загрузите их в компоновщик. Прямая передача объекта КомпоновщикНастроек между сеансами невозможна.

Чем ПолучитьНастройки() отличается от свойства Настройки?

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

Сохранятся ли настройки после изменения схемы компоновки?

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

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

Да. Найдите нужный элемент в коллекции ПользовательскиеНастройки.Элементы, установите свойства Значение (или ПравоеЗначение для отбора) и Использование = Истина. Изменения применятся при следующем формировании отчёта. Альтернатива — загрузить готовый объект настроек через КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки.

Итог

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

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