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

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

Как программно установить список выбора в 1С

Как программно заполнить список выбора в 1С: методы Добавить, ЗагрузитьЗначения, работа с элементом формы, типовые ошибки и проверка результата.

Список выбора в 1С — это набор значений, которые пользователь видит при нажатии на кнопку выпадающего списка в поле ввода. Программно задать его можно двумя путями: через свойство СписокВыбора элемента формы (поля ввода) или через типовые механизмы вроде параметра выбора и связей. В большинстве задач используется именно первый способ — объект СписокЗначений, доступный как Элементы.ИмяПоля.СписокВыбора.

Типичные сценарии: ограничить выбор в поле документа фиксированным перечнем, подставить в список значения из справочника с отбором, динамически менять варианты в зависимости от других реквизитов формы. Всё это решается в модуле формы на встроенном языке без изменения конфигурации в конфигураторе — если форма уже существует и доступна для доработки или расширения.

Ниже разобраны основные методы работы со списком выбора, заполнение из запроса, динамическое обновление, контроль результата и ошибки, которые чаще всего приводят к пустому или «залипшему» списку.

Где находится список выбора и как к нему обратиться

У каждого поля ввода на управляемой форме есть свойство СписокВыбора. Обращение выполняется через коллекцию Элементы формы:

Элементы.ПолеКонтрагент.СписокВыбора.Добавить("Опт", "Оптовая цена");

Элементы.ПолеКонтрагент.СписокВыбора.Добавить("Розница", "Розничная цена");

Первый параметр метода Добавить() — значение, которое реально попадёт в реквизит при выборе. Второй — представление, то есть текст, который увидит пользователь. Если представление не указать, пользователь увидит само значение, что для ссылок на справочник выглядит как служебное наименование.

Важно понимать тип значения. Если поле связано с реквизитом типа ПеречислениеСсылка, добавлять в список нужно ссылки перечисления, а не строки. Несовпадение типа приведёт к тому, что выбранное значение либо не запишется, либо вызовет ошибку преобразования.

Заполнение списка фиксированными значениями

Самый простой случай — заранее известный перечень вариантов. Код размещают в обработчике ПриСозданииНаСервере или ПриОткрытии формы:

&НаСервере

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

Список = Элементы.СпособДоставки.СписокВыбора;

Список.Очистить();

Список.Добавить("Самовывоз", "Самовывоз со склада");

Список.Добавить("Курьер", "Доставка курьером");

Список.Добавить("ТК", "Транспортная компания");

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

Вызов Очистить() перед заполнением — защита от дублирования: если обработчик сработает повторно (например, при перечитывании объекта), значения не задвоятся. Это дешёвая страховка, которой часто пренебрегают.

Если значения уже хранятся в массиве или другом списке значений, удобнее использовать ЗагрузитьЗначения(МассивЗначений) — он заменяет содержимое списка одним вызовом. Для массового заполнения это и короче, и быстрее цикла с Добавить().

Базовый порядок установки списка
  1. 1
    Откройте модуль формы и найдите поле ввода в дереве элементов
  2. 2
    В обработчике ПриСозданииНаСервере получите список: Элементы.ИмяПоля.СписокВыбора
  3. 3
    Очистите список методом Очистить()
  4. 4
    Добавьте значения методом Добавить(Значение, Представление) или ЗагрузитьЗначения()
  5. 5
    Откройте форму в режиме 1С:Предприятие и проверьте выпадающий список

Заполнение списка значениями из базы данных

Когда варианты хранятся в справочнике или регистре, список заполняют результатом запроса. Типовой шаблон выглядит так:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ВидыЦен.Ссылка КАК Ссылка,

| ВидыЦен.Наименование КАК Наименование

|ИЗ

| Справочник.ВидыЦен КАК ВидыЦен

|ГДЕ

| НЕ ВидыЦен.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Список = Элементы.ВидЦены.СписокВыбора;

Список.Очистить();

Пока Выборка.Следующий() Цикл

Список.Добавить(Выборка.Ссылка, Выборка.Наименование);

КонецЦикла;

Здесь важны два момента. Во-первых, запрос выполняется на сервере, поэтому код должен находиться в серверной процедуре или в контексте &НаСервере. Во-вторых, в условии запроса стоит отсекать помеченные на удаление и неактуальные элементы, иначе пользователь увидит «мусорные» варианты.

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

Динамическое изменение списка при изменении другого поля

Частая задача: состав вариантов зависит от уже введённых данных. Например, список договоров зависит от выбранного контрагента. В этом случае список перезаполняется в обработчике ПриИзменении управляющего поля:

&НаКлиенте

Процедура КонтрагентПриИзменении(Элемент)

ЗаполнитьСписокДоговоров();

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

&НаСервере

Процедура ЗаполнитьСписокДоговоров()

Список = Элементы.Договор.СписокВыбора;

Список.Очистить();

// запрос договоров по Объект.Контрагент и добавление в список

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

Обратите внимание: клиентский обработчик вызывает серверную процедуру, потому что запрос к данным доступен только на сервере. Каждое такое изменение — это серверный вызов, поэтому не стоит вешать перезаполнение на события, срабатывающие при каждом нажатии клавиши.

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

Если значения зависят от другого поля, часто удобнее использовать не СписокВыбора, а параметр СвязьПоВладельцу или СвязиПараметровВыбора — тогда платформа сама отфильтрует форму выбора без ручного перезаполнения и лишних серверных вызовов.
ПЗ
Практическое замечание

Альтернативы: параметры выбора и фиксированный список в конфигураторе

Программное заполнение — не единственный способ. Часть задач решается декларативно, без кода:

  • Свойство «Список выбора» в палитре свойств элемента формы — статичный перечень, задаётся один раз в конфигураторе или в расширении формы;
  • Связи параметров выбора — автоматическая фильтрация по значению другого поля (классика: договор по владельцу-контрагенту);
  • Параметры выбора — передача отбора в форму выбора, например только элементов определённой группы;
  • Быстрый выбор — свойство поля, при котором список выбора формируется платформой автоматически из данных объекта.

Способы ограничить выбор

СписокВыбора в коде

Гибкая логика, динамика, любые условия. Минус — код нужно поддерживать, а при частых изменениях полей будут лишние серверные вызовы.

Связи параметров выбора

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

Список в палитре свойств

Просто и надёжно для неизменного перечня. Не подходит, если варианты зависят от данных или прав пользователя.

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

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

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

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

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

Открытие формы
Норма

Список раскрывается и содержит ровно те значения, что добавлены в коде

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

Список пуст, содержит дубли или ошибка «Поле не найдено»

Выбор значения
Норма

Значение попадает в реквизит и сохраняется при записи объекта

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

После выбора поле остаётся пустым или возникает ошибка типа

Повторное открытие
Норма

Состав списка не меняется, дублей нет

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

Каждое открытие добавляет значения заново

Если форма типовая и дорабатывается через расширение, убедитесь, что ваш обработчик реально подключён к событию (директивы &После, &Вместо) и не конфликтует с типовым кодом, который тоже может заполнять этот список.

FAQ

Почему добавленные значения не видны в выпадающем списке?

Чаще всего код заполнения не выполняется: неверное имя элемента, обработчик не назначен событию или процедура расположена в другом модуле. Проверьте отладчиком, доходит ли выполнение до строки с Добавить(), и совпадает ли имя элемента с деревом формы.

Можно ли задать список выбора для обычной формы (не управляемой)?

Да, в обычных формах у поля ввода тоже есть свойство СписокВыбора, и синтаксис аналогичен: ЭлементыФормы.ИмяПоля.СписокВыбора.Добавить(...). Отличие в модели событий — заполнение обычно делают в ПриОткрытии.

Как добавить в список значение перечисления?

Добавляйте ссылку перечисления, а не строку: Список.Добавить(Перечисления.ВидыОпераций.Продажа, "Продажа"). Строковое значение не запишется в реквизит типа ПеречислениеСсылка.

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

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

Как очистить список выбора полностью?

Вызовите Элементы.ИмяПоля.СписокВыбора.Очистить(). После этого поле снова будет работать в штатном режиме — например, предлагать стандартную форму выбора, если она предусмотрена для типа данных.

Влияет ли программный список выбора на проверку заполнения?

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

Итог

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

Список выбора задаётся через Элементы.ИмяПоля.СписокВыбора методами Добавить, ЗагрузитьЗначения и Очистить. Заполняйте его на сервере, очищайте перед перезаполнением, следите за типом значений. Для простых связей предпочтительнее декларативные параметры и связи выбора, а типовые формы дорабатывайте через расширение.