Как реализовать фотоколлаж в печатной форме 1С:Предприятие?

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

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

Метод 1: Использование статических секций и предопределенных макетов

Начнем с самого доступного способа, который предложили участники форума. Суть метода заключается в подготовке нескольких вариантов «сетки» в макете печатной формы. Мы заранее создаем области, в которые будут вставляться картинки.

Проанализируем алгоритм действий:

  1. В макете табличного документа создаем несколько секций (например, Секция_Коллаж_2_Картинки, Секция_Коллаж_3_Картинки).
  2. В каждой секции размещаем объекты типа Рисунок (вид — Картинка) с заранее заданными размерами.
  3. В коде определяем количество фотографий и выбираем соответствующую секцию.

Посмотрим на пример программной реализации вывода такой секции:


// Пример вывода заранее подготовленной секции
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетКоллажа");

Если МассивКартинок.Количество() = 2 Тогда
    Область = Макет.ПолучитьОбласть("Секция_Коллаж_2_Картинки");
    Область.Рисунки.Фото1.Картинка = МассивКартинок[0];
    Область.Рисунки.Фото2.Картинка = МассивКартинок[1];
    ТабДок.Вывести(Область);
КонецЕсли;

Важный нюанс: Для объектов Рисунок в макете следует установить свойство РазмерКартинки в значение Пропорционально. Это позволит избежать искажения лиц и предметов, даже если исходная фотография не совпадает по пропорциям с рамкой в 1С.

Метод 2: Программное управление объектами РисунокТабличногоДокумента

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

Выясним, какие свойства объекта РисунокТабличногоДокумента нам понадобятся:

Разберем, как это реализовать в коде:


// Динамическое добавление картинки в заданную область
НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
НовыйРисунок.Верх = ТекущийВерх;
НовыйРисунок.Лево = ТекущийЛево;
НовыйРисунок.Ширина = ТребуемаяШирина;
НовыйРисунок.Высота = ТребуемаяВысота;
НовыйРисунок.Картинка = ВыбранноеИзображение;
НовыйРисунок.РазмерКартинки = РазмерКартинки.Пропорционально;

Используя этот подход, мы можем реализовать алгоритм «Кирпичной кладки» (Masonry). Рассмотрим его суть: мы разделяем область печати на несколько колонок (например, три). Каждое новое изображение мы программно помещаем в ту колонку, высота которой на данный момент минимальна. Это позволяет избежать больших пустых пространств в коллаже.

Метод 3: Использование HTML и CSS для формирования сетки

Один из наиболее современных способов — формирование коллажа с помощью HTML-разметки. Современные версии 1С позволяют выводить ПолеHTMLДокумента или преобразовывать HTML в PDF/Картинку. Использование CSS Flexbox или CSS Grid решает проблему раскроя автоматически.

Рассмотрим преимущества этого метода:

  1. Браузерный движок сам подберет оптимальный размер ячеек.
  2. Можно легко добавить стильные рамки, тени и скругления углов через border-radius и box-shadow.
  3. Минимум программного кода для расчета координат внутри 1С.

Пример формирования упрощенного 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>";

Метод 4: Формирование SVG-структуры

Если нам нужно вывести коллаж именно в ТабличныйДокумент для печати, но при этом мы хотим сложной верстки, можно программно сформировать SVG-файл. SVG (Scalable Vector Graphics) — это XML-документ, который 1С воспринимает как одну картинку.

Проанализируем ситуацию: внутри одного SVG-контейнера мы можем расположить десятки элементов <image> с любыми координатами, масками и наложениями. Для 1С это будет один объект Рисунок, что значительно снижает нагрузку на память при печати сложных отчетов с большим количеством фото.

Оптимизация работы с памятью и производительность

При работе с фотоколлажами крайне важно помнить о ресурсах сервера и клиента. Посмотрим на основные рекомендации по оптимизации:

Сжатие изображений: Никогда не выводите в коллаж оригиналы фотографий высокого разрешения (например, по 10 Мб каждая). Если в коллаже 20 фото, 1С может аварийно завершить работу из-за нехватки памяти. Предварительно сжимайте картинки до нужного размера печати (обычно достаточно 800-1000 пикселей по большой стороне).

Очистка временных данных: После формирования печатной формы обязательно вызывайте метод Очистить() для временных объектов картинок.

Кэширование: Если один и тот же коллаж должен выводиться многократно, рассмотрите возможность «склеивания» изображений на стороне сервера в один файл (используя внешние утилиты типа ImageMagick или средства GDI+ через COM-объекты) и хранение уже готового результата.

Подводя итог, выбор метода зависит от ваших задач. Для простых фотоотчетов идеально подойдут статические секции. Для сложных динамических галерей лучше использовать алгоритмы упаковки (Bin Packing) или HTML/CSS верстку.

← На главную