Как в СКД вывести конкретную картинку из общей картинки-коллекции без программного кода?

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает задача визуализировать состояние данных с помощью иконок. В обычных формах списков это решается просто: мы указываем общую картинку-коллекцию для колонки и привязываем индекс картинки к числовому полю. Однако в СКД привычный механизм ПутьКДаннымКартинкиСтроки и КартинкаСтрок отсутствует. Разберем подробно, как можно обойти это ограничение, используя стандартные средства настройки отчета, и проанализируем возможности современных версий платформы.

Анализ проблемы: почему в СКД нет «индекса картинки»

Давайте разберем ситуацию. В платформе 1С объект ОбщаяКартинка может представлять собой как одиночное изображение, так и «ленту» (коллекцию), состоящую из нескольких кадров одинакового размера. В интерфейсе настройки условного оформления СКД мы можем выбрать картинку из библиотеки, но платформа не предоставляет стандартного поля для ввода числового индекса кадра. Если мы просто выберем коллекцию, система либо выведет ее целиком (что выглядит как сжатая полоса иконок), либо не выведет ничего, если тип данных поля не совпадает.

Это связано с тем, что механизм условного оформления в СКД ориентирован на статические значения свойств оформления для определенных условий. Поэтому нам придется использовать обходные пути, чтобы заставить систему отображать нужный нам «кадр».

Решение №1: Использование нескольких правил условного оформления

Рассмотрим самый доступный способ, который не требует изменения метаданных или написания функций в общих модулях. Этот метод идеально подходит, если количество картинок в вашей коллекции невелико (например, статусы «Новый», «В работе», «Завершен»).

Алгоритм настройки:

  1. В запросе схемы компоновки данных убедимся, что у нас есть поле, возвращающее индекс картинки или строковый код состояния (например, поле СтатусИндекс).
  2. Перейдем на закладку «Условное оформление» в настройках отчета.
  3. Добавим новое правило оформления.
  4. В поле «Оформление» выберем параметр Картинка.
  5. В открывшемся окне выбора картинки перейдем на вкладку «Библиотека» и выберем нашу общую картинку-коллекцию.
  6. Важный момент: Обратите внимание на кнопку «Подбор из файла-коллекции» (или аналогичный механизм выбора конкретного кадра в диалоге). Платформа позволяет в рамках конкретного правила оформления «зафиксировать» выбор одного кадра из коллекции.
  7. В поле «Условие» укажем: СтатусИндекс Равно 0.
  8. Повторим эти шаги для каждого индекса (0, 1, 2 и так далее), создавая для каждого отдельное правило условного оформления с соответствующим кадром.

Проанализируем этот подход: он полностью «бескодовый», но при большом количестве картинок (например, 50-100) становится крайне трудоемким в поддержке. Если коллекция изменится, придется перенастраивать каждое правило.

Решение №2: Разрезание коллекции на отдельные картинки

Если мы хотим упростить работу в самой СКД, стоит рассмотреть вариант подготовки графических ресурсов. Разберем, как это сделать:

Вместо одной ОбщейКартинки, содержащей 10 кадров, создадим 10 отдельных объектов ОбщаяКартинка (например, Статус_Новый, Статус_ВРаботе и т.д.). В этом случае в условном оформлении нам будет гораздо проще ориентироваться, выбирая конкретные объекты из библиотеки картинок конфигурации. Это избавляет от необходимости «выкусывать» кадр из коллекции внутри диалогов СКД.

Решение №3: Использование системных картинок оформления (Платформа 8.3.16+)

Выясним, что добавила платформа в последних обновлениях. Начиная с версии 8.3.16, в библиотеку стилей оформления СКД были добавлены готовые наборы картинок. Рассмотрим их подробнее. Теперь для условного оформления доступны следующие предопределенные картинки:

Если ваша задача — просто отобразить стандартный статус или индикатор, мы настоятельно рекомендуем использовать именно эти системные картинки. Они корректно масштабируются и не требуют создания собственных коллекций в метаданных.

Решение №4: Вывод картинок через вычисляемые поля (с минимальным кодом)

Хотя автор темы просил решение «без кода», проанализируем ситуацию, когда индексов слишком много. В СКД можно использовать Вычисляемые поля, которые могут возвращать объект типа Картинка. Однако встроенных функций для работы с индексами коллекций в языке выражений СКД нет. Поэтому нам потребуется создать одну вспомогательную функцию в общем модуле.

Создадим в общем модуле (с флагами «Сервер», «Внешнее соединение») функцию:


Функция ПолучитьКартинкуСтатуса(Индекс) Экспорт
    Коллекция = БиблиотекаКартинок.МояКоллекцияСтатусов;
    // В платформе нет прямого метода Получить(Индекс) для объекта Картинка, 
    // если это коллекция, но мы можем использовать УсловноеОформление 
    // или заранее подготовленный массив картинок.
    // Если это предопределенные картинки, можно использовать структуру:
    Если Индекс = 0 Тогда Возврат БиблиотекаКартинок.Статус_Ок; КонецЕсли;
    Возврат БиблиотекаКартинок.ПустаяКартинка;
КонецФункции

Затем в СКД на закладке «Вычисляемые поля» добавим поле КартинкаСтатуса и в выражении пропишем:

ИмяОбщегоМодуля.ПолучитьКартинкуСтатуса(ИндексИзЗапроса)

В настройках оформления для этого поля укажите ВыводитьКартинку = Использовать. Это позволит динамически подставлять картинки, не плодя десятки правил условного оформления.

Важные замечания по платформе 8.3.14+

Проанализируем изменения версии 8.3.14. Платформа научилась выводить картинки, хранящиеся непосредственно в информационной базе (тип ХранилищеЗначения) или заданные через Навигационную ссылку. Если ваша коллекция — это не объект метаданных, а набор файлов в томе или реквизиты справочника, вы можете просто выводить их как данные.

В объектах ОформлениеКомпоновкиДанных появились полезные свойства, которые стоит использовать совместно с выводом картинок:

Резюме

Подводя итог, можно сказать: прямого аналога свойства КартинкаСтрок (где передается просто число) в СКД не существует. Если мы строго придерживаемся принципа «без кода», наш основной инструмент — Условное оформление с созданием отдельного правила для каждого значения индекса и ручным выбором нужного кадра из коллекции через диалог подбора. Для более сложных систем индикации лучше использовать вычисляемые поля с вызовом функции общего модуля или переходить на использование отдельных картинок вместо коллекций.

← На главную