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