При разработке печатных форм в 1С часто возникает задача экономии бумаги, когда на одном листе А4 необходимо разместить два экземпляра документа (например, две квитанции или два акта). Стандартный механизм ЭкземпляровНаСтранице = 2 отлично справляется с тиражированием, но он не умеет автоматически рисовать линию отреза ровно по центру листа. Если документы имеют переменную длину (разное количество строк в табличной части), задача усложняется: линия должна всегда оставаться на отметке 148.5 мм от верхнего края, независимо от того, где закончился текст первого экземпляра.
В этой статье мы подробно разберем несколько профессиональных подходов к решению этой задачи, от использования графических объектов до работы с фоновыми изображениями и программного расчета высоты страницы.
Проанализируем самый надежный способ, который практически не зависит от того, сколько строк вы вывели в табличный документ. Мы можем использовать свойство ФоноваяКартинка табличного документа.
Рассмотрим по шагам реализацию этого метода:
ТабличныйДокумент.Посмотрим на пример кода:
// Создаем объект Табличный Документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.ЭкземпляровНаСтранице = 2;
// Загружаем картинку из общих картинок или из макета
КартинкаРазреза = БиблиотекаКартинок.ПунктирнаяЛинияЦентр;
ТабДок.ФоноваяКартинка = КартинкаРазреза;
// Важно настроить отображение
ТабДок.ВыводитьНаПечатьФоновуюКартинку = Истина;
Преимущество данного метода заключается в том, что линия всегда будет находиться в физическом центре листа, так как фоновая картинка масштабируется по границам печатной области. Это идеальное решение для документов с переменным количеством строк.
Если использование картинок кажется вам неудобным, разберем вариант с программным рисованием объекта типа Рисунок. В 1С ТабличныйДокумент позволяет позиционировать рисунки в миллиметрах, что дает нам необходимую точность.
Выясним причину, почему это удобно: мы можем вычислить координаты середины листа программно. Высота листа А4 составляет 297 мм. Следовательно, середина — это 148.5 мм. Однако нужно учитывать верхнее поле страницы.
Проанализируем пример кода для добавления линии:
// Определяем параметры страницы
ТабДок.АвтоМасштаб = Истина;
ВысотаЛистаММ = 297;
ВерхнееПоле = ТабДок.ПолеСверху; // Значение в мм
// Вычисляем позицию линии (середина листа минус верхнее поле)
ПозицияЛинии = (ВысотаЛистаММ / 2) - ВерхнееПоле;
// Добавляем рисунок на Табличный Документ
РисунокЛиния = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Линия);
РисунокЛиния.Верх = ПозицияЛинии;
РисунокЛиния.Лево = 0;
РисунокЛиния.Ширина = 210; // Ширина листа А4 в мм
РисунокЛиния.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Пунктир, 1);
РисунокЛиния.ВыводитьНаПечать = Истина;
Важный момент: Координаты рисунков в 1С могут вести себя по-разному в зависимости от того, к чему они привязаны (к ячейкам или к листу). Для точного позиционирования лучше всего использовать абсолютные координаты в миллиметрах.
Рассмотрим ситуацию, когда стандартный механизм ЭкземпляровНаСтранице = 2 не используется, и вы формируете два экземпляра вручную в одном макете. В этом случае нам нужно заставить программу "добить" пустой интервал до середины листа, вывести линию, а затем начать второй экземпляр.
Разберем этот алгоритм по шагам:
ПроверитьВывод().Пример реализации логики:
СекцияПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока");
СекцияРазделитель = Макет.ПолучитьОбласть("Разделитель"); // Строка с пунктиром
// Выводим первый экземпляр
ТабДок.Вывести(ОбластьДокумента);
// Дозаполняем до середины
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(СекцияПустаяСтрока);
Пока ТабДок.ПроверитьВывод(МассивОбластей) Цикл
// Здесь нужно рассчитать высоту выведенных строк.
// Если высота меньше 148мм - продолжаем цикл
ТабДок.Вывести(СекцияПустаяСтрока);
КонецЦикла;
ТабДок.Вывести(СекцияРазделитель);
Этот метод более трудоемкий, так как требует точного расчета высоты строк в пикселях или пунктах, но он дает полный контроль над процессом формирования листа.
Посмотрим на еще один интересный прием. Если мы знаем, что наш документ гарантированно помещается на половину листа А4, мы можем в макете задать основной области фиксированную высоту.
В свойствах строк макета установим "Высота строки" — фиксированная. Суммарная высота всех строк секции должна составлять примерно 140-145 мм. В самом низу этой секции (в подвале) рисуем пунктирную линию. При выводе двух таких секций с установленным флагом ЭкземпляровНаСтранице = 2, 1С сама распределит их по листу. Благодаря фиксированной высоте подвал первой секции всегда будет "прижат" к центру страницы.
Предупреждение: Если данных в документе окажется больше, чем позволяет фиксированная высота, текст может быть обрезан. Этот метод подходит только для строго регламентированных форм (например, чеки или пропуска).
Проанализировав все варианты, можно сделать следующие выводы:
ПроверитьВывод() для ручного контроля разметки.Помните, что итоговый результат на бумаге сильно зависит от драйвера принтера и настроек полей (ПолеСверху, ПолеСнизу). Перед внедрением решения обязательно проверьте печать на нескольких разных устройствах.