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