СКД в 1С

Пользовательские настройки СКД в 1С: параметры, отбор, режимы

Коротко

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

Читать и менять их из кода нужно через Компоновщик.ПользовательскиеНастройки.Элементы.Найти(Идентификатор), а не через Компоновщик.Настройки: пользовательские настройки живут в отдельной коллекции и перекрывают основные при выполнении отчёта.

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

У компоновщика настроек есть три независимых слоя, и путать их — источник большинства проблем с пользовательскими настройками СКД:

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

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

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

Как вывести параметр в пользовательские настройки СКД

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

ЗначенияПараметров = Компоновщик.Настройки.ПараметрыДанных;
ЗначениеПараметра = ЗначенияПараметров.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Организация"));

Если ЗначениеПараметра <> Неопределено Тогда
    ЗначениеПараметра.Использование = Истина;
    ЗначениеПараметра.ИдентификаторПользовательскойНастройки = "Организация";
    ЗначениеПараметра.ПредставлениеПользовательскойНастройки = "Организация";
    ЗначениеПараметра.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
КонецЕсли;
НайтиЗначениеПараметра
ПараметрПараметрКомпоновкиДанных или имя параметра
ЗначениеПараметраНастроекКомпоновкиДанных, Неопределено

Установить значение уже выведенного параметра проще методом УстановитьЗначениеПараметра() — он сам найдёт значение и включит Использование:

// Значение параметра именно в пользовательских настройках
НастройкаПараметра = Компоновщик.ПользовательскиеНастройки.Элементы.Найти(
    Новый УникальныйИдентификатор("Организация"));

// Универсальный путь: правим значение в нужном слое
Компоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаНачала", НачалоМесяца(ТекущаяДата()));
Компоновщик.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОкончания", КонецМесяца(ТекущаяДата()));
УстановитьЗначениеПараметра
Параметримя параметра или ПараметрКомпоновкиДанных
Значениеустанавливаемое значение
значение не возвращается

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

Вывод отбора в пользовательские настройки

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

ЭлементОтбора = Компоновщик.Настройки.Отбор.Элементы.Добавить(
    Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
ЭлементОтбора.ВидСравнения  = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ВыбранныйСклад;
ЭлементОтбора.Использование = Истина;

// Именно эти две строки выводят отбор пользователю
ЭлементОтбора.ИдентификаторПользовательскойНастройки = "ОтборПоСкладу";
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
ЭлементОтбораКомпоновкиДанных
ЛевоеЗначениеполе компоновки данных
ВидСравненияРавно, ВСписке, Содержит…
ПравоеЗначениезначение сравнения
ИдентификаторПользовательскойНастройкивывод в пользовательские настройки
РежимОтображениябыстрый доступ / обычный / недоступный
Применениек иерархии, к элементам, к общему итогу

Если отбор нужно только прочитать (а не создать), берите его из пользовательских настроек — там лежит то, что реально выбрал пользователь:

Настройка = Компоновщик.ПользовательскиеНастройки.Элементы.Найти(
    Новый УникальныйИдентификатор("ОтборПоСкладу"));

Если Настройка <> Неопределено И Настройка.Использование Тогда
    ВыбранныйСклад = Настройка.ПравоеЗначение;
КонецЕсли;

Режимы отображения: быстрый доступ, обычный, недоступный

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

  • БыстрыйДоступ — элемент выносится прямо в шапку формы отчёта, рядом с кнопкой «Сформировать». Для 2–5 самых нужных параметров (период, организация, склад).
  • Обычный — элемент доступен в форме настроек отчёта, но не в шапке. Режим по умолчанию для большинства выведенных настроек.
  • Недоступный — элемент не показывается пользователю вообще, даже если идентификатор заполнен. Так «прячут» служебные параметры, не удаляя их из настроек.
  • Авто — режим определяется платформой исходя из вида элемента и его расположения в структуре настроек.

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

Необязательные параметры СКД

«1С СКД необязательные параметры» — это про два разных свойства, которые часто путают.

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

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

// Параметр не задан — отбор по контрагенту не применяется
ЗначениеПараметра = Компоновщик.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
    Новый ПараметрКомпоновкиДанных("Контрагент"));

Если ЗначениеПараметра <> Неопределено Тогда
    ЗначениеПараметра.Значение = ВыбранныйКонтрагент;
    ЗначениеПараметра.Использование = ЗначениеЗаполнено(ВыбранныйКонтрагент);
КонецЕсли;
ЗначениеПараметраНастроекКомпоновкиДанных
Параметридентификатор параметра
Значениезначение параметра
Использованиеучаствует ли параметр в компоновке
РежимОтображениявидимость у пользователя
ЗначенияВложенныхПараметровдля параметров-структур

В самом запросе СКД необязательный параметр обычно оформляют условием вида Контрагент = &Контрагент с установленным флагом использования: если Использование снято, компоновщик выбросит это условие из итогового запроса, и отбор просто не сработает. Отдельной проверки «если параметр пустой» писать не нужно.

Параметры выбора и доступные значения

Когда в пользовательских настройках СКД нужно ограничить список того, что пользователь может выбрать, работают два механизма.

Список доступных значений задаётся у параметра схемы методом УстановитьДоступныеЗначения() — пользователь получит выпадающий список вместо свободного ввода:

ПараметрСхемы = Схема.Параметры.Найти("ВидЦены");

СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить("Оптовая");
СписокЗначений.Добавить("Розничная");

ПараметрСхемы.УстановитьДоступныеЗначения(СписокЗначений);
ПараметрСхемы.ДоступенСписокЗначений = Истина;
ПараметрСхемы.ЗапрещатьНезаполненныеЗначения = Ложь;
УстановитьДоступныеЗначения
ДоступныеЗначенияСписокЗначений с допустимыми вариантами
значение не возвращается

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

ДоступныеПараметры = Компоновщик.Настройки.ПараметрыДанных.ДоступныеПараметры;
ДоступныйПараметр = ДоступныеПараметры.Элементы.Найти("Номенклатура");

Если ДоступныйПараметр <> Неопределено Тогда
    ПараметрыВыбора = ДоступныйПараметр.ПолучитьПараметрыВыбора();
    Сообщить("Запрещать незаполненные: " + ДоступныйПараметр.ЗапрещатьНезаполненныеЗначения);
КонецЕсли;
Подбор параметров выбора удобно отлаживать итеративно: в Консоли кода можно менять ПараметрыРедактирования и тут же перевыполнять компоновку, не пересохраняя отчёт в конфигураторе.

Сохранение и загрузка вариантов пользовательских настроек

Пользовательские настройки сериализуются отдельно от основных, поэтому и сохранять их надо отдельно. Стандартный приёмник — хранилище настроек:

// Сохранение выбранного пользователем набора
ХранилищеОбщихНастроек.Сохранить(
    "Отчет.ПродажиПоСкладам",
    "НастройкиПользователя",
    Компоновщик.ПользовательскиеНастройки,
    ,
    ИмяПользователя());
Сохранить
КлючОбъектаидентификатор отчёта
КлючНастроекимя набора настроек
Настройкисохраняемый объект настроек
ОписаниеНастроекОписаниеНастроек для списка вариантов
ИмяПользователячьи настройки сохраняем

Загрузка выполняется зеркально, но применять результат нужно методом ЗагрузитьПользовательскиеНастройки(), а не присваиванием свойства:

Сохранённые = ХранилищеОбщихНастроек.Загрузить(
    "Отчет.ПродажиПоСкладам",
    "НастройкиПользователя",
    ,
    ИмяПользователя());

Если Сохранённые <> Неопределено Тогда
    Компоновщик.ЗагрузитьПользовательскиеНастройки(Сохранённые);
КонецЕсли;
ЗагрузитьПользовательскиеНастройки
ПользовательскиеНастройкиПользовательскиеНастройкиКомпоновкиДанных
значение не возвращается

Если после загрузки схема отчёта изменилась (поле переименовали, параметр удалили), настройки нужно привести в согласованное состояние методом Восстановить():

Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
Компоновщик.ЗагрузитьПользовательскиеНастройки(Сохранённые);

// Выбрасываем настройки, ставшие недоступными после доработки схемы
Компоновщик.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);
Восстановить
СпособПолное — восстановить всё; ПроверятьДоступность — отбросить недоступные элементы
значение не возвращается

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

Частые ошибки с пользовательскими настройками СКД

  • Правка Компоновщик.Настройки, когда параметр выведен пользователю. Значение из ПользовательскиеНастройки перекроет ваше при компоновке. Меняйте тот слой, который реально применяется.
  • Пустой ИдентификаторПользовательскойНастройки. Без него элемент не появится в форме, какой бы РежимОтображения вы ни поставили — режим влияет только на уже помеченные элементы.
  • Ожидание, что Недоступный отключит отбор. Режим скрывает элемент, но условие продолжает работать. Чтобы отключить — снимайте Использование.
  • Присваивание Компоновщик.ПользовательскиеНастройки = .... Свойство так не применяется; загружать набор нужно методом ЗагрузитьПользовательскиеНастройки().
  • Загрузка сохранённых настроек без Восстановить(). После доработки схемы старые настройки ссылаются на несуществующие поля, и отчёт падает при выполнении.
  • Неуникальные идентификаторы настроек. Два элемента с одинаковым идентификатором — и Элементы.Найти() вернёт не тот, что вы ждали.
  • Забытый флаг ЗапрещатьНезаполненныеЗначения. Параметр, задуманный как необязательный, блокирует формирование отчёта сообщением о незаполненном значении.

Частые вопросы о пользовательских настройках СКД

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

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

Чем отличается быстрый доступ от обычного режима отображения?

БыстрыйДоступ выносит элемент в шапку формы отчёта, рядом с кнопкой «Сформировать». Обычный оставляет его только в форме настроек. На результат компоновки режим не влияет — это исключительно способ показа.

Как сделать параметр СКД необязательным?

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

Тарифы

ИИ Консоль запросов 1С

Лайт

Бесплатно

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

Популярный выбор
990 руб. в месяц
≈ 5 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

3900 руб. в месяц
≈ 19,5 млн токенов

Для интенсивного использования или команд

Выбрать тариф