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