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