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