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