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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Ошибка 1: Неправильный тип реквизита формы

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

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

Решение: Реквизит, значение которого должно отображаться в поле, должен иметь простой тип (например, Строка, Число или СправочникСсылка), а объект СписокЗначений используется лишь как временный контейнер для заполнения выпадающего списка.

Пошаговая настройка выпадающего списка

Рассмотрим правильный алгоритм действий для реализации выбора из фиксированного набора значений:

  1. Создадим реквизит формы ВидОрганизации с типом Строка (длина 10).
  2. Вынесем его на форму. У элемента формы (Поле ввода) установим свойство КнопкаВыпадающегоСписка в значение Да.
  3. Если мы хотим запретить ввод текста с клавиатуры и оставить только выбор из предложенных вариантов, установим свойство РежимВыбораИзСписка в значение Истина — для этого подойдёт настройка контроля ввода и видимости элементов.

Теперь разберем (поможет консоль кода и инструменты разработчика 1С), как заполнить этот список программно в событии ПриСозданииНаСервере, чтобы не перегружать клиентские вызовы:


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

Ошибка 2: Несоответствие типов данных

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


// ОШИБОЧНЫЙ КОД
Для Каждого СсылкаИзЗапроса Из РезультатЗапроса Цикл
    // Здесь мы добавляем в значение строку (наименование), а реквизит ждет Ссылку
    Элементы.Организация.СписокВыбора.Добавить(СсылкаИзЗапроса.Наименование); 
КонецЦикла;

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


// КОРРЕКТНЫЙ КОД
Для Каждого СтрокаДанных Из РезультатЗапроса Цикл
    Элементы.Организация.СписокВыбора.Добавить(СтрокаДанных.Ссылка, СтрокаДанных.Наименование);
КонецЦикла;

Динамическое заполнение через событие НачалоВыбора

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


&НаКлиенте
Процедура ПодразделениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отключаем стандартный поиск/выбор из справочника
    СтандартнаяОбработка = Ложь;
    
    // Создаем список значений для выбора
    Список = Новый СписокЗначений;
    Список.Добавить(ПредопределенноеЗначение("Справочник.Подразделения.Основное"), "Основной отдел");
    Список.Добавить(ПредопределенноеЗначение("Справочник.Подразделения.Администрация"), "Администрация");
    
    // Передаем сформированный список в параметр ДанныеВыбора
    ДанныеВыбора = Список;
    
КонецПроцедуры

Обратите внимание на параметр ДанныеВыбора. В современных версиях платформы 8.3 (особенно в интерфейсе "Такси") это наиболее правильный способ передачи списка значений в момент нажатия на кнопку выбора. Если вы просто очищаете и заполняете Элементы.ИмяПоля.СписокВыбора внутри этого события, это может привести к визуальным задержкам или дублированию строк в интерфейсе.

Особенности свойства "Режим выбора из списка" в новых версиях платформы

Рассмотрим нюанс, упомянутый опытными разработчиками: в последних релизах платформы свойство РежимВыбораИзСписка может конфликтовать с программным заполнением через ДанныеВыбора. Если вы программно формируете список в событии НачалоВыбора, попробуйте снять галочку Режим выбора из списка в свойствах элемента формы в конфигураторе. При этом не забудьте установить СтандартнаяОбработка = Ложь в коде, чтобы системное окно выбора не перекрывало ваш список.

Итоги и рекомендации

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

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

← На главную