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

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

Как обратиться к списку выбора в 1С

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

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

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

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

Где хранится список выбора и как к нему добраться

В управляемой форме список выбора привязан к конкретному элементу формы — полю ввода, полю таблицы или полю надписи с типом «поле ввода». Доступ к нему выполняется через коллекцию Элементы объекта формы. Общий шаблон обращения выглядит так:

ЭлементСписка = Элементы.Найти("ПолеСтатус");

Если ЭлементСписка <> Неопределено Тогда

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

КонецЕсли;

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

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

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

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

&НаСервере

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

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

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

Список.Добавить("Низкий", "Низкий приоритет");

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

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

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

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

Дополнительно можно отсортировать список методом СортироватьПоПредставлению() или СортироватьПоЗначению(), если порядок добавления не совпадает с желаемым порядком показа. Для небольших списков это не критично, но при динамическом формировании из запроса сортировка улучшает восприятие.

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

Как прочитать и изменить существующие значения

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

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

Изменение элемента выполняется через его свойства: Элемент.Представление = "Новый текст". Удаление — методом Удалить(Элемент) или Удалить(Индекс). Учтите, что после удаления по индексу нумерация остальных элементов сдвигается, поэтому при удалении в цикле идите от конца списка к началу.

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

Динамическое обновление списка при изменении других полей

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

&НаКлиенте

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

ЗаполнитьПодкатегории(Объект.Категория);

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

&НаСервере

Процедура ЗаполнитьПодкатегории(Категория)

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

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

// запрос к справочнику с отбором по владельцу или родителю

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

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

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

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

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

Запрос.Текст = "ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.ВидыОпераций

|ГДЕ НЕ ПометкаУдаления";

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

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

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

КонецЦикла;

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

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

Способы задать список выбора

Параметры выбора в конфигураторе

Подходит для отборов по владельцу, родителю, фиксированным условиям. Не требует кода, но не умеет сложную логику.

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

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

Свойство БыстрыйВыбор и стандартный подбор

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

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

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

Ещё одна группа проблем связана с типами: если поле ввода имеет составной тип или тип, несовместимый со значением из списка, выбранное значение не запишется в реквизит. Всегда проверяйте, что тип добавляемых значений соответствует типу данных поля. Для полей с типом «Строка» неограниченной длины список выбора работает, но при длине строки, заданной жёстко, длинные представления будут обрезаны.

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

Типичные ошибки
01
Добавление значений без Очистить() — список дублируется при каждом повторном вызове
02
Обращение к Элементы формы в чисто серверном контексте — ошибка исполнения
03
Добавление значения, тип которого не совпадает с типом поля — значение не сохраняется
04
Удаление элементов в прямом цикле по индексу — пропускаются элементы из-за сдвига нумерации
Контрольные точки

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

Открытие формы
Норма

Список раскрывается, варианты соответствуют условиям, нет дублей

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

Список пуст или значения повторяются

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

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

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

После выбора поле очищается или выводится ошибка типа

Смена родительского поля
Норма

Зависимый список перестраивается, устаревшее значение сброшено

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

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

FAQ

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

Установите у поля свойство «РежимВыбораИзСписка» в Истина и задайте СписокВыбора. Для полной надёжности добавьте проверку в обработчике ПередЗаписью: сравнивайте значение реквизита с элементами списка через НайтиПоЗначению() и отказывайте в записи при отсутствии совпадения.

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

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

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

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

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

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

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

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

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

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

Итог

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

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