В разработке отчетов и обработок на платформе 1С нередко возникает задача визуализировать статусы, рейтинги или пиктограммы прямо внутри одной ячейки табличного документа. Если для одиночного изображения достаточно стандартного свойства ячейки Картинка, то для одновременного размещения двух и более изображений (например, иконки состояния и пиктограммы приоритета) стандартных свойств ячейки становится недостаточно. Разберем, как решить эту задачу программно с использованием объекта ФорматированнаяСтрока, а также выясним нюансы работы с платформенными механизмами оформления и системой компоновки данных.
Объект ФорматированнаяСтрока в платформе 1С предназначен для хранения текста с индивидуальным оформлением фрагментов, а также графических элементов. Конструктор данного объекта универсален: он может принимать произвольное количество параметров разного типа, включая строки, цвета, шрифты и сами объекты типа Картинка.
Рассмотрим вариант решения, к которому пришел автор темы. В нем каждое изображение из коллекции метаданных БиблиотекаКартинок сначала преобразуется в отдельный экземпляр форматированной строки, после чего они объединяются вместе:
К1 = Новый ФорматированнаяСтрока(БиблиотекаКартинок.AppStore);
К2 = Новый ФорматированнаяСтрока(БиблиотекаКартинок.BCGЗвезда);
ФС = Новый ФорматированнаяСтрока(К1, " ", К2);
ТабличныйДокумент.Область(1, 1).Текст = ФС;
Обратим внимание: чтобы иконки не слипались вплотную, между ними полезно добавить пробел или текстовый разделитель.
Проанализируем возможности конструктора объекта ФорматированнаяСтрока подробнее. Создавать промежуточные объекты под каждую иконку необязательно. Конструктор умеет принимать массив элементов или перечисление параметров через запятую, автоматически интерпретируя переданные картинки.
Посмотрим на пример прямой передачи картинок и текста в конструктор через массив:
ЭлементыСтроки = Новый Массив;
ЭлементыСтроки.Добавить(БиблиотекаКартинок.AppStore);
ЭлементыСтроки.Добавить(" ");
ЭлементыСтроки.Добавить(БиблиотекаКартинок.BCGЗвезда);
ЭлементыСтроки.Добавить(" Текст описания");
ФС = Новый ФорматированнаяСтрока(ЭлементыСтроки);
ТабличныйДокумент.Область(1, 1).Текст = ФС;
Или еще более компактный вариант через перечисление параметров:
ФС = Новый ФорматированнаяСтрока(
БиблиотекаКартинок.AppStore,
" ",
БиблиотекаКартинок.BCGЗвезда
);
ТабличныйДокумент.Область(1, 1).Текст = ФС;
Платформа корректно помещает сформированную структуру в свойство Текст ячейки области табличного документа.
При использовании картинок внутри форматированной строки следует учитывать ряд платформенных ограничений, которые влияют на результирующий вид документа:
Нередко требуется выводить такие составные строки не в ручном отчете, а внутри системы компоновки данных. Здесь разработчики сталкиваются с ограничением: диалоговое окно стандартного условного оформления СКД не позволяет задать объект ФорматированнаяСтрока в параметре «Текст» (там доступен только примитивный строковый тип), а параметр «Картинка» рассчитан строго на одно изображение на ячейку.
Разберем по шагам два надежных способа интеграции:
Создадим экспортную функцию в общем модуле, доступном в контексте формирования отчета (например, на сервере). Функция на основе переданных данных собирает форматированную строку:
Функция ПолучитьИконкиСтатуса(Значение1, Значение2) Экспорт
Массив = Новый Массив;
Если Значение1 Тогда
Массив.Добавить(БиблиотекаКартинок.Успешно);
Массив.Добавить(" ");
КонецЕсли;
Если Значение2 Тогда
Массив.Добавить(БиблиотекаКартинок.Предупреждение);
КонецЕсли;
Возврат Новый ФорматированнаяСтрока(Массив);
КонецФункции
В схеме компоновки данных добавляем вычисляемое поле, где выражением выступает вызов нашей функции: МойОбщийМодуль.ПолучитьИконкиСтатуса(Поле1, Поле2). В настройках набора данных для созданного поля указываем тип ФорматированнаяСтрока. При выводе в отчет СКД выведет форматированные данные прямо в ячейку без дополнительных настроек условного оформления.
Если отчет формируется программно через процессор вывода, разберем перехват ячеек в цикле вывода. При обработке строк результата компоновщика мы можем напрямую обращаться к свойствам формируемых областей табличного документа и подменять Область.Текст на нужную форматированную строку с картинками.
Если ограничения форматированной строки не позволяют решить визуальную задачу, рассмотрим альтернативные методы:
Рисунки табличного документа. Создается объект типа ТипРисункаТабличногоДокумента.Картинка, привязывается к координатам ячейки методом Расположить(), после чего настраивается его размер и выравнивание. Этот подход требует точного позиционирования каждого объекта в пикселях или координатах.