В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость получить не всю коллекцию иконок (например, используя стандартные файлы графических ресурсов платформы), а один конкретный рисунок. Это может потребоваться для сохранения картинки в файл, передачи её через HTTP-запрос во внешнюю систему или отображения в специфических элементах интерфейса, где нельзя просто указать индекс. В этой статье мы подробно разберем, как решить эту задачу несколькими способами.
Проанализируем ситуацию: если мы создаем на форме реквизит с типом Число и связываем его с полем картинки, выбрав в качестве значения БиблиотекаКартинок.ПиктограммыФайлов, платформа позволяет нам выбрать индекс. Подобная визуализация востребована, когда реализуется картинка проведенности на форме документа в расширениях для УТ 11.5. Однако свойство Элементы.ИмяПоля.КартинкаЗначений всегда будет возвращать объект, содержащий всю коллекцию целиком. Индекс лишь управляет отображением, но не разделяет бинарные данные. Чтобы получить отдельный объект типа Картинка, нам придется использовать программные методы обработки графики.
Начиная с версии платформы 8.3.10, разработчикам доступен мощный инструмент — объект ОбрабатываемаяКартинка. Он позволяет манипулировать областями изображения. Рассмотрим по шагам, как выделить нужную иконку из сетки. Этот метод может быть частью сложной логики, когда требуется работа с PDF файлами и их преобразование в массив PNG картинок.
Большинство системных коллекций 1С представляют собой «атлас» — это одна большая картинка, где иконки расположены рядами. Стандартный размер иконки в таких наборах составляет 16x16 пикселей. Чтобы извлечь, например, пятую по счету иконку, нам нужно рассчитать её координаты.
Разберем пример кода:
// Получаем всю коллекцию из библиотеки
ИсходнаяКоллекция = БиблиотекаКартинок.ПиктограммыФайлов;
// Создаем объект для обработки
ОбрКартинка = Новый ОбрабатываемаяКартинка(ИсходнаяКоллекция);
// Параметры иконки (стандарт для 1С)
РазмерИконки = 16;
ИндексНужнойКартинки = 5; // Допустим, нам нужна 5-я иконка (считая с 0)
// Рассчитываем координаты (предполагаем горизонтальный ряд)
Лево = ИндексНужнойКартинки * РазмерИконки;
Верх = 0;
Ширина = РазмерИконки;
Высота = РазмерИконки;
// Выделяем область и получаем новую картинку
НужнаяКартинка = ОбрКартинка.ВыделитьОбласть(Лево, Верх, Ширина, Высота);
Важный нюанс: метод ВыделитьОбласть возвращает новый объект Картинка. Однако стоит учитывать, что в современных конфигурациях некоторые коллекции могут быть представлены в векторном формате SVG. В таких случаях метод может потребовать предварительной растеризации.
Если нам нужно получить картинку именно в том виде, в котором её «видит» платформа по индексу, существует проверенный временем способ с использованием ТабличногоДокумента. Этот метод позволяет извлечь конкретный фрагмент коллекции, полагаясь на внутренние механизмы платформы. Аналогичные приемы используются, когда выполняется программная конвертация отчетов в графический формат без установки дополнительных компонентов. Для этой задачи есть экспорт данных и изображений в XLSX и PDF.
Рассмотрим алгоритм действий:
Рисунок.Посмотрим на пример реализации:
ТабДок = Новый ТабличныйДокумент;
Рисунки = ТабДок.Рисунки;
НовыйРисунок = Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Устанавливаем коллекцию
НовыйРисунок.Картинка = БиблиотекаКартинок.ПиктограммыФайлов;
// Указываем, какой именно значок нам нужен
НовыйРисунок.ИндексКартинки = 12; // Например, значок Excel
// Теперь магия: свойство Картинка объекта Рисунок в некоторых контекстах
// позволяет получить именно выделенный фрагмент
Результат = НовыйРисунок.Картинка;
Этот способ хорош тем, что он абстрагирует разработчика от вычисления координат пикселей. Платформа сама знает, где в коллекции находится нужный индекс.
Если вы работаете в современной конфигурации, такой как УНФ, ERP или ЗУП, в них уже встроена Библиотека стандартных подсистем (БСП). В БСП есть готовые функции для работы с файлами. Например, если ваша задача — отображение прикрепленных файлов в списке счетов на оплату, то лучше использовать типовые механизмы определения пиктограмм.
Вместо того чтобы вручную «резать» картинки, мы можем вызвать программный интерфейс, который вернет нам индекс или саму картинку по расширению файла. Также во многих типовых решениях реализовано визуальное состояние объектов на форме, где картинки-индикаторы уже разделены для удобства кэширования и передачи на мобильные клиенты.
Как упоминалось ранее, современные коллекции часто хранятся как ZIP-архивы с XML-описанием. Если ваша задача — вытащить иконку из такой коллекции программно без использования экранных форм, вам может потребоваться:
двоичные данные картинки как ZIP (используя объект ЧтениеZipФайла).0.png, 1.png и т.д.).Картинка.Этот путь более трудоемкий, но он гарантирует результат даже в тех случаях, когда методы обработки графики недоступны (например, на сервере под Linux).
Мы рассмотрели три основных способа получения одного изображения из коллекции. Выбор конкретного метода зависит от ваших целей:
Используя эти инструменты, вы сможете гибко управлять графическими ресурсами системы и реализовывать сложные интерфейсные задачи.