Как ограничить тип данных в ячейке таблицы значений в зависимости от другой колонки?

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

При разработке интерфейсов и обработке табличных данных часто возникает задача: в зависимости от выбранного значения в одной колонке (например, вида настройки, типа реквизита или параметра) ограничить или изменить тип данных для ввода значения в соседней колонке той же строки.

Разберем особенности работы платформы 1С:Предприятие с типами в объекте ТаблицаЗначений и на управляемой форме, а также рассмотрим по шагам варианты реализации такого поведения.

Особенности типизации таблицы значений на уровне данных и формы

Для начала проанализируем, как устроен объект ТаблицаЗначений в оперативной памяти:

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

Способ 1. Динамическая настройка элемента формы через ОграничениеТипа

Если таблица значений отображается на форме, мы можем гибко управлять поведением поля ввода в зависимости от активной строки. Для этого используем свойство элемента формы ОграничениеТипа.

Посмотрим на пример реализации в событиях таблицы управляемой формы:


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

Чтобы платформа не предлагала пользователю диалог выбора типа при начале редактирования, рекомендуется отключить свойство ВыбиратьТип у соответствующего элемента формы:

Элементы.ТаблицаНастроекЗначение.ВыбиратьТип = Ложь;

Способ 2. Приведение значения при изменении колонки-источника

Когда пользователь меняет значение в колонке-источнике, значение в зависимой колонке должно быть скорректировано под новый тип. Выясним причину: если оставить старое значение (например, строку), а тип переключить на ссылку справочника, данные станут некорректными.

Для корректного преобразования используем метод ОписаниеТипов.ПривестиЗначение() либо прямую запись значения по умолчанию нужного типа.

Рассмотрим пример обработчика события ПриИзменении для первой колонки:


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

Способ 3. Переопределение события НачалоВыбора

В ситуациях, когда требуется более тонкая логика подбора или нестандартные формы выбора, удобнее полностью перехватить стандартную обработку выбора значения:

  1. В обработчике события НачалоВыбора поля зависимой колонки устанавливаем параметр СтандартнаяОбработка = Ложь.
  2. Анализируем тип строки и программно открываем нужную форму выбора через ОткрытьФорму с необходимыми параметрами отбора.

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

Использование механизма «Связь по типу»

Если в конфигурации используется объект метаданных План видов характеристик, ручное написание кода можно свести к минимуму. Когда колонка-источник ссылается на элемент плана видов характеристик, а зависимая колонка имеет тип Характеристика.[ИмяПВХ], достаточно в палитре свойств элемента формы зависимой колонки заполнить свойство Связь по типу, указав путь к реквизиту-источнику. В этом случае платформа автоматически ограничит типы и форматы ввода для каждой строки без дополнительного кода.

← На главную