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

Разработка и Конфигурация · 9 мин

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

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

Динамический список в 1С строится на произвольном запросе, и почти всегда этот запрос содержит параметры: период отбора, ссылку на контрагента, склад, организацию. Чтобы список показывал нужные данные, параметры необходимо объявить в тексте запроса и передать им значения — через настройки компоновщика в конфигураторе или программно из кода формы.

Ошибки на этом этапе типичны: параметр объявлен в запросе, но значение ему не присвоено, список пустой или, наоборот, показывает всё подряд. Разберём, как устроена передача параметров, где их задавать и как проверить, что отбор действительно сработал.

Как объявить параметр в запросе динамического списка

Откройте свойства динамического списка (реквизита формы с типом «ДинамическийСписок») и включите флаг «Произвольный запрос». В тексте запроса параметры записываются с амперсандом, например: ГДЕ Продажи.Контрагент = &Контрагент или ГДЕ Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода.

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

Важный нюанс: если параметр используется в условии виртуальной таблицы (например, в параметрах РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , )), он обязателен — без значения виртуальная таблица не сможет выполниться корректно, и список будет пустым или выдаст ошибку.

Установка значений параметров в конфигураторе

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

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

Настройка параметра в конфигураторе
  1. 1
    Откройте свойства динамического списка и включите «Произвольный запрос»
  2. 2
    Добавьте параметр в текст запроса через &ИмяПараметра
  3. 3
    Откройте «Настройки» и перейдите на закладку «Параметры»
  4. 4
    Установите значение по умолчанию или включите параметр в пользовательские настройки
  5. 5
    Запустите режим предприятия и проверьте, что список отфильтрован

Программная передача параметров из кода формы

Когда значение параметра зависит от контекста — например, от открывшего форму документа или выбранной строки — его устанавливают программно. Основной метод: Список.Параметры.УстановитьЗначениеПараметра("Контрагент", ТекущийКонтрагент), где «Список» — имя реквизита формы с динамическим списком.

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Организация") Тогда

Список.Параметры.УстановитьЗначениеПараметра("Организация", Параметры.Организация);

КонецЕсли;

КонецПроцедуры

Для чтения текущего значения используется Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Организация")). Это полезно, когда нужно проверить, установлен ли параметр, прежде чем менять условие запроса.

bsl
Список.Параметры.УстановитьЗначениеПараметра("НачалоПериода", НачалоДня(ТекущаяДатаСеанса()));

Отбор через параметры против отбора компоновки

Один и тот же результат часто можно получить двумя способами: параметром в запросе (ГДЕ Контрагент = &Контрагент) или элементом отбора настроек компоновки (Список.Отбор...Элементы.Добавить()). Выбор влияет на поведение и производительность.

Параметр или отбор компоновки

Параметр запроса

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

Отбор компоновки данных

Подходит для необязательных пользовательских отборов. Виден в настройках списка, легко отключается, но при отключении список покажет все данные.

Комбинация

Периоды и ключевые ограничения — параметрами, дополнительные фильтры пользователя — отбором. Так список остаётся управляемым и быстрым.

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

Работа с параметрами типа «дата», «список» и «неопределено»

Даты в условиях периодов передавайте с явным приведением к границам: НачалоДня(Дата) и КонецДня(Дата), иначе при сравнении «МЕЖДУ» часть записей последнего дня потеряется из-за времени 00:00:00.

Для отбора по нескольким значениям параметру присваивают массив или список значений, а в запросе используют оператор В (&СписокКонтрагентов). Если список пуст, условие не выполнится ни для одной записи — это частая причина «внезапно опустевшего» списка.

Если параметр не обязателен, обрабатывайте пустое значение в запросе: ГДЕ (&Контрагент = НЕОПРЕДЕЛЕНО ИЛИ Продажи.Контрагент = &Контрагент) либо &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Тогда незаполненный параметр означает «без ограничения».

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Параметр объявлен в запросе, но значение нигде не установлено — список пустой или падает с ошибкой при обращении к виртуальной таблице
02
Установка параметра только на клиенте — реквизит Список недоступен в клиентском контексте, нужен серверный вызов
03
Несовпадение имени параметра в запросе и в коде (регистр букв не важен, но опечатка критична) — значение молча не применяется
04
Пустой массив в условии В (&Список) — отбор не проходит ни одна запись
05
Период без КонецДня — теряются документы последнего дня
Контрольные точки

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

Список после открытия формы
Норма

Показаны только записи, удовлетворяющие параметру

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

Пустой список либо все записи без фильтрации

Значение параметра через НайтиЗначениеПараметра
Норма

Возвращает ожидаемое значение и Использование = Истина

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

Значение Неопределено или параметр не найден

Смена параметра пользователем
Норма

Список обновляется автоматически

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

Данные не меняются до переоткрытия формы

Ограничения и альтернативы

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

Для отборов, зависящих от текущей строки другого списка, вместо кода иногда достаточно механизма связи параметров выбора или события ПриАктивизацииСтроки с установкой параметра — выбирайте по требованиям к скорости реакции интерфейса.

Итог

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

Параметр объявляется в запросе через &Имя, значение задаётся в конфигураторе или программно через Список.Параметры.УстановитьЗначениеПараметра() на сервере. Обязательные ограничения лучше делать параметрами, пользовательские фильтры — отбором компоновки, а пустые значения обрабатывать прямо в тексте запроса.

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

Почему список пустой, хотя данные в базе есть?

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

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

Нет, реквизит формы типа «ДинамическийСписок» доступен только на сервере. Из клиентского обработчика вызовите серверную процедуру (с контекстом формы) и установите параметр там.

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

Присвойте параметру массив или список значений, а в запросе используйте оператор В: ГДЕ Контрагент В (&Контрагенты). Учтите, что пустая коллекция сделает условие невыполнимым для всех записей.

Параметр установлен, но пользователь не видит его в настройках списка. Что делать?

Включите параметр в пользовательские настройки: в редакторе настроек компоновки выберите параметр и через «Свойства элемента пользовательских настроек» задайте режим доступа — «Быстрый доступ» или «Обычный».

Чем параметр виртуальной таблицы отличается от обычного условия ГДЕ?

Параметры виртуальной таблицы (период, условие в скобках) применяются на этапе выборки итогов и сильно влияют на производительность. Условие ГДЕ фильтрует уже полученный результат. Для регистров с большими объёмами период всегда передавайте параметром виртуальной таблицы.

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

Добавьте в запрос проверку пустого значения: ГДЕ (&Контрагент = НЕОПРЕДЕЛЕНО ИЛИ &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ИЛИ Контрагент = &Контрагент). Тогда незаполненный параметр не ограничивает выборку.