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