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