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