Склейка нескольких картинок в одну средствами 1С (как вывести несколько картинок в одну ячейку на СКД)

29.09.25

Разработка - Работа с интерфейсом

Функция для склеивания нескольких картинок в одну без использования временных файлов, внешних компонент, COM-объектов и сторонних программ. Можно применить для вставки нескольких картинок в ячейку табличного документа, печати пиктограмм свойств товара на ценнике, отображения в интерфейсе нескольких картинок плиткой/лентой/колонкой, создания вспомогательных картинок для описания товара на сайте. Также в публикации рассмотрены некоторые важные и недокументированные нюансы при работе с картинками, двоичными данными, потоками, буферами и хранилищем значения.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Склеить картинки в одну средствами 1С
.epf 115,24Kb
0 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Введение

Поступило задание сделать отчет на СКД с выводом нескольких картинок в одну ячейку. В лоб такая задача не решается. Статей на эту тему достаточно, принцип самого простого варианта обычно такой:

  1. Программная компоновка отчета.
  2. Получение картинок из хранилищ значений.
  3. Сохранение картинок во временные файлы.
  4. Склейка картинок в одну с помощью стороннего ПО.
  5. Загрузка полученной картинки из файла в табличный документ.

Чтобы получить склеенную картинку, обычно используют команду magic montage из набора утилит ImageMagic (есть версия COM-объект). Для обеспечения быстродействия и частого использования применяют RAM-диск для работы с файлами, что также позволяет сберечь ресурс SSD.

Казалось бы, дело за малым, тем более опыт такой уже был. Но у заказчика есть особые требования: никаких сторонних программ и внешних компонент, код должен быть на 100% на 1С. Что ж, вызов принят!

 

Реализация

Идея проста: разбираем картинки (бруски) на пиксели и собираем их на одном большом холсте на низком уровне средствами 1С!

В объекте Картинка нет прямого доступа к пикселям (растру), но зато есть двоичные данные. Через них и будем работать с растром.

Для начала приведем картинки к формату BMP, так как в нем растр хранится в несжатом виде и с бубнами танцевать не придется. Глубину цвета приведем к 24 битам, чтобы формат двоичных данных растра был одинаковым. (К сожалению, 1С не поддерживает 32-битные BMP, так что про альфа-канал придется забыть. Но при острой необходимости можно определить какой-нибудь цвет как прозрачный и не переносить его на холст).

Ну а дальше — дело техники:

  1. Создаем холст (объект Картинка) нужного размера и цвета.
  2. Получаем из холста буфер двоичных данных.
  3. В цикле обрабатываем массив картинок: получаем из них поток в памяти и копируем данные пикселей в буфер холста, руководствуясь описанием формата BMP.
  4. Получаем холст (объект Картинка) из буфера двоичных данных.

 

Инструкция

Функция СоединитьКартинки

Функция склеивания расположена в модуле объекта обработки; для удобства может быть размещена в общем серверном модуле. Если нужно склеивать на тонком клиенте, то придется выпилить масштабирование, так как ОбрабатываемаяКартинка будет недоступна (Почему-то. Жалко, что ли? Логично же уменьшать избыточно большие картинки перед отправкой на сервер). Соответственно, в этом случае для нормального отображения размер исходных картинок должен быть близок к нужному и не сильно отличаться между собой.

Первый параметр — обязательный, все остальные имеют значения по умолчанию и могут быть установлены в Неопределено. Для числовых параметров неопределенными считаются значения меньше единицы.

Не передавайте много больших картинок (более 100) при большом размере бруска или без изменения размера, устанете ждать.

 

Параметр Тип Описание
Картинки Массив из Картинка Коллекция картинок для склеивания. Если размеры картинки меньше размеров бруска (картинки на холсте), то картинка центрируется относительно него.
ИзменитьРазмер Булево, Неопределено Признак использования масштабирования. По умолчанию Истина. Если Ложь, то параметры Ширина и Высота игнорируются, и будут использованы максимальные размеры картинок из коллекции.
Ширина Число, Неопределено Ширина бруска в пикселях. По умолчанию 0. *
Высота Число, Неопределено Высота бруска в пикселях. По умолчанию 0. *
Плитка Число, Неопределено Количество брусков в строке по горизонтали. По умолчанию 0 — все бруски в одну строку. Если 1 — все бруски в одну колонку.
Бордюр Число, Неопределено Ширина бордюра вокруг брусков в пикселях. По умолчанию 0.
ЦветБордюра Цвет, Неопределено Цвет бордюра. По умолчанию Неопределено  — прозрачный.
Фон Цвет, Картинка, Неопределено Фон для новой картинки. По умолчанию Неопределено — белый. **
Формат ФорматКартинки, Неопределено Формат возвращаемой картинки. По умолчанию Неопределено — ФорматКартинки.PNG ***

 

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

** Фон используется для создания холста и будет виден при прозрачном бордюре, в пустых брусках и местах, где картинка меньше бруска. Если передать картинку, то она будет масштабирована без сохранения пропорций. Если в параметр Картинки передан пустой массив, то картинка фона отобразится в своем истинном размере и пропорциях.

*** Внутри функции вся обработка происходит в формате BMP, если указать его, конвертирования результата не будет, но следует учесть что такая картинка занимает в разы больше места по сравнению с другими форматами. Глубина цвета всегда 24 бита. Предпочитаемый формат PNG, так как имеет хорошее сжатие и не теряет качество.

Возвращаемое значение:  Картинка — размер зависит от размера и количества брусков.

 

Служебные функции

Функция ПолучитьКартинкиИзХранилищ(МассивХранилищ)

Подготавливает массив картинок для склеивания. Возвращает массив с картинками на основе массива с типом ХранилищеЗначения, содержащими тип Картинка. Если элемент массива Неопределено или ХранилищеЗначения пустое, в результат попадет картинка 1х1 пиксель серого цвета.

Функция Получить1пикс(Цвет = Неопределено)

Возвращает картинку 1х1 пиксель заданного цвета. По умолчанию (для всех значений, отличных от типа Цвет) — белый. Поддерживается любой тип цвета 1С, но ЦветаWindows могут воспроизводиться некорректно. Эту функцию можно использовать для различных целей, например, для раскраски ячейки таблицы значений УФ без использования условного оформления.

 

Самое интересное

А теперь расскажу, как во время отладки столкнулся с различными проблемами реализации и особенностями платформы, которые повлекли за собой критические проблемы с быстродействием при тестах на больших картинках в количестве более 20. Информация, на мой взгляд, ценная, особенно для любителей покритиковать 1С. Впрочем, возможно, это особенности моей платформы — 8.3.27.1508 для Linux, база файловая, внешняя обработка.


  1. Позиция в потоке. При создании ПотокВПамяти на основании буфера позиция в новом потоке установлена в 0. Почти всегда, в 99% случаев. В документации этот момент не отражен. Так что перед работой с таким потоком не надейтесь на позицию 0 и на всякий случай установите ее явно. С потоками, созданными на основании длины, такого не заметил, но кто знает...

  2. Получение ДвоичныеДанные из БуферДвоичных. Казалось бы, что проще? Даже есть специальная функция, но делает она это через, простите, временный файл! Исправляем:

    //Возврат ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Буфер);
    Поток = Новый ПотокВПамяти(Буфер);
    Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
  3. ОбрабатываемаяКартинка не работает в тонком клиенте. Об этом уже говорил. Но тогда зачем при получении из нее картинки создается временный файл? В ее защиту: делает она это не всегда и в зависимости от размера картинки, возможно чегото еще. Как это исправить? Как ни странно, вот так: 

    //Картинка = ОбрабатываемаяКартинка.ПолучитьКартинку(); // - здесь создается врем файл
    //Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Картинка.ПолучитьДвоичныеДанные());
    Буфер = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ОбрабатываемаяКартинка.ПолучитьКартинку().ПолучитьДвоичныеДанные());

    Следуя этой логике, чтобы получить картинку, нужно создать новую картинку из двоичных данных от картинки, полученной от другой картинки, и тогда временный файл не нужен. Ну, это в теории; на практике такой спецэффект только с буфером. Короче как получить ДД из буфера "напрямую" вы уже знаете, а там и картинка рядом.

  4. Чтение картинки из файла. Казалось бы, даже джун знает, как получить Картинка из файла. И что вы думаете? Для чтения файла нужен... Вы правильно догадались — временный файл! И да, при получении ДвоичныеДанные — та же история. Исправляем:

    //Возврат Новый Картинка(Файл.ПолноеИмя);         // Картинка
    ////Возврат Новый ДвоичныеДанные(Файл.ПолноеИмя); // ДД
    ФайловыйПоток = Новый ФайловыйПоток(Файл.ПолноеИмя, РежимОткрытияФайла.Открыть);
    Обещание = ФайловыйПоток.РазмерАсинх(); Размер = Ждать Обещание;
    Поток = Новый ПотокВПамяти(Размер);
    Обещание = ФайловыйПоток.КопироватьВАсинх(Поток, Размер); Ждать Обещание;
    Обещание = ФайловыйПоток.ЗакрытьАсинх(); Ждать Обещание;
    Возврат Новый Картинка(Поток.ЗакрытьИПолучитьДвоичныеДанные()); // Картинка
    //Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();               // ДД

     Все работает и на порядок быстрее. Если код исполняется на сервере, нужно использовать синхронные методы.

  5. Проблемы с прозрачностью. Если преобразуете картинку с прозрачным фоном в BMP, то он станет черным. Что бы этого избежать, не делайте так. Или храните картинки без прозрачных цветов. (Ну если очень хочется и там и тут, замените прозрачный цвет на нужный вам, но с минимальной альфой). При загрузке картинки BMP из файла или ДД установка свойства ПрозрачныйФон не срабатывает. Но если вы загрузили JPEG без использования прозрачного фона... Вроде все нормально, картинка с "монолитным" фоном. Везде, кроме демонического списка при работе по навссылке. Там она ведет себя так, будто у нее прозрачный фон, взятый по цвету правого нижнего пикселя, как говорит СП. Учитывая чистоту цвета после компрессии JPEG, картинка обрастает красивыми артефактами, особенно заметными при выделении строки.

  6. ВременноеХранилище и Временные файлы. При помещении больших картинок во временное хранилище (при достижении сумарного объема ~10 Мб) начинается активная работа с временными файлами. При отправке на сервер больших картинок — тоже, причем неважно, ВременноеХранилище или Картинка.

  7. Функция ПоказатьЗначение. открывает красивый диалог просмотра картинки с масштабом, предварительно сохранив ее во временный файл и считав оттуда.

 

Вот, живите теперь с этим. Очень правы те, кто выносит каталог временных файлов на RAM-диск. И на клиентах тоже.

Не, ну что это? Может так работает "Тонкий клиент (файловый вариант)"? Т.е. они это буквально? Знатоки, пишите.

 

ЗЫ

Отлаживаю обработку, сижу такой думаю: "Может как-нибудь взять исходники ImageMagic и собрать нормальную ВК для работы с графикой, с возможностью работы через потоки..." и при получении ОбрабатываемаяКартинка из какой-то очередной картинки получаю: "Ошибка при выполнении операции ImageMagick: 1cv8c: NoDecodeDelegateForThisImageFormat `TMP' @ error/constitute.c/ReadImage/746".

Т.е. 1С ВСЁ ЭТО ВРЕМЯ ПРЯТАЛИ ImageMagick под капотом?!

Всё, я умываю руки.

Проверено на следующих конфигурациях и релизах:

  • 1С:Деньги, релизы 2.0.44.40

Вступайте в нашу телеграмм-группу Инфостарт

обработка разработка картинки

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    215365    1187    413    

1052

SALE! 10%

Работа с интерфейсом Анализ учета Мониторинг 1С v8.3 8.3.14 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

28800 25920 руб.

27.03.2025    23956    25    18    

36

Работа с интерфейсом Рабочее место 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    66358    45    60    

84

Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

5160 руб.

29.06.2020    21964    32    6    

49

Работа с интерфейсом Программист 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

5040 руб.

06.10.2020    11859    8    8    

14

Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    13002    kalyaka    8    

35

WEB-интеграция Работа с интерфейсом Пользователь 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для конфигурации 1С:Розница 2.3.

3600 руб.

29.04.2022    15504    2    10    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 217 29.09.25 16:04 Сейчас в теме
"Но у заказчика есть особые требования: никаких сторонних программ и внешних компонент, код должен быть на 100% на 1С"
А какое его дело, как оно сделано ? Я бы с таким не работал.
2. Созинов 29.09.25 19:27 Сейчас в теме
Спасибо за статью, будет интересно поиграться с кодом.

Т.е. 1С ВСЁ ЭТО ВРЕМЯ ПРЯТАЛИ ImageMagick под капотом?!

Справка - О программе - Лицензии используемых компонент
...
ImageMagick
...
3. SerVer1C 989 29.09.25 19:33 Сейчас в теме
Да уж... Попиксельно побайтово перебирать картинки через 1С - это ещё то извращение с унылой производительностью.
Ща глянул код на питоне, которым осуществлял склейку для некоего своего проекта - там всего 15 строк и работает за секунду.

Т.е. 1С ВСЁ ЭТО ВРЕМЯ ПРЯТАЛИ <ПО> под капотом?!
Вы не поверите, но если заглянуть в меню "Справка" - "О программе" и нажать гиперссыль "Лицензии используемых компонентов" - то вы там увидите ни один десяток СПО (Свободного Программного Обеспечения), на котором построена коммерческая платформа 1С.

Если правильно распарсил, то вот этот
список
Для отправки сообщения требуется регистрация/авторизация