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