Как вывести картинку вместо флажка (Булево) в колонке Дерева Значений с помощью условного оформления или настроек свойств?

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

При разработке интерфейсов на управляемых формах 1С мы часто сталкиваемся с задачей визуализации статусов. Стандартное поведение платформы для полей с типом Булево — отображение в виде флажка (галочки). Однако, нередко возникают ситуации, когда вместо скучного флажка нам необходимо вывести смысловую пиктограмму (например, крестик для отмены, восклицательный знак для внимания или специфическую иконку статуса) (поможет универсальная обработка установки пиктограмм в списках), сохраняя при этом логику работы с данными.

В этой статье мы подробно разберем проблему, с которой столкнулся автор темы: попытка заменить отображение булевого реквизита на картинку через УсловноеОформление не приводила к желаемому результату — цвет ячейки менялся, но картинка не появлялась. Мы проанализируем причины такого поведения и рассмотрим несколько способов решения этой задачи: от простого "обходного" пути до архитектурно правильных подходов. Для визуализации данных в интерфейсе также подойдёт решение для вывода изображений и остатков в списках.

Суть проблемы: конфликт типов отображения

Давайте разберемся, почему стандартный код условного оформления часто не срабатывает для колонок типа Булево. Когда мы добавляем булеву колонку в ДеревоЗначений или ТаблицуЗначений на форму, платформа автоматически присваивает элементу формы вид "Поле флажка" — для этого пригодится инструмент вывода картинок в колонках дерева значений.

Если мы пытаемся применить условное оформление следующим образом:


ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// ... настройка отбора ...
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.Ошибка);

Мы ожидаем увидеть картинку. Но приоритет отрисовки контрола "Поле флажка" выше, чем у параметра "Картинка" из условного оформления, если не заданы дополнительные параметры скрытия самого флажка. Платформа продолжает рисовать контрол для ввода булевого значения. Более того, даже если мы меняем свойства положения картинки, результат может оставаться нулевым, так как ячейка занята "флажком".

Рассмотрим несколько рабочих стратегий, которые упрощают решение этой задачи — есть готовая обработка для замены стандартных флажков на пиктограммы.

Способ 1. Создание отдельной колонки типа "Картинка" (Решение автора)

Это решение, к которому пришел автор обсуждения, является надежным и простым в реализации, хотя и требует внесения изменений в структуру данных ДереваЗначений.

Идея заключается в том, чтобы не бороться с отображением булевой колонки, а создать рядом (или вместо нее) колонку, предназначенную специально для хранения и вывода изображений.

Алгоритм действий:

  1. В реквизиты объекта (или программно в ДеревоЗначений) добавляем колонку, например, КартинкаСтатуса.
  2. Тип данной колонки должен быть не Булево, а Картинка (или произвольный, если заполняем программно).
  3. При заполнении дерева значений мы анализируем наши логические условия и сразу помещаем нужную картинку в эту ячейку.

Пример программного заполнения дерева:


// Создаем дерево и колонки (если это происходит программно)
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("НеПроизводим", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("КартинкаМатериал", Новый ОписаниеТипов("Картинка"));

// Заполняем строку
НоваяСтрока = Дерево.Строки.Добавить();
НоваяСтрока.НеПроизводим = Истина;

// Логика выбора картинки
Если НоваяСтрока.НеПроизводим Тогда
    НоваяСтрока.КартинкаМатериал = БиблиотекаКартинок.ОформлениеКрест; // Или другая картинка
Иначе
    НоваяСтрока.КартинкаМатериал = БиблиотекаКартинок.ВыполненоУспешно;
КонецЕсли;

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

Способ 2. Использование коллекции картинок и числового индекса (Рекомендуемый)

Если строк в дереве много, хранить в каждой ячейке объект типа Картинка может быть неэффективно. Более профессиональным подходом является использование механизма КартинкаЗначений.

Этот способ позволяет выводить разные иконки, опираясь на числовое значение в ячейке. Это работает быстрее, чем условное оформление, и проще в поддержке, чем отдельные объекты картинок.

Пошаговая реализация:

  1. Подготовка колонки данных: Вместо типа Булево или Картинка используйте тип Число. Например, назовем колонку СтатусЧислом.
    • 0 — состояние "Ложь" (пусто или одна иконка).
    • 1 — состояние "Истина" (другая иконка).
  2. Подготовка картинки: Нам понадобится специальная "склеенная" картинка (коллекция), где в ряд расположены нужные нам иконки. В стандартной библиотеке картинок есть такие коллекции, либо можно загрузить свою коллекцию картинок.
  3. Настройка элемента формы:
    • Выносим колонку СтатусЧислом на форму.
    • В свойствах этого поля находим свойство КартинкаЗначений (PictureValues).
    • Выбираем там нашу коллекцию картинок.
    • Убираем отображение текста (свойство ОтображатьТекст = Ложь), если цифры нам не нужны.

Теперь при заполнении дерева нам достаточно писать в колонку просто число:


// 0 - будет показана первая картинка из коллекции (или пусто, если коллекция прозрачная в начале)
// 1 - будет показана вторая картинка из коллекции
НоваяСтрока.СтатусЧислом = ?(УсловиеВыполнено, 1, 0);

Платформа сама "вырежет" нужный кусочек из коллекции картинок согласно индексу и отобразит его. Это самый быстрый способ отрисовки списков.

Способ 3. Использование свойства "ПутьКДаннымКартинки"

Рассмотрим ситуацию, когда мы хотим оставить текстовое описание в колонке, но добавить иконку рядом (слева или справа). Для этого удобно использовать свойство ПутьКДаннымКартинки.

  1. Добавить в таблицу служебную колонку (реквизит), например ИндексИконки (Число).
  2. У основной колонки, которую видит пользователь, в свойстве ПутьКДаннымКартинки указать путь к этому реквизиту: ПФДерево.ИндексИконки.
  3. В свойстве таблицы КартинкаСтрок выбрать коллекцию картинок.

В этом случае платформа будет брать индекс из скрытой служебной колонки и подставлять картинку из коллекции рядом с текстом основной колонки.

Способ 4. Добиваемся работы Условного Оформления

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

Как мы выяснили в начале, просто установить картинку недостаточно. Чтобы картинка отобразилась вместо флажка, в настройках условного оформления нужно задать комбинацию параметров. Давайте посмотрим, как это должно выглядеть в коде:


ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// 1. Устанавливаем отбор
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПФДерево.НеПроизводим");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементОтбора.Использование = Истина;

// 2. Указываем оформляемое поле
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ПФДеревоГотовность");

// 3. Настраиваем ПАРАМЕТРЫ оформления
// Сама картинка
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Картинка", БиблиотекаКартинок.ОформлениеКрест);

// ОБЯЗАТЕЛЬНО: Принудительно включаем вывод картинки
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ОтображатьКартинку", Истина);

// ВАЖНО: Скрываем стандартный флажок, иначе он перекроет картинку или картинка не появится
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ОтображатьФлажок", Ложь);

// Желательно также очистить текст, чтобы не было наложения
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", "");
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ОтображатьТекст", Ложь);

Обратите внимание: параметр ОтображатьФлажок является ключевым при работе с булевыми колонками. Без его установки в значение Ложь платформа будет пытаться рендерить стандартный чекбокс.

Резюме

Мы проанализировали несколько путей решения задачи:

Выбор конкретного метода зависит от контекста вашей задачи, но понимание того, как платформа управляет отрисовкой элементов формы, позволит избежать долгих часов отладки — для управления бизнес-правилами интерфейса удобно использовать расширение для настройки элементов управляемых форм.

Рекомендуемые публикации:

← На главную