Как напечатать несколько документов разных форматов (A5, A6, A7) на одном листе А4 в 1С?

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

В организациях с интенсивным документооборотом, таких как медицинские центры или лаборатории, ежедневно печатаются сотни мелких бланков: направлений, справок и согласий. Печать каждой маленькой бумажки на отдельном листе А4 приводит к колоссальному перерасходу бумаги, а использование заранее напечатанных типографских бланков требует ручного заполнения паспортной части, что замедляет работу врача. Оптимальное решение — программная компоновка всех необходимых документов пациента на одном или нескольких листах А4 непосредственно перед печатью.

В данной статье мы разберем технические подходы к реализации "умной" печати в среде 1С, рассмотрим алгоритмы размещения объектов и методы работы с табличными документами, которые позволят минимизировать пустые области на листе.

Метод 1: Использование микросетки в табличном документе

Одна из главных сложностей при выводе разных макетов в один ТабличныйДокумент — несовпадение ширины колонок. Если один бланк требует узких колонок для таблицы, а другой — широких для текста, при их объединении верстка "разъезжается". Для обхода этого ограничения мы применим метод микросетки.

Суть метода заключается в создании эталонного макета с очень узкими колонками (например, шириной 1 или 2 единицы). Рассмотрим алгоритм реализации:

  1. Создадим основной табличный документ, который будет служить холстом.
  2. Установим в нем фиксированную ширину колонок на минимальное значение.
  3. При формировании конкретных бланков (А5, А6) будем объединять ячейки микросетки так, чтобы визуально они соответствовали нужному дизайну.
  4. Используя метод ВставитьОбласть(), мы сможем копировать подготовленные блоки в основной документ, не нарушая общую структуру.

Проанализируем пример кода для подготовки такого холста:


// Создаем результирующий документ
ТабДокРезультат = Новый ТабличныйДокумент;
ТабДокРезультат.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_КОМПОНОВКА";

// Устанавливаем микросетку (например, 50 колонок одинаковой ширины)
Для НомерКолонки = 1 По 50 Цикл
    ТабДокРезультат.Область(1, НомерКолонки).ШиринаКолонки = 2;
КонецЦикла;

Метод 2: Программное управление форматом строк

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

Разберем последовательность действий:

  1. Для каждого отдельного документа (направления, справки) формируется свой временный ТабличныйДокумент.
  2. При переносе данных в основной документ используется метод Вывести().
  3. Для того чтобы колонки нового блока не влияли на предыдущие, перед выводом вызывается СоздатьФорматСтрок().

Рассмотрим пример реализации:


// Массив документов, которые нужно напечатать
МассивПечатныхФорм = ПолучитьСписокПечатныхФорм();

ОбщийТабДок = Новый ТабличныйДокумент;

Для Каждого ТекущийТабДок Из МассивПечатныхФорм Цикл
    // Проверяем, поместится ли документ на текущую страницу
    Если Не ОбщийТабДок.ПроверитьВывод(ТекущийТабДок) Тогда
        ОбщийТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;
    
    // Выводим документ с сохранением его уникальной структуры колонок
    ОбщийТабДок.Вывести(ТекущийТабДок);
    ОбщийТабДок.СоздатьФорматСтрок();
КонецЦикла;

Метод 3: Алгоритм упаковки (2D Bin Packing)

Если задача стоит максимально плотно упаковать бланки (например, разместить два А6 и четыре А7 на одном листе), простого последовательного вывода "сверху вниз" недостаточно. Нам потребуется алгоритм решения геометрической задачи об упаковке прямоугольников в контейнер.

Алгоритм Guillotine (Гильотинный разрез) — наиболее подходящий для печати, так как он создает структуру, которую легко разрезать ножницами или резаком (все линии разреза прямые и проходят от края до края области).

Рассмотрим логику работы такого алгоритма:

  1. Берем чистый лист А4 как свободное пространство.
  2. Выбираем самый крупный документ (например, А5).
  3. Размещаем его в углу. Оставшееся пространство листа разбиваем на два прямоугольника (по горизонтали и вертикали от края документа).
  4. Следующие документы меньшего размера пытаемся вписать в образовавшиеся свободные прямоугольники.
  5. Повторяем процесс рекурсивно, пока есть документы и свободное место.

Для реализации в 1С удобно использовать метод Присоединить(). Мы можем выводить документы не только друг под другом, но и справа от уже выведенных, если позволяет ширина страницы.


// Пример логики "Присоединить" для двух документов формата А6 на одной строке
Если ОбщийТабДок.ПроверитьПрисоединение(ТабДокА6_Номер2) Тогда
    ОбщийТабДок.Присоединить(ТабДокА6_Номер2);
Иначе
    ОбщийТабДок.Вывести(ТабДокА6_Номер2);
КонецЕсли;

Метод 4: Конвертация в изображения для сложной верстки

Если документы имеют сложную ориентацию (например, часть нужно напечатать вертикально, а часть повернуть на 90 градусов для экономии места), стандартных средств ТабличногоДокумента может быть недостаточно. В этом случае мы можем использовать "картиночный" подход.

Алгоритм действий следующий:

  1. Каждый макет документа формируется в 1С и сохраняется во временный файл как картинка (например, через Записать(Путь, ТипФайлаТабличногоДокумента.PNG)).
  2. В итоговом табличном документе создается область, куда программно добавляются объекты типа РисунокТабличногоДокумента.
  3. Для каждого рисунка мы можем программно задать координаты Верх, Лево, Высота и Ширина в пунктах или миллиметрах.

Этот метод позволяет реализовать полноценный "Тетрис" из документов на листе А4, игнорируя любые ограничения сеток и строк.

Рекомендации по внедрению в медицинских учреждениях

Выясним причины, по которым экономия бумаги может быть признана неэффективной, и как этого избежать. Основная претензия персонала — время на разрезание листов. Чтобы внедрение системы прошло успешно, рекомендуем:

Подводя итог, можно сказать, что наиболее сбалансированным решением для 1С является сочетание метода СоздатьФорматСтрок() для простых случаев и использование РисунокТабличногоДокумента для сложной упаковки множества мелких форм. Это позволяет достичь экономии бумаги до 70% без потери качества и читаемости документов.

← На главную