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