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

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

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

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

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

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

Ниже разобраны оба способа с примерами кода, типичными ошибками и способами проверить, что список работает правильно. Материал ориентирован на управляемые формы (платформа 8.3), но принципы применимы и к обычным формам.

Какой способ создания списка выбора выбрать

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

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

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

Маршрут решения

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

Значения фиксированные и не зависят от данных базыЗадайте список в свойствах поля формы в конфигураторе
Значения зависят от контекста, пользователя или данных ИБФормируйте СписокВыбора программно в ПриСозданииНаСервере
Список должен перестраиваться при изменении других полейЗаполняйте его в обработчике НачалоВыбора или ПриИзменении родительского поля
Поле ссылается на справочник или документИспользуйте стандартный механизм ввода по строке и параметры выбора, а не ручной список

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

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

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

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

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

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

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

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

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

&НаСервере

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

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

КонецЦикла;

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

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

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

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

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

&НаКлиенте

Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

Если Не ЗначениеЗаполнено(Объект.Контрагент) Тогда

Возврат;

КонецЕсли;

СписокДоговоров = ПолучитьДоговорыКонтрагента(Объект.Контрагент);

Для Каждого Договор Из СписокДоговоров Цикл

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

КонецЦикла;

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

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

Список выбора для поля табличной части

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

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

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

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

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

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

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

Кнопка выпадающего списка у поля
Норма

Кнопка со стрелкой видна, список раскрывается

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

Кнопки нет — проверьте свойство КнопкаСпискаВыбора

Содержимое списка
Норма

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

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

Дубли значений — список не очищался перед заполнением

Сохранение выбранного значения
Норма

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

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

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

Поведение при пустом контексте
Норма

Список пуст или показывает нейтральный набор

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

Ошибка исполнения при незаполненном связанном поле

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

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

Альтернативы списку выбора

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

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

Список выбора

Быстрый выбор из короткого фиксированного перечня. Не подходит для длинных списков и ссылочных данных с поиском

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

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

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

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

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

Когда отбор одного поля зависит от другого (договор от контрагента). Работает без программирования в простых сценариях

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

Итог

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

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

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

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

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

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

Установите у поля свойство РедактированиеТекста в «Нет» — тогда пользователь сможет только выбрать значение из списка. Дополнительно можно контролировать ввод в обработчике ОбработкаВыбора или при записи объекта, проверяя значение через СписокВыбора.НайтиПоЗначению().

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

Да. У метода Добавить() третий параметр — картинка из библиотеки картинок или общей картинки конфигурации: СписокВыбора.Добавить(Значение, "Представление", , БиблиотекаКартинок.Провести). Картинки отображаются слева от пункта в выпадающем списке.

Список выбора работает в толстом клиенте, но пустой в веб-клиенте. В чём причина?

Чаще всего код заполнения расположен в клиентском обработчике с обращением к данным, недоступным на клиенте, или использует директивы компиляции, исключающие выполнение в веб-клиенте. Перенесите получение данных в серверную процедуру и проверьте директивы &НаКлиенте / &НаСервере.

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

Используйте метод СортироватьПоЗначению() или СортироватьПоПредставлению() объекта СписокЗначений после заполнения. Если список строится запросом, проще добавить упорядочивание в текст запроса через предложение УПОРЯДОЧИТЬ ПО.

Нужно ли дорабатывать конфигурацию, чтобы добавить список выбора в типовой форме?

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