В организациях с интенсивным документооборотом, таких как медицинские центры или лаборатории, ежедневно печатаются сотни мелких бланков: направлений, справок и согласий. Печать каждой маленькой бумажки на отдельном листе А4 приводит к колоссальному перерасходу бумаги, а использование заранее напечатанных типографских бланков требует ручного заполнения паспортной части, что замедляет работу врача. Оптимальное решение — программная компоновка всех необходимых документов пациента на одном или нескольких листах А4 непосредственно перед печатью.
В данной статье мы разберем технические подходы к реализации "умной" печати в среде 1С, рассмотрим алгоритмы размещения объектов и методы работы с табличными документами, которые позволят минимизировать пустые области на листе.
Одна из главных сложностей при выводе разных макетов в один ТабличныйДокумент — несовпадение ширины колонок. Если один бланк требует узких колонок для таблицы, а другой — широких для текста, при их объединении верстка "разъезжается". Для обхода этого ограничения мы применим метод микросетки.
Суть метода заключается в создании эталонного макета с очень узкими колонками (например, шириной 1 или 2 единицы). Рассмотрим алгоритм реализации:
ВставитьОбласть(), мы сможем копировать подготовленные блоки в основной документ, не нарушая общую структуру.Проанализируем пример кода для подготовки такого холста:
// Создаем результирующий документ
ТабДокРезультат = Новый ТабличныйДокумент;
ТабДокРезультат.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_КОМПОНОВКА";
// Устанавливаем микросетку (например, 50 колонок одинаковой ширины)
Для НомерКолонки = 1 По 50 Цикл
ТабДокРезультат.Область(1, НомерКолонки).ШиринаКолонки = 2;
КонецЦикла;
В платформе 1С реализован мощный механизм, позволяющий разным строкам одного табличного документа иметь независимую структуру колонок. Это решается с помощью метода СоздатьФорматСтрок(). Этот способ избавляет от необходимости возиться с микросеткой.
Разберем последовательность действий:
ТабличныйДокумент.Вывести().СоздатьФорматСтрок().Рассмотрим пример реализации:
// Массив документов, которые нужно напечатать
МассивПечатныхФорм = ПолучитьСписокПечатныхФорм();
ОбщийТабДок = Новый ТабличныйДокумент;
Для Каждого ТекущийТабДок Из МассивПечатныхФорм Цикл
// Проверяем, поместится ли документ на текущую страницу
Если Не ОбщийТабДок.ПроверитьВывод(ТекущийТабДок) Тогда
ОбщийТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
// Выводим документ с сохранением его уникальной структуры колонок
ОбщийТабДок.Вывести(ТекущийТабДок);
ОбщийТабДок.СоздатьФорматСтрок();
КонецЦикла;
Если задача стоит максимально плотно упаковать бланки (например, разместить два А6 и четыре А7 на одном листе), простого последовательного вывода "сверху вниз" недостаточно. Нам потребуется алгоритм решения геометрической задачи об упаковке прямоугольников в контейнер.
Алгоритм Guillotine (Гильотинный разрез) — наиболее подходящий для печати, так как он создает структуру, которую легко разрезать ножницами или резаком (все линии разреза прямые и проходят от края до края области).
Рассмотрим логику работы такого алгоритма:
Для реализации в 1С удобно использовать метод Присоединить(). Мы можем выводить документы не только друг под другом, но и справа от уже выведенных, если позволяет ширина страницы.
// Пример логики "Присоединить" для двух документов формата А6 на одной строке
Если ОбщийТабДок.ПроверитьПрисоединение(ТабДокА6_Номер2) Тогда
ОбщийТабДок.Присоединить(ТабДокА6_Номер2);
Иначе
ОбщийТабДок.Вывести(ТабДокА6_Номер2);
КонецЕсли;
Если документы имеют сложную ориентацию (например, часть нужно напечатать вертикально, а часть повернуть на 90 градусов для экономии места), стандартных средств ТабличногоДокумента может быть недостаточно. В этом случае мы можем использовать "картиночный" подход.
Алгоритм действий следующий:
Записать(Путь, ТипФайлаТабличногоДокумента.PNG)).РисунокТабличногоДокумента.Верх, Лево, Высота и Ширина в пунктах или миллиметрах.Этот метод позволяет реализовать полноценный "Тетрис" из документов на листе А4, игнорируя любые ограничения сеток и строк.
Выясним причины, по которым экономия бумаги может быть признана неэффективной, и как этого избежать. Основная претензия персонала — время на разрезание листов. Чтобы внедрение системы прошло успешно, рекомендуем:
Подводя итог, можно сказать, что наиболее сбалансированным решением для 1С является сочетание метода СоздатьФорматСтрок() для простых случаев и использование РисунокТабличногоДокумента для сложной упаковки множества мелких форм. Это позволяет достичь экономии бумаги до 70% без потери качества и читаемости документов.