Как нарисовать разделительную линию посередине страницы при печати двух экземпляров документа

Программист 1С v8.3 (Обычные формы)
← На главную

При разработке печатных форм в 1С часто возникает задача экономии бумаги, когда на одном листе А4 необходимо разместить два экземпляра документа (например, две квитанции или два акта). Стандартный механизм ЭкземпляровНаСтранице = 2 отлично справляется с тиражированием, но он не умеет автоматически рисовать линию отреза ровно по центру листа. Если документы имеют переменную длину (разное количество строк в табличной части), задача усложняется: линия должна всегда оставаться на отметке 148.5 мм от верхнего края, независимо от того, где закончился текст первого экземпляра.

В этой статье мы подробно разберем несколько профессиональных подходов к решению этой задачи, от использования графических объектов до работы с фоновыми изображениями и программного расчета высоты страницы.

Метод 1. Использование фоновой картинки-подложки

Проанализируем самый надежный способ, который практически не зависит от того, сколько строк вы вывели в табличный документ. Мы можем использовать свойство ФоноваяКартинка табличного документа.

Рассмотрим по шагам реализацию этого метода:

  1. Создадим в графическом редакторе изображение в формате PNG или BMP с пропорциями листа А4 (например, 2480x3508 пикселей).
  2. Ровно посередине изображения (по горизонтальной оси) нарисуем тонкую пунктирную линию.
  3. В коде формирования печатной формы установим это изображение как фон для нашего ТабличныйДокумент.

Посмотрим на пример кода:


// Создаем объект Табличный Документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.ЭкземпляровНаСтранице = 2;

// Загружаем картинку из общих картинок или из макета
КартинкаРазреза = БиблиотекаКартинок.ПунктирнаяЛинияЦентр;
ТабДок.ФоноваяКартинка = КартинкаРазреза;

// Важно настроить отображение
ТабДок.ВыводитьНаПечатьФоновуюКартинку = Истина;

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

Метод 2. Программное добавление графического объекта (Линия)

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

Выясним причину, почему это удобно: мы можем вычислить координаты середины листа программно. Высота листа А4 составляет 297 мм. Следовательно, середина — это 148.5 мм. Однако нужно учитывать верхнее поле страницы.

Проанализируем пример кода для добавления линии:


// Определяем параметры страницы
ТабДок.АвтоМасштаб = Истина;
ВысотаЛистаММ = 297;
ВерхнееПоле = ТабДок.ПолеСверху; // Значение в мм

// Вычисляем позицию линии (середина листа минус верхнее поле)
ПозицияЛинии = (ВысотаЛистаММ / 2) - ВерхнееПоле;

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

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

Метод 3. Заполнение пустоты через ПроверитьВывод()

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

Разберем этот алгоритм по шагам:

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

Пример реализации логики:


СекцияПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока");
СекцияРазделитель  = Макет.ПолучитьОбласть("Разделитель"); // Строка с пунктиром

// Выводим первый экземпляр
ТабДок.Вывести(ОбластьДокумента);

// Дозаполняем до середины
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(СекцияПустаяСтрока);

Пока ТабДок.ПроверитьВывод(МассивОбластей) Цикл
    // Здесь нужно рассчитать высоту выведенных строк.
    // Если высота меньше 148мм - продолжаем цикл
    ТабДок.Вывести(СекцияПустаяСтрока);
КонецЦикла;

ТабДок.Вывести(СекцияРазделитель);

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

Метод 4. Фиксация высоты основной области

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

В свойствах строк макета установим "Высота строки" — фиксированная. Суммарная высота всех строк секции должна составлять примерно 140-145 мм. В самом низу этой секции (в подвале) рисуем пунктирную линию. При выводе двух таких секций с установленным флагом ЭкземпляровНаСтранице = 2, 1С сама распределит их по листу. Благодаря фиксированной высоте подвал первой секции всегда будет "прижат" к центру страницы.

Предупреждение: Если данных в документе окажется больше, чем позволяет фиксированная высота, текст может быть обрезан. Этот метод подходит только для строго регламентированных форм (например, чеки или пропуска).

Резюме и рекомендации

Проанализировав все варианты, можно сделать следующие выводы:

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

← На главную