К статье
Практический материал

Отчеты и Аналитика · 10 мин

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

Как передать список значений в параметр СКД в 1С: настройка доступности списка, передача через код, отбор по списку, типичные ошибки и проверка результата.

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

Механизм решается двумя настройками: включением флага «Доступен список значений» у параметра и корректной передачей объекта типа «СписокЗначений» через программный код. Дополнительно нужно правильно описать условие в запросе, чтобы отбор по списку работал через оператор «В».

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

Когда параметр со списком нужен, а когда лучше отбор

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

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

Параметр или отбор

Параметр со списком

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

Отбор «В списке»

Подходит для фильтрации итоговой выборки. Настраивается пользователем без доработки схемы.

Параметр виртуальной таблицы

Самый производительный вариант для регистров: отбор накладывается на уровне СУБД до чтения данных.

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

Откройте схему компоновки данных и перейдите на закладку «Параметры». Если параметр объявлен в тексте запроса через амперсанд (например, &СписокКонтрагентов), он появится в списке автоматически. Для него нужно установить два ключевых свойства.

Первое — тип значения. Укажите конкретный тип элемента списка, например «СправочникСсылка.Контрагенты». Составной тип усложняет ввод и замедляет работу, поэтому оставляйте только реально используемые типы. Второе — флажок «Доступен список значений»: именно он разрешает параметру принимать объект «СписокЗначений» и показывает пользователю кнопку выбора нескольких элементов в форме отчёта.

Также проверьте свойство «Включать в доступные поля» и снимите ограничение доступности, если параметр должен быть виден пользователю. При необходимости задайте значение по умолчанию — пустой список создаётся автоматически, но для типовых сценариев удобно подставить предзаполненный список.

Настройка параметра в СКД
  1. 1
    Откройте схему компоновки, закладка «Параметры»
  2. 2
    Добавьте параметр или найдите автоматически созданный из запроса
  3. 3
    Установите тип значения элемента списка (например, СправочникСсылка.Номенклатура)
  4. 4
    Включите флажок «Доступен список значений»
  5. 5
    В запросе напишите условие: Поле В (&ИмяПараметра)
  6. 6
    Сохраните схему и проверьте отчёт в режиме предприятия

Как написать условие в запросе

В тексте запроса условие по списку записывается оператором «В»: ГДЕ Продажи.Контрагент В (&СписокКонтрагентов). Конструктор запроса сам предложит такую конструкцию, если в режиме произвольного условия выбрать вид сравнения «В».

Для иерархических справочников полезен вариант В ИЕРАРХИИ (&СписокГрупп) — тогда в отбор попадут элементы всех выбранных папок и их подпапок. Учтите: если список пуст, условие «В» отсекает все записи, и отчёт вернёт пустой результат. Это стандартное поведение, а не ошибка.

Для виртуальных таблиц регистров список передаётся в параметрах самой таблицы, например: РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад В (&СписокСкладов)). Такой отбор выполняется на уровне СУБД и работает заметно быстрее фильтрации итоговой выборки.

bsl
ГДЕ
	Продажи.Контрагент В (&СписокКонтрагентов)
	И Продажи.Номенклатура В ИЕРАРХИИ (&СписокГрупп)

Программная передача списка из кода

Когда отчёт формируется программно — из обработки, команды или расширения — список передаётся через коллекцию значений параметров компоновщика настроек. Сначала создаётся объект «СписокЗначений», заполняется нужными ссылками, затем присваивается параметру.

Типовой фрагмент кода выглядит так: получить настройки компоновщика, найти параметр по имени через НайтиЗначениеПараметра, установить свойства «Использование» и «Значение». Важно присваивать именно объект СписокЗначений, а не массив — массив параметр не примет, и значение будет потеряно или вызовет ошибку приведения типов.

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

bsl
Список = Новый СписокЗначений;
Список.Добавить(Контрагент1);
Список.Добавить(Контрагент2);

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

Отбор по списку без параметра

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

Программно такой отбор добавляется через коллекцию КомпоновщикНастроек.Настройки.Отбор.Элементы: создаётся элемент отбора, задаётся левое значение (поле), вид сравнения «ВСписке» и правое значение — тот же СписокЗначений. Это удобно, когда состав отбора определяется динамически и заранее неизвестен.

Минус подхода — отбор применяется после выполнения запроса к виртуальным таблицам, поэтому на больших регистрах параметр виртуальной таблицы выигрывает по скорости. Для справочников и небольших выборок разница незаметна.

Типичные ошибки и как их диагностировать

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

Вторая группа ошибок связана с кодом: параметр ищется по неверному имени, свойство «Использование» не установлено в Истина, либо значение присваивается после формирования отчёта. Ещё одна ловушка — пользовательские настройки, сохранённые ранее: они перекрывают программно заданные значения, и отчёт формируется со старым списком.

Типичные ошибки
01
Не включён флажок «Доступен список значений» — список обрезается до первого элемента
02
В запросе написано «Поле = &Параметр» вместо «Поле В (&Параметр)» — ошибка или неверный результат
03
Передача массива вместо СписокЗначений — значение теряется
04
Не установлено свойство Использование = Истина — параметр игнорируется
05
Старые пользовательские настройки перекрывают программно заданный список
06
Пустой список трактуется как ошибка, хотя условие «В» корректно отсекает все записи

Проверка результата и ограничения

Чтобы убедиться, что отбор применился, сформируйте отчёт с заведомо известным списком из двух-трёх элементов и сверьте результат с ручной выборкой тех же данных стандартным списком документов или отчётом-контролем. Совпадение итогов — признак корректной настройки.

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

Контрольные точки

Как проверить результат

Состав данных в отчёте
Норма

Присутствуют записи по всем элементам списка

Тревожный признак

Данные только по одному элементу или пусто

Свойства параметра в СКД
Норма

Включён флажок «Доступен список значений», задан точный тип

Тревожный признак

Флажок снят, тип не задан или составной

Условие в запросе
Норма

Используется оператор В (&Параметр)

Тревожный признак

Используется равенство или параметр не упомянут

Поведение при пустом списке
Норма

Пустой результат — ожидаемо

Тревожный признак

Пустой список показывает все записи без предупреждения

Учитывайте ограничение производительности: списки из тысяч элементов раздувают текст запроса и замедляют его выполнение. В таких случаях лучше перенести данные во временную таблицу и соединяться с ней, либо пересмотреть логику отбора — например, заменить длинный список отбором по группе или свойству.

Итог

Что важно запомнить

Включите у параметра флажок «Доступен список значений», используйте в запросе оператор «В (&Параметр)», а из кода передавайте объект СписокЗначений с установленным свойством Использование. Для фильтрации итоговой выборки проще использовать отбор «В списке» без параметра. Пустой список всегда даёт пустой результат — это норма, а не ошибка.

Частые вопросы

Почему параметр принимает только одно значение, хотя я передаю список?

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

Можно ли передать в параметр массив вместо списка значений?

Нет, параметр СКД принимает только объект типа «СписокЗначений». Если данные у вас в массиве, преобразуйте его одной строкой: Список.ЗагрузитьЗначения(Массив). Обратное преобразование делается методом ВыгрузитьЗначения.

Отчёт пустой, хотя список заполнен. Что проверить в первую очередь?

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

Как сделать, чтобы при пустом списке отбор не применялся?

Стандартного переключателя нет: условие «В» при пустом списке всегда отсекает все записи. Обходные пути — программно отключать использование параметра, если список пуст, либо формировать текст запроса динамически, подставляя условие только при заполненном списке.

Что быстрее: параметр виртуальной таблицы или отбор «В списке»?

Параметр виртуальной таблицы быстрее, потому что отбор выполняется на уровне СУБД до чтения лишних данных. Отбор компоновки применяется к уже полученной выборке. На небольших объёмах разница незаметна, на крупных регистрах — существенна.

Как отобрать элементы по списку папок иерархического справочника?

Используйте условие «В ИЕРАРХИИ (&Параметр)»: в выборку попадут все элементы указанных групп и их подгрупп любого уровня вложенности. В отборе компоновки аналогичный вид сравнения называется «В группе из списка».