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