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