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