При разработке интерфейсов на управляемых формах 1С начинающие разработчики часто сталкиваются с ситуацией: пользователь выбирает значение из выпадающего списка, но после выбора поле остается пустым или значение исчезает сразу после записи документа — для этой задачи есть инструмент улучшения подбора и ввода в формах. Рассмотрим подробно, почему это происходит, разберем типичные ошибки проектирования реквизитов и выясним, как правильно реализовать выбор из списка программно.
Проанализируем самую распространенную причину проблемы. Часто разработчик создает реквизит формы (например, ВидОрганизации) и назначает ему тип СписокЗначений, полагая, что раз в поле будет список для выбора, то и тип данных должен быть соответствующим. Это в корне неверно.
Объект СписокЗначений в 1С — это коллекция, предназначенная для хранения множества элементов. Если вы привязываете поле ввода на форме к реквизиту типа СписокЗначений, система ожидает, что вы будете редактировать весь список сразу, а не выбирать из него одну конкретную строку. В результате, когда вы пытаетесь выбрать одно значение («ИП» или «ООО»), платформа не понимает, куда именно внутри коллекции его записать, и поле визуально очищается. Для решения проблем заполнения есть модуль управления логикой и правилами ввода реквизитов.
Решение: Реквизит, значение которого должно отображаться в поле, должен иметь простой тип (например, Строка, Число или СправочникСсылка), а объект СписокЗначений используется лишь как временный контейнер для заполнения выпадающего списка.
Рассмотрим правильный алгоритм действий для реализации выбора из фиксированного набора значений:
ВидОрганизации с типом Строка (длина 10).Теперь разберем (поможет консоль кода и инструменты разработчика 1С), как заполнить этот список программно в событии ПриСозданииНаСервере, чтобы не перегружать клиентские вызовы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Очищаем текущий список выбора элемента формы
Элементы.ВидОрганизации.СписокВыбора.Очистить();
// Добавляем значения
Элементы.ВидОрганизации.СписокВыбора.Добавить("ИП", "Индивидуальный предприниматель");
Элементы.ВидОрганизации.СписокВыбора.Добавить("ООО", "Общество с ограниченной ответственностью");
КонецПроцедуры
Выясним еще одну причину, по которой значение может не отображаться. Это происходит, когда тип значения в СписокВыбора не совпадает с типом самого реквизита. Например, ваш реквизит имеет тип СправочникСсылка.Организации, а в код добавления значений вы написали следующее:
// ОШИБОЧНЫЙ КОД
Для Каждого СсылкаИзЗапроса Из РезультатЗапроса Цикл
// Здесь мы добавляем в значение строку (наименование), а реквизит ждет Ссылку
Элементы.Организация.СписокВыбора.Добавить(СсылкаИзЗапроса.Наименование);
КонецЦикла;
В этом случае платформа не сможет сопоставить выбранную строку с типом ссылки, и поле останется пустым. Проанализируем правильный подход. При добавлении элемента в список методом Добавить(), первый параметр — это Значение (оно должно соответствовать типу реквизита), а второй параметр — Представление (то, что увидит пользователь).
// КОРРЕКТНЫЙ КОД
Для Каждого СтрокаДанных Из РезультатЗапроса Цикл
Элементы.Организация.СписокВыбора.Добавить(СтрокаДанных.Ссылка, СтрокаДанных.Наименование);
КонецЦикла;
Если список значений должен зависеть от других данных на форме (например, список подразделений зависит от выбранной организации), мы используем событие НачалоВыбора. Здесь важно правильно управлять стандартной обработкой.
&НаКлиенте
Процедура ПодразделениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартный поиск/выбор из справочника
СтандартнаяОбработка = Ложь;
// Создаем список значений для выбора
Список = Новый СписокЗначений;
Список.Добавить(ПредопределенноеЗначение("Справочник.Подразделения.Основное"), "Основной отдел");
Список.Добавить(ПредопределенноеЗначение("Справочник.Подразделения.Администрация"), "Администрация");
// Передаем сформированный список в параметр ДанныеВыбора
ДанныеВыбора = Список;
КонецПроцедуры
Обратите внимание на параметр ДанныеВыбора. В современных версиях платформы 8.3 (особенно в интерфейсе "Такси") это наиболее правильный способ передачи списка значений в момент нажатия на кнопку выбора. Если вы просто очищаете и заполняете Элементы.ИмяПоля.СписокВыбора внутри этого события, это может привести к визуальным задержкам или дублированию строк в интерфейсе.
Рассмотрим нюанс, упомянутый опытными разработчиками: в последних релизах платформы свойство РежимВыбораИзСписка может конфликтовать с программным заполнением через ДанныеВыбора. Если вы программно формируете список в событии НачалоВыбора, попробуйте снять галочку Режим выбора из списка в свойствах элемента формы в конфигураторе. При этом не забудьте установить СтандартнаяОбработка = Ложь в коде, чтобы системное окно выбора не перекрывало ваш список.
Подведем итог нашему анализу. Чтобы выбранное значение корректно отображалось и сохранялось, придерживайтесь следующих правил:
СписокЗначений.Добавить(), должно строго соответствовать типу реквизита.Добавить() для вывода понятного текста пользователю, сохраняя техническую сущность (ссылку) в первом параметре.Очистить(), чтобы избежать дублирования элементов при повторном открытии списка.НаСервере при создании формы, динамические — через ДанныеВыбора в событии НачалоВыбора.Соблюдение этих принципов гарантирует стабильную работу интерфейса и корректное отображение данных в ваших решениях на базе 1С:Предприятие — есть готовая автоматическая проверка и контроль корректности ввода реквизитов.