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