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

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

1С: как сделать список выбора на форме

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

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

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

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

Способы создания списка выбора: что выбрать

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

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

Сравнение вариантов

Свойство «Список выбора» реквизита

Подходит для редко меняющегося набора строк. Не требует кода, но варианты жёстко зашиты в метаданных.

Программное заполнение СписокВыбора

Гибкий вариант: список можно строить из запроса, по условиям и правам. Требует кода в модуле формы.

Перечисление

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

Справочник с параметрами выбора

Когда вариантов много или они редактируются пользователями. Список выбора заменяется формой выбора с отбором.

Статический список выбора через свойства реквизита

Самый быстрый способ — задать список выбора непосредственно в конфигураторе. Откройте нужный объект (документ, справочник, обработку), найдите реквизит со строковым типом и откройте палитру его свойств. Найдите свойство «Список выбора» и нажмите кнопку выбора справа — откроется редактор, куда можно добавить строки по одной.

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

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

Порядок действий
  1. 1
    Откройте конфигуратор и найдите нужный объект метаданных (документ, справочник, обработку).
  2. 2
    Выделите реквизит строкового типа и откройте палитру свойств (Alt + Enter).
  3. 3
    Найдите свойство «Список выбора», нажмите кнопку выбора и добавьте нужные значения с представлениями.
  4. 4
    Сохраните конфигурацию и обновите конфигурацию базы данных (F7).
  5. 5
    Откройте форму объекта в режиме 1С:Предприятие и проверьте, что список выпадает при вводе.

Программное заполнение списка выбора на форме

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

&НаСервере

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

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

СписокПолей.Очистить();

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

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

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

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

Метод Добавить принимает значение и необязательное представление. Если нужно ограничить ввод только вариантами из списка, дополнительно установите у элемента свойства РежимВыбораИзСписка = Истина и КнопкаВыпадающегоСписка = Истина — тогда поле превратится в классический выпадающий список без возможности произвольного ввода.

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

bsl
Элементы.Статус.СписокВыбора.Добавить("Новый", "Новый заказ");
Элементы.Статус.РежимВыбораИзСписка = Истина;
Элементы.Статус.КнопкаВыпадающегоСписка = Истина;

Динамический список выбора по условию

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

&НаКлиенте

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

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

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

&НаСервере

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

Элементы.Склад.СписокВыбора.Очистить();

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

"ВЫБРАТЬ Склады.Ссылка КАК Склад

|ИЗ Справочник.Склады КАК Склады

|ГДЕ Склады.Владелец = &Организация

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

Запрос.УстановитьПараметр("Организация", Объект.Организация);

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

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

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

КонецЦикла;

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

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

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

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

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

&НаСервере

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

Параметр = Новый ПараметрВыбора("Отбор.ПометкаУдаления", Ложь);

МассивПараметров = Новый Массив;

МассивПараметров.Добавить(Параметр);

Элементы.Контрагент.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

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

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

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

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

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

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

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

Выпадающий список на форме
Норма

При нажатии кнопки или вводе первых символов появляются все заданные варианты

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

Список пуст или появляется только после повторного открытия формы

Сохранение значения
Норма

Выбранное значение записывается и отображается после перезаписи объекта

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

После записи поле пустое или значение обрезано

Динамический список
Норма

При смене управляющего поля варианты обновляются без дублей

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

Варианты накапливаются или не соответствуют новому условию

Ограничения и когда нужен другой подход

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

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

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

Частые вопросы

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

Установите у элемента формы свойства РежимВыбораИзСписка = Истина и КнопкаВыпадающегоСписка = Истина. Для полной надёжности добавьте проверку в ОбработкаПроверкиЗаполнения объекта, потому что интерфейсное ограничение не защищает от программной записи произвольного значения.

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

Чаще всего код размещён в клиентском обработчике, где серверные данные недоступны, либо процедура заполнения не вызывается. Проверьте директиву компиляции (&НаСервере), поставьте точку останова и убедитесь, что процедура выполняется, а элемент формы с таким именем существует.

Можно ли сделать список выбора для реквизита типа «СправочникСсылка»?

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

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

Обратитесь к колонке таблицы через Элементы — у колонки поля ввода тоже есть свойство СписокВыбора. Заполните его в ПриСозданииНаСервере, и варианты будут доступны при редактировании ячеек этой колонки.

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

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

Сохранится ли программно заполненный список при переоткрытии формы?

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

Итог

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

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