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