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