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

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

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

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

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

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

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

Объект СписокЗначений: базовые методы

Тип СписокЗначений — универсальная коллекция пар «значение + представление». Именно этот тип используется в свойстве СписокВыбора полей ввода. Основные методы, которые нужны для заполнения:

  • Добавить(Значение, Представление, Пометка, Картинка) — добавляет элемент; представление можно опустить, тогда показывается строковое представление значения;
  • Очистить() — удаляет все элементы, обязателен перед повторным заполнением;
  • Вставить(Индекс, Значение) — вставляет элемент в нужную позицию;
  • Удалить(ЭлементИлиИндекс) — удаляет конкретный элемент;
  • НайтиПоЗначению(Значение) — проверяет, есть ли значение в списке;
  • СортироватьПоПредставлению() — упорядочивает элементы по алфавиту.

Простейший пример — создание списка «с нуля» в произвольном алгоритме:

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

Список.Добавить("Нал", "Наличный расчёт");

Список.Добавить("Безнал", "Безналичный расчёт");

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

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

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

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

Процедура ПриОткрытии()

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

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Склады ГДЕ НЕ ПометкаУдаления";

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

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

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

КонецЦикла;

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

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

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

Заполнение списка выбора в управляемой форме

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

&НаСервере

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

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

СписокВыбора.Очистить();

СписокВыбора.Добавить("Продажа", "Продажа товаров");

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

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

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

Если нужно заполнить список по данным объекта (например, договоры выбранного контрагента), логику удобно вынести в отдельную серверную процедуру и вызывать её и при создании формы, и при изменении контрагента:

&НаКлиенте

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

ЗаполнитьДоговорыНаСервере();

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

&НаСервере

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

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

СписокДоговоров.Очистить();

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Договоры ГДЕ Владелец = &Контрагент";

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

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

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

СписокДоговоров.Добавить(Выборка.Ссылка);

КонецЦикла;

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

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

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

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

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

Дополнительно полезно проверять, осталось ли текущее значение реквизита в новом списке. Если пользователь выбрал договор, а затем сменил контрагента, старое значение может стать недопустимым. Типовое решение — очистить реквизит или предупредить пользователя:

Если ЗначениеЗаполнено(Объект.Договор)

И СписокДоговоров.НайтиПоЗначению(Объект.Договор) = Неопределено Тогда

Объект.Договор = Неопределено;

КонецЕсли;

Проверка результата и отладка

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

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

Для отладки удобно временно выводить количество элементов: Сообщить("Элементов в списке: " + СписокВыбора.Количество());. Это быстро показывает, выполняется ли заполнение вообще.

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

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

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

Открывается и содержит нужные варианты без дублей

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

Пустой, содержит устаревшие или повторяющиеся элементы

Значение после выбора
Норма

В реквизит записалось значение нужного типа (ссылка, перечисление)

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

Записалась строка вместо ссылки или значение не соответствует выбранному

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

Список перестраивается под новое условие

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

Варианты остаются от прежнего условия, старое значение не сбрасывается

Типичные ошибки и ограничения

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

Третья ошибка — попытка изменить СписокВыбора колонки табличной части через Элементы.ТабличнаяЧасть.ТекущиеДанные. Список выбора принадлежит элементу формы (колонке), а не данным строки, поэтому обращаться нужно к элементу колонки: Элементы.ТоварыНоменклатура.СписокВыбора.

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

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

Альтернативы программному заполнению

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

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

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

Программный СписокВыбора

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

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

Для фиксированных вариантов; не требует кода, но не реагирует на данные

ПараметрыВыбора и связи

Для ссылочных полей с фильтрацией в форме выбора; не даёт мгновенного выпадающего списка

FAQ

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

Переберите значения через метаданные: Для Каждого Зн Из Перечисления.ВидыОпераций Цикл Список.Добавить(Зн); КонецЦикла;. На практике для поля типа перечисления список формируется автоматически, и ручное заполнение обычно не нужно.

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

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

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

Установите у поля свойство РежимВыбораИзСписка в Истина — в палитре свойств или кодом: Элементы.Поле.РежимВыбораИзСписка = Истина;. Тогда пользователь сможет выбрать только значение из списка.

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

Обратитесь к элементу колонки, а не к данным строки: Элементы.ТоварыЦена.СписокВыбора.Добавить(...). Список действует на всю колонку; сделать разные списки для разных строк стандартными средствами нельзя.

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

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

Можно ли добавить в список картинки?

Да, четвёртым параметром метода Добавить передаётся картинка из библиотеки картинок: Список.Добавить(Значение, "Текст", , БиблиотекаКартинок.Справочник);. Поддержка отображения зависит от вида поля и клиента.

Итог

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

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