Как в 1С задать тип значений для колонки «Список значений» в таблице на управляемой форме?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с управляемыми формами часто возникает задача создания гибких фильтров или таблиц настроек. Одной из распространенных проблем является использование колонки с составным типом данных, где одним из типов выступает СписокЗначений. Типичная ситуация: если пользователь выбирает вид сравнения «В списке», в ячейку записывается объект СписокЗначений, но при попытке добавить в него элементы система каждый раз запрашивает выбор типа данных. Это происходит потому, что стандартное свойство ОграничениеТипа элемента формы влияет только на саму ячейку, но не на внутреннее содержимое объекта списка.

В этой статье мы разберем, как правильно типизировать список значений внутри таблицы значений (ТЗ), чтобы сделать интерфейс удобным и избежать лишних диалогов выбора типа.

Почему стандартное ограничение типа не работает?

Проанализируем ситуацию: когда мы устанавливаем Элементы.ИмяКолонки.ОграничениеТипа, платформа 1С ограничивает выбор типа для значения, которое будет храниться в самой ячейке. Однако, когда в ячейку помещается СписокЗначений, он сам по себе является объектом. Стандартный редактор списка, который открывается в ячейке, «не знает» о том, что список должен содержать только ссылки на конкретный справочник, если это не указано в самом объекте списка. Если список пустой и не типизированный, платформа предлагает выбрать тип для каждого нового элемента.

Решение 1: Программная инициализация списка с установкой типа

Самый эффективный способ — подготовить объект СписокЗначений заранее, до того как пользователь начнет с ним взаимодействовать. Рассмотрим ситуацию, когда у нас есть колонка «ВидСравнения», от которой зависит тип в колонке «РезультатВыбора».

Нам необходимо перехватить момент изменения вида сравнения. Реализуем это в обработчике события ПриИзменении для поля «ВидСравнения»:


&НаКлиенте
Процедура ТаблЗначВидСравненияПриИзменении(Элемент)
    
    ТекущиеДанные = Элементы.ТаблЗнач.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если ТекущиеДанные.ВидСравнения = "В списке" Тогда
        // Создаем новый список значений
        НовыйСписок = Новый СписокЗначений;
        
        // Устанавливаем жесткую типизацию для элементов списка
        НовыйСписок.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Склады");
        
        // Записываем типизированный список в ячейку строки таблицы
        ТекущиеДанные.РезультатВыбора = НовыйСписок;
    Иначе
        // Если выбран другой вид сравнения (например, "Равно"), очищаем или ставим пустую ссылку
        ТекущиеДанные.РезультатВыбора = ПредопределенноеЗначение("Справочник.Склады.ПустаяСсылка");
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: если пользователь очистит ячейку (нажмет на «крестик»), объект списка может быть уничтожен. При повторном выборе типа «В списке» процедуру инициализации нужно повторить.

Решение 2: Обработка события «НачалоВыбора»

Иногда требуется более тонкий контроль, особенно если пользователь может редактировать уже существующий список. В этом случае мы можем управлять процессом через событие НачалоВыбора для колонки «РезультатВыбора». Это позволит нам программно открывать диалог редактирования списка с уже заданными параметрами.

Выясним, как это реализовать по шагам:

  1. Установим у элемента формы (поля ввода в колонке) обработчик события НачалоВыбора.
  2. В коде проверим, какой вид сравнения выбран.
  3. Если это «В списке», отменим стандартную обработку и вызовем выбор программно.

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

&НаКлиенте
Процедура ЗавершитьВыборСписка(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
    Если ВыбранноеЗначение <> Неопределено Тогда
        ДополнительныеПараметры.РезультатВыбора = ВыбранноеЗначение;
    КонецЕсли;
КонецПроцедуры

Альтернативные подходы

Разберем еще несколько вариантов, которые могут быть полезны в зависимости от архитектуры вашей задачи:

Таким образом, для корректной работы со списками значений в таблицах на управляемых формах необходимо всегда инициализировать объект списка программно, явно указывая его свойство ТипЗначения. Это избавляет пользователя от лишних действий и делает интерфейс профессиональным.

← На главную