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

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

Как заполнить список выбора в 1С

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

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

Частая путаница возникает из-за того, что «список выбора» в 1С может означать три разные вещи: свойство «Список выбора» элемента формы, объект типа «СписокЗначений» во встроенном языке и свойство «Быстрый выбор» / «Список выбора» у реквизита объекта метаданных. Ниже разобраны все три сценария с примерами кода, которые можно перенести в свою конфигурацию практически без изменений.

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

Что такое список выбора и где он применяется

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

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

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

Заполнение списка выбора в конфигураторе

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

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

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

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

Программное заполнение через СписокЗначений

Когда состав вариантов зависит от данных — например, от заполненности справочника или прав пользователя, — список формируется кодом. Базовый приём: создать объект «СписокЗначений», добавить в него элементы методом Добавить() и присвоить его свойству «СписокВыбора» поля формы.

&НаСервере

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

СписокОпераций = Новый СписокЗначений;

СписокОпераций.Добавить("Продажа", "Продажа товаров");

СписокОпераций.Добавить("Возврат", "Возврат от покупателя");

СписокОпераций.Добавить("Перемещение", "Перемещение между складами");

Элементы.ВидОперации.СписокВыбора.ЗагрузитьЗначения(

СписокОпераций.ВыгрузитьЗначения());

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

Метод Добавить() принимает до четырёх параметров: значение, представление, пометка, картинка. Представление — это то, что видит пользователь; значение — то, что реально записывается в реквизит. Разделять их полезно, когда значение должно быть техническим (код, GUID), а подпись — понятной человеку.

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

Типичные ошибки
01
Заполнение списка без Очистить() — при повторном открытии или обновлении формы значения дублируются
02
Присвоение массива напрямую свойству СписокВыбора — типы несовместимы, нужна ЗагрузитьЗначения()
03
Заполнение списка в клиентском обработчике обращением к серверным данным без вызова сервера — ошибка контекста
04
Хранение в значении сложного объекта вместо простого типа — поле ввода не сможет отобразить выбранное значение

Заполнение списка из справочника или запроса

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

&НаСервере

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

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

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

"ВЫБРАТЬ

| Склады.Ссылка КАК Склад,

| Склады.Наименование КАК Наименование

|ИЗ

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

|ГДЕ

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

|УПОРЯДОЧИТЬ ПО

| Наименование";

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

СписокСкладов.Очистить();

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

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

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

КонецЦикла;

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

Учитывайте, что запрос выполняется на сервере, поэтому процедуру заполнения следует размещать в серверном контексте (&НаСервере) и вызывать из клиентских обработчиков через серверный вызов. При большом количестве записей список выбора становится неудобным: для сотен элементов лучше использовать обычный выбор из справочника с отбором, а не список.

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

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

&НаКлиенте

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

ОбновитьСписокВалют(Объект.Категория);

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

&НаСервере

Процедура ОбновитьСписокВалют(Категория)

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

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

Если Категория = "Экспорт" Тогда

Список.Добавить("USD", "Доллар США");

Список.Добавить("EUR", "Евро");

Иначе

Список.Добавить("RUB", "Российский рубль");

КонецЕсли;

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

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

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

Проверка результата и границы самостоятельной работы

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

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

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

Открытие списка
Норма

Выпадает ожидаемый набор значений в нужном порядке

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

Список пуст, дублируется или содержит лишние строки

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

В реквизит записывается именно значение, а не представление

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

В поле попадает служебный код или значение не сохраняется

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

Состав списка идентичен первому открытию

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

Значения дублируются с каждым открытием

Смена связанного поля
Норма

Список перестраивается, старое значение очищается или остаётся валидным

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

Остаётся значение, отсутствующее в новом списке

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

Какой способ выбрать

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

Свойство в конфигураторе

Подходит для фиксированного короткого набора значений; не требует кода, но меняется только через обновление конфигурации

Программный СписокЗначений

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

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

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

Выбор из справочника с отбором

Лучше для больших и пополняемых наборов; список выбора здесь неудобен и медленно читается пользователем

Краткое правило: фиксированные варианты в одной форме — свойство элемента; варианты, зависящие от данных или контекста, — программное заполнение; единый системный набор — перечисление; сотни записей из базы — стандартный выбор из справочника.

Итог

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

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

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

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

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

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

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

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

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

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

У элемента формы установите свойство «РежимВыбораИзСписка» в значение Истина, а «КнопкаСпискаВыбора» включите. Тогда поле будет принимать только значения из списка, а ручной ввод произвольного текста станет невозможен.

Как в списке выбора показать понятную подпись, а записать техническое значение?

Используйте второй параметр метода Добавить(): первый — значение, которое попадёт в реквизит, второй — представление, которое увидит пользователь. Например: Список.Добавить("USD", "Доллар США").

Сколько элементов разумно помещать в список выбора?

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