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