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