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