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