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