Как в СКД использовать список значений в параметре и чем это отличается от отборов

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Способ 1: Настройка параметра в конструкторе СКД

Если нам необходимо, чтобы пользователь мог выбрать именно несколько значений в конкретном параметре, разберем по шагам действия в конструкторе схемы компоновки данных. Перейдем на закладку Параметры. Здесь мы увидим список всех параметров, используемых в запросе или созданных вручную.

Для реализации нашей задачи выполним следующие действия:

  1. Найдем нужный параметр (например, Контрагент).
  2. В колонке Доступен список значений установим флаг. Именно этот «слон», которого не всегда сразу примечают разработчики, меняет поведение поля ввода в пользовательском режиме.
  3. В колонке Тип желательно явно ограничить тип данных (например, СправочникСсылка.Контрагенты). Это упростит работу пользователя, так как система сразу предложит выбор из нужного справочника.
  4. Проверим свойство Запрещать незаполненные значения. Если оно включено, отчет не сформируется, пока пользователь не подберет хотя бы один элемент в список.

Важный нюанс кроется в тексте самого запроса. Если мы разрешили список значений в параметре, то в тексте запроса СКД мы должны использовать оператор В вместо обычного равенства. Проанализируем пример правильного написания условия в ГДЕ:


ВЫБРАТЬ
    Продажи.Контрагент,
    Продажи.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи
ГДЕ
    Продажи.Контрагент В (&Контрагент)

Если использовать Продажи.Контрагент = &Контрагент, то при передаче списка значений система выдаст ошибку несоответствия типов, так как нельзя сравнивать одиночную ссылку с массивом или списком значений.

Способ 2: Использование параметров виртуальных таблиц

Рассмотрим более продвинутый и эффективный с точки зрения производительности вариант. Если мы работаем с виртуальными таблицами (Обороты, Остатки, Срезы), крайне рекомендуется передавать список значений напрямую в параметры этой таблицы. Выясним причину: это позволяет СУБД ограничить выборку данных еще на этапе чтения из физических таблиц итогов, а не фильтровать уже полученный огромный массив данных в оперативной памяти.

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


ВЫБРАТЬ
    ХозрасчетныйОстатки.Счет,
    ХозрасчетныйОстатки.Субконто1,
    ХозрасчетныйОстатки.СуммаОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , &ВидСубконто, ) КАК ХозрасчетныйОстатки

В данном случае параметр &ВидСубконто может быть списком, что позволит нам получить остатки сразу по нескольким видам характеристик. Посмотрим, как это выглядит в программном коде при инициализации отчета.

Способ 3: Программная установка списка значений в параметры

Иногда требуется заполнить список значений программно, исходя из логики приложения или прав доступа пользователя. Разберем пример кода, который можно разместить в модуле отчета или обработки.

Если нам нужно установить значения в обычные параметры компоновщика настроек, используем следующий алгоритм:


// Создаем список значений с нужными элементами
ВидСубконто = Новый СписокЗначений;
ВидСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура);
ВидСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады);

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

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

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

Способ 4: Параметры против Отборов — что выбрать?

Проанализируем ситуацию, описанную опытными разработчиками: почему зачастую использование параметров для простых фильтров считается «плохим тоном» в СКД? Рассмотрим ключевые отличия:

  1. Универсальность: Стандартный механизм Отбор в СКД позволяет пользователю самостоятельно выбирать вид сравнения: «Равно», «В списке», «В группе», «Не равно». Параметр же жестко ограничен тем видом сравнения, который прописал программист в запросе (обычно это либо =, либо В).
  2. Динамичность: Отборы можно добавлять и удалять в процессе работы с отчетом без изменения схемы. Параметр — это константа структуры запроса.
  3. Гибкость интерфейса: Механизм отборов позволяет группировать условия (И, ИЛИ, НЕ), что практически невозможно реализовать через простые параметры без сложного динамического формирования текста запроса.

Когда же всё-таки стоит использовать параметры со списком значений? Выделим эти случаи:

Настройка через выражения (без кода)

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

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

← На главную