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