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