Создание качественного фотоколлажа в рамках системы 1С:Предприятие часто ставит перед разработчиком непростую задачу. Стандартный табличный документ ориентирован на ячейки и строки, в то время как коллаж требует гибкого размещения изображений разного формата (портретная и ландшафтная ориентация) в ограниченной по ширине области. В этой статье мы подробно разберем несколько подходов: от простых методов с использованием макетов до сложных алгоритмов автоматической компоновки.
Начнем с самого доступного способа, который предложили участники форума. Суть метода заключается в подготовке нескольких вариантов «сетки» в макете печатной формы. Мы заранее создаем области, в которые будут вставляться картинки.
Проанализируем алгоритм действий:
Секция_Коллаж_2_Картинки, Секция_Коллаж_3_Картинки).Рисунок (вид — Картинка) с заранее заданными размерами.Посмотрим на пример программной реализации вывода такой секции:
// Пример вывода заранее подготовленной секции
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетКоллажа");
Если МассивКартинок.Количество() = 2 Тогда
Область = Макет.ПолучитьОбласть("Секция_Коллаж_2_Картинки");
Область.Рисунки.Фото1.Картинка = МассивКартинок[0];
Область.Рисунки.Фото2.Картинка = МассивКартинок[1];
ТабДок.Вывести(Область);
КонецЕсли;
Важный нюанс: Для объектов Рисунок в макете следует установить свойство РазмерКартинки в значение Пропорционально. Это позволит избежать искажения лиц и предметов, даже если исходная фотография не совпадает по пропорциям с рамкой в 1С.
Если нам нужна настоящая гибкость, мы можем отказаться от заранее нарисованных секций и создавать объекты Рисунок динамически. Это позволяет нам самостоятельно вычислять координаты каждой фотографии.
Выясним, какие свойства объекта РисунокТабличногоДокумента нам понадобятся:
Верх и Лево — определяют положение (в миллиметрах).Ширина и Высота — определяют размер области.Картинка — сам объект изображения.Разберем, как это реализовать в коде:
// Динамическое добавление картинки в заданную область
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Верх = ТекущийВерх;
НовыйРисунок.Лево = ТекущийЛево;
НовыйРисунок.Ширина = ТребуемаяШирина;
НовыйРисунок.Высота = ТребуемаяВысота;
НовыйРисунок.Картинка = ВыбранноеИзображение;
НовыйРисунок.РазмерКартинки = РазмерКартинки.Пропорционально;
Используя этот подход, мы можем реализовать алгоритм «Кирпичной кладки» (Masonry). Рассмотрим его суть: мы разделяем область печати на несколько колонок (например, три). Каждое новое изображение мы программно помещаем в ту колонку, высота которой на данный момент минимальна. Это позволяет избежать больших пустых пространств в коллаже.
Один из наиболее современных способов — формирование коллажа с помощью HTML-разметки. Современные версии 1С позволяют выводить ПолеHTMLДокумента или преобразовывать HTML в PDF/Картинку. Использование CSS Flexbox или CSS Grid решает проблему раскроя автоматически.
Рассмотрим преимущества этого метода:
border-radius и box-shadow.Пример формирования упрощенного HTML-кода для коллажа:
ТекстHTML = "<div style='display: flex; flex-wrap: wrap; gap: 10px;'>";
Для Каждого Фото Из МассивКартинок Цикл
// Преобразуем картинку в Base64 для вставки в HTML
СтрBase64 = Base64Строка(Фото.ПолучитьДвоичныеДанные());
ТекстHTML = ТекстHTML + "<img src='data:image/jpeg;base64," + СтрBase64 + "' style='width: 200px; object-fit: cover;'>";
КонецЦикла;
ТекстHTML = ТекстHTML + "</div>";
Если нам нужно вывести коллаж именно в ТабличныйДокумент для печати, но при этом мы хотим сложной верстки, можно программно сформировать SVG-файл. SVG (Scalable Vector Graphics) — это XML-документ, который 1С воспринимает как одну картинку.
Проанализируем ситуацию: внутри одного SVG-контейнера мы можем расположить десятки элементов <image> с любыми координатами, масками и наложениями. Для 1С это будет один объект Рисунок, что значительно снижает нагрузку на память при печати сложных отчетов с большим количеством фото.
При работе с фотоколлажами крайне важно помнить о ресурсах сервера и клиента. Посмотрим на основные рекомендации по оптимизации:
Сжатие изображений: Никогда не выводите в коллаж оригиналы фотографий высокого разрешения (например, по 10 Мб каждая). Если в коллаже 20 фото, 1С может аварийно завершить работу из-за нехватки памяти. Предварительно сжимайте картинки до нужного размера печати (обычно достаточно 800-1000 пикселей по большой стороне).
Очистка временных данных: После формирования печатной формы обязательно вызывайте метод Очистить() для временных объектов картинок.
Кэширование: Если один и тот же коллаж должен выводиться многократно, рассмотрите возможность «склеивания» изображений на стороне сервера в один файл (используя внешние утилиты типа ImageMagick или средства GDI+ через COM-объекты) и хранение уже готового результата.
Подводя итог, выбор метода зависит от ваших задач. Для простых фотоотчетов идеально подойдут статические секции. Для сложных динамических галерей лучше использовать алгоритмы упаковки (Bin Packing) или HTML/CSS верстку.