К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно установить параметр динамического списка в 1С

Как программно установить параметр динамического списка в 1С: работа с КомпоновщикНастроек, УстановитьЗначениеПараметра, примеры кода, типичные ошибки и FAQ.

Динамический список в 1С — основной инструмент отображения табличных данных в управляемых формах: журналы документов, списки справочников, подборы товаров. Почти всегда запрос такого списка содержит параметры: период, организацию, склад, контрагента. Если параметр не заполнен, список либо показывает лишние данные, либо не показывает ничего — поэтому установка параметров программно при открытии формы или по действию пользователя является типовой задачей разработчика.

Главная сложность в том, что у динамического списка есть два уровня настроек: основные настройки компоновки (СКД), заданные в конструкторе, и пользовательские настройки, которые видит и меняет пользователь. Параметр можно установить в обоих местах, и результат будет отличаться. Ниже разобраны оба способа, порядок поиска параметра в коллекции, проверка результата и типичные ошибки.

Как устроены параметры динамического списка

Динамический список построен на системе компоновки данных. Его запрос описывается в свойстве реквизита формы, а параметры запроса становятся параметрами данных настроек компоновщика. Например, если в запросе есть условие ГДЕ Документ.Организация = &Организация, то в коллекции ПараметрыДанных появится параметр с именем «Организация».

Обратиться к параметру можно через дерево свойств: Список.КомпоновщикНастроек.Настройки.ПараметрыДанных. Здесь Список — имя реквизита формы типа «ДинамическийСписок». Каждый элемент коллекции имеет три ключевых свойства: Параметр (имя), Значение и Использование (флаг, включающий параметр).

Важно понимать: параметр, у которого Использование = Ложь, игнорируется при выполнении запроса. Это самая частая причина, почему «параметр установлен, но список не отфильтровался» — значение присвоено, а флаг использования не включён.

Базовый способ: УстановитьЗначениеПараметра

Самый короткий путь — метод УстановитьЗначениеПараметра коллекции параметров данных. Он одновременно находит параметр по имени, присваивает значение и включает использование. Этот способ подходит для большинства сценариев, когда параметр точно существует в запросе.

Типовой код в обработчике ПриСозданииНаСервере формы списка:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Список.КомпоновщикНастроек.Настройки.ПараметрыДанных

.УстановитьЗначениеПараметра("Организация", ТекущаяОрганизация);

КонецПроцедуры

Метод возвращает найденный элемент ЗначениеПараметраНастроекКомпоновкиДанных, поэтому при необходимости можно дополнительно проверить или изменить его свойства. Если параметра с таким именем в настройках нет, метод вернёт Неопределено — исключения не возникнет, но и фильтрация не сработает, поэтому полезно проверять результат.

bsl
ПараметрОрганизация = Список.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Организация", Организация);
Если ПараметрОрганизация = Неопределено Тогда
    Сообщить("Параметр Организация не найден в настройках списка");
КонецЕсли;

Поиск параметра через НайтиЗначениеПараметра

Когда нужен более тонкий контроль — например, проверить текущее значение перед заменой или работать с параметром периода — используют метод НайтиЗначениеПараметра. Он принимает объект ПараметрКомпоновкиДанных, созданный из строки имени.

&НаСервере

Процедура УстановитьПериодНаСервере(ДатаНачала, ДатаОкончания)

ПараметрыДанных = Список.КомпоновщикНастроек.Настройки.ПараметрыДанных;

ПараметрПериод = ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("Период"));

Если ПараметрПериод <> Неопределено Тогда

ПараметрПериод.Использование = Истина;

ПараметрПериод.Значение = Новый СтандартныйПериод(ДатаНачала, ДатаОкончания);

КонецЕсли;

КонецПроцедуры

Обратите внимание на тип значения: он должен совпадать с типом параметра в запросе. Если параметр объявлен как СтандартныйПериод, передача обычной даты приведёт к ошибке выполнения запроса списка. Для параметра-даты используйте конструкцию Новый СтандартныйПериод или Дата(...) в зависимости от того, как параметр описан в запросе.

Установка параметра в пользовательских настройках

Если пользователь должен видеть и менять установленное значение в стандартной панели настроек списка, параметр следует устанавливать не в основных настройках, а в пользовательских. Иначе значение окажется «скрытым»: фильтр работает, но пользователь не понимает, почему часть данных не видна.

Для этого в конструкторе настроек динамического списка параметр добавляется в пользовательские настройки, а программно доступ выполняется через коллекцию ПользовательскиеНастройки.Элементы:

&НаСервере

Процедура УстановитьПараметрПользователя()

Для Каждого Элемент Из Список.КомпоновщикНастроек

.ПользовательскиеНастройки.Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")

И Элемент.Параметр = Новый ПараметрКомпоновкиДанных("Склад") Тогда

Элемент.Значение = ОсновнойСклад;

Элемент.Использование = Истина;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Где устанавливать параметр

Основные настройки (Настройки.ПараметрыДанных)

Подходит для служебных отборов, которые пользователь не должен менять: текущая организация, доступный склад. Значение не видно в панели настроек.

Пользовательские настройки

Подходит, когда пользователь должен видеть и корректировать значение. Требует предварительного вывода параметра в пользовательские настройки в конструкторе.

Пошаговый порядок установки параметра

Порядок действий
  1. 1
    Откройте запрос динамического списка и убедитесь, что параметр в нём объявлен и используется в условии ГДЕ
  2. 2
    Определите, где устанавливать значение: в основных настройках (скрыто) или в пользовательских (видимо пользователю)
  3. 3
    В обработчике ПриСозданииНаСервере или команде формы вызовите УстановитьЗначениеПараметра либо найдите параметр через НайтиЗначениеПараметра
  4. 4
    Присвойте значение правильного типа и установите Использование = Истина
  5. 5
    Проверьте, что параметр найден (результат не Неопределено), и перезапустите форму для контроля фильтрации

Точку установки выбирают по сценарию. Если значение известно при открытии формы (например, организация из параметров сеанса) — используют ПриСозданииНаСервере. Если значение появляется после действия пользователя (выбор в поле отбора, команда) — установку выполняют в обработчике соответствующего события, обычно на клиенте с вызовом серверной процедуры или напрямую, если обращение к компоновщику доступно на клиенте.

Проверка результата и типичные ошибки

После установки параметра список обновляется автоматически — вызывать перечитывание вручную обычно не требуется. Признак корректной работы: данные в списке отфильтрованы сразу после выполнения кода, без дополнительных действий пользователя.

Контрольные точки

Как проверить результат

Содержимое списка после установки параметра
Норма

Отображаются только записи, удовлетворяющие условию фильтра

Тревожный признак

Список не изменился или стал пустым при заведомо существующих данных

Результат УстановитьЗначениеПараметра
Норма

Возвращён объект параметра (не Неопределено)

Тревожный признак

Возвращено Неопределено — параметр с таким именем отсутствует в запросе

Свойство Использование
Норма

Равно Истина

Тревожный признак

Равно Ложь — параметр задан, но не применяется

Типичные ошибки
01
Присвоено значение, но не включено свойство Использование — фильтр не применяется, визуально всё выглядит настроенным
02
Несовпадение типа значения с типом параметра в запросе (дата вместо СтандартныйПериод, строка вместо ссылки) — ошибка выполнения запроса списка
03
Опечатка в имени параметра: метод молча возвращает Неопределено, разработчик ищет проблему в другом месте
04
Установка параметра в основных настройках, когда пользователь ожидает увидеть его в панели — возникают жалобы на пропавшие данные
05
Установка параметра на клиенте там, где компоновщик недоступен, без серверного вызова — код не выполняется

Отдельная ситуация — параметр используется в запросе, но не выведен в настройки компоновщика. Проверьте в конструкторе динамического списка, что параметр присутствует на закладке «Параметры» настроек СКД. Если его там нет, программный поиск по имени ничего не найдёт.

Ограничения и альтернативы

Параметры данных подходят для условий, встроенных в текст запроса через &ИмяПараметра. Если нужно фильтровать по полю, которого нет в запросе как параметра, правильнее использовать отбор компоновки (Настройки.Отбор) — он добавляет условие динамически, без изменения текста запроса.

Ещё одна альтернатива — фиксированные настройки Список.КомпоновщикНастроек.ФиксированныеНастройки. Значения оттуда пользователь изменить не может вообще, это удобно для жёстких ограничений доступа к данным. Однако злоупотреблять фиксированными настройками не стоит: диагностировать «пропавшие» записи в таком списке сложнее.

При отладке удобно временно вывести имя и значение всех параметров списка перебором коллекции ПараметрыДанных — так сразу видно, какие имена реально существуют в настройках, и исключаются ошибки с опечатками.
ПЗ
Практическое замечание

Часто задаваемые вопросы

Почему параметр установлен, но список не фильтруется?

Чаще всего не включено свойство Использование у элемента параметра. Проверьте также, что имя параметра в коде совпадает с именем в запросе и что значение имеет правильный тип.

Можно ли установить параметр на клиенте без вызова сервера?

Обращение к настройкам компоновщика динамического списка в управляемой форме обычно выполняется на сервере. На клиенте принято вызывать серверную процедуру, которая меняет настройки, после чего форма сама обновляет список.

Как сбросить ранее установленный параметр?

Найдите параметр через НайтиЗначениеПараметра и установите его свойство Использование в Ложь. Условие перестанет применяться, и список покажет полные данные.

Чем установка параметра отличается от установки отбора?

Параметр подставляется в заранее описанное место запроса через &Имя. Отбор добавляет условие динамически по любому доступному полю списка без изменения текста запроса. Для фильтрации по полям, не заложенным в запрос, используйте отбор.

Как установить параметр типа «Период» для динамического списка?

Присвойте значение типа СтандартныйПериод или Дата в зависимости от того, как параметр объявлен в запросе. Для СтандартныйПериод создайте объект через Новый СтандартныйПериод и задайте даты начала и окончания.

Почему пользователь не видит установленное мной значение в настройках списка?

Значение установлено в основных настройках компоновщика, которые не отображаются в панели пользовательских настроек. Чтобы значение было видимо, выведите параметр в пользовательские настройки в конструкторе и устанавливайте его через коллекцию ПользовательскиеНастройки.Элементы.

Итог

Что важно запомнить

Параметр динамического списка устанавливается через Список.КомпоновщикНастроек: методом УстановитьЗначениеПараметра или поиском через НайтиЗначениеПараметра. Обязательно включайте Использование, следите за типом значения и выбирайте между основными и пользовательскими настройками в зависимости от того, должен ли пользователь видеть и менять значение.