При разработке отчетов на системе компоновки данных (СКД) часто возникает задача визуализировать состояние данных с помощью иконок. В обычных формах списков это решается просто: мы указываем общую картинку-коллекцию для колонки и привязываем индекс картинки к числовому полю. Однако в СКД привычный механизм ПутьКДаннымКартинкиСтроки и КартинкаСтрок отсутствует. Разберем подробно, как можно обойти это ограничение, используя стандартные средства настройки отчета, и проанализируем возможности современных версий платформы.
Давайте разберем ситуацию. В платформе 1С объект ОбщаяКартинка может представлять собой как одиночное изображение, так и «ленту» (коллекцию), состоящую из нескольких кадров одинакового размера. В интерфейсе настройки условного оформления СКД мы можем выбрать картинку из библиотеки, но платформа не предоставляет стандартного поля для ввода числового индекса кадра. Если мы просто выберем коллекцию, система либо выведет ее целиком (что выглядит как сжатая полоса иконок), либо не выведет ничего, если тип данных поля не совпадает.
Это связано с тем, что механизм условного оформления в СКД ориентирован на статические значения свойств оформления для определенных условий. Поэтому нам придется использовать обходные пути, чтобы заставить систему отображать нужный нам «кадр».
Рассмотрим самый доступный способ, который не требует изменения метаданных или написания функций в общих модулях. Этот метод идеально подходит, если количество картинок в вашей коллекции невелико (например, статусы «Новый», «В работе», «Завершен»).
Алгоритм настройки:
СтатусИндекс).Картинка.СтатусИндекс Равно 0.Проанализируем этот подход: он полностью «бескодовый», но при большом количестве картинок (например, 50-100) становится крайне трудоемким в поддержке. Если коллекция изменится, придется перенастраивать каждое правило.
Если мы хотим упростить работу в самой СКД, стоит рассмотреть вариант подготовки графических ресурсов. Разберем, как это сделать:
Вместо одной ОбщейКартинки, содержащей 10 кадров, создадим 10 отдельных объектов ОбщаяКартинка (например, Статус_Новый, Статус_ВРаботе и т.д.). В этом случае в условном оформлении нам будет гораздо проще ориентироваться, выбирая конкретные объекты из библиотеки картинок конфигурации. Это избавляет от необходимости «выкусывать» кадр из коллекции внутри диалогов СКД.
Выясним, что добавила платформа в последних обновлениях. Начиная с версии 8.3.16, в библиотеку стилей оформления СКД были добавлены готовые наборы картинок. Рассмотрим их подробнее. Теперь для условного оформления доступны следующие предопределенные картинки:
ОформлениеКругЗеленый, ОформлениеКругЖелтый, ОформлениеКругКрасный (удобно для светофоров).ОформлениеСтрелкаВверхЗеленая, ОформлениеСтрелкаВнизКрасная (для динамики показателей).ОформлениеФлажок, ОформлениеКрест, ОформлениеВосклицательныйЗнак.Если ваша задача — просто отобразить стандартный статус или индикатор, мы настоятельно рекомендуем использовать именно эти системные картинки. Они корректно масштабируются и не требуют создания собственных коллекций в метаданных.
Хотя автор темы просил решение «без кода», проанализируем ситуацию, когда индексов слишком много. В СКД можно использовать Вычисляемые поля, которые могут возвращать объект типа Картинка. Однако встроенных функций для работы с индексами коллекций в языке выражений СКД нет. Поэтому нам потребуется создать одну вспомогательную функцию в общем модуле.
Создадим в общем модуле (с флагами «Сервер», «Внешнее соединение») функцию:
Функция ПолучитьКартинкуСтатуса(Индекс) Экспорт
Коллекция = БиблиотекаКартинок.МояКоллекцияСтатусов;
// В платформе нет прямого метода Получить(Индекс) для объекта Картинка,
// если это коллекция, но мы можем использовать УсловноеОформление
// или заранее подготовленный массив картинок.
// Если это предопределенные картинки, можно использовать структуру:
Если Индекс = 0 Тогда Возврат БиблиотекаКартинок.Статус_Ок; КонецЕсли;
Возврат БиблиотекаКартинок.ПустаяКартинка;
КонецФункции
Затем в СКД на закладке «Вычисляемые поля» добавим поле КартинкаСтатуса и в выражении пропишем:
ИмяОбщегоМодуля.ПолучитьКартинкуСтатуса(ИндексИзЗапроса)
В настройках оформления для этого поля укажите ВыводитьКартинку = Использовать. Это позволит динамически подставлять картинки, не плодя десятки правил условного оформления.
Проанализируем изменения версии 8.3.14. Платформа научилась выводить картинки, хранящиеся непосредственно в информационной базе (тип ХранилищеЗначения) или заданные через Навигационную ссылку. Если ваша коллекция — это не объект метаданных, а набор файлов в томе или реквизиты справочника, вы можете просто выводить их как данные.
В объектах ОформлениеКомпоновкиДанных появились полезные свойства, которые стоит использовать совместно с выводом картинок:
ВыводитьКартинку — управляет режимом отображения (только картинка, текст и картинка и т.д.).ПоложениеТекстаОтносительноКартинки — позволяет красиво сверстать ячейку.РазмерКартинки — помогает избежать искажений при выводе маленьких иконок в больших ячейках.Подводя итог, можно сказать: прямого аналога свойства КартинкаСтрок (где передается просто число) в СКД не существует. Если мы строго придерживаемся принципа «без кода», наш основной инструмент — Условное оформление с созданием отдельного правила для каждого значения индекса и ручным выбором нужного кадра из коллекции через диалог подбора. Для более сложных систем индикации лучше использовать вычисляемые поля с вызовом функции общего модуля или переходить на использование отдельных картинок вместо коллекций.