При печати компактных первичных документов (накладных, квитанций, пропусков или актов) часто требуется разместить две копии на одном листе А4 в альбомной ориентации, добавив между ними вертикальную пунктирную линию для удобного разрезания бумаги ножницами.
Штатный параметр ЭкземпляровНаСтранице в методе Таблица.ПараметрыСтраницы(...) масштабирует документ средствами подсистемы печати Windows, однако при этом невозможно добавить разделительную полосу между экземплярами. Разберем рабочие способы реализации этой задачи в 1С 7.7.
Рассмотрим классический вариант построения печатной формы штатными средствами встроенного языка 1С 7.7. Для этого макет таблицы разбивается на логические части, а вывод строк выполняется последовательно слева направо.
Разберем по шагам алгоритм создания такой печатной формы:
Шапка, Строка, Подвал).Разделитель), у которой правая граница ячеек оформлена пунктирным стилем линии.Посмотрим на пример программного кода вывода строк:
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Печать");
Таб.ВывестиСекцию("Шапка");
Таб.ПрисоединитьСекцию("РазделительШапка");
Таб.ПрисоединитьСекцию("Шапка");
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Таб.ВывестиСекцию("Строка");
Таб.ПрисоединитьСекцию("РазделительСтрока");
Таб.ПрисоединитьСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.ПрисоединитьСекцию("РазделительПодвал");
Таб.ПрисоединитьСекцию("Подвал");
Таб.ПараметрыСтраницы(2); // 2 - альбомная ориентация
Таб.Показать("Печать двух экземпляров");
Важный нюанс: чтобы избежать рассинхронизации высоты ячеек при переносе длинных строк, более надежным подходом является создание изначально цельного двухколоночного макета. В таком макете строка содержит сразу левую половину, центральную разделительную колонку с пунктиром и правую половину, а вывод выполняется простой командой Таб.ВывестиСекцию(...) без метода ПрисоединитьСекцию().
Если печатная форма уже сформирована стандартным кодом конфигурации как один документ и переписывать секции макета трудоемко, проанализируем вариант с использованием популярной библиотеки «Йоксель» (Yoksel). Этот инструмент позволяет манипулировать областями сформированного табличного документа в памяти.
Разберем пример кода, в котором готовая таблица 1С загружается в Йоксель, дублируется правее исходной области, а на границе устанавливается рамка:
ТабДок = СоздатьОбъект("ТабличныйДокумент");
ТабДок.ЗагрузитьИзТаблицы(Таб);
// Определяем область для установки разделительной рамки
ОбластьРамки = ТабДок.Область(1, ТабДок.ШиринаТаблицы(), ТабДок.ВысотаТаблицы(), ТабДок.ШиринаТаблицы());
// Копируем исходный документ
Область = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы(), ТабДок.ШиринаТаблицы());
// Вставляем копию справа от оригинала
ТабДок.ВставитьОбласть(Область, 1, ТабДок.ШиринаТаблицы() + 1);
// Задаем правую границу для центральной колонки
ОбластьРамки.РамкаСправа = 1;
ТабДок.ПараметрыСтраницы.Ориентация = 2; // Альбомная
ТабДок.Показать("ДаблДок");
Этот подход избавляет от необходимости перекраивать макеты в конфигураторе и позволяет динамически дублировать любые типовые отчеты и документы.
Рассмотрим аппаратный способ, не требующий изменения программного кода конфигурации:
В этом случае драйвер принтера автоматически уменьшит страницы, разместит их рядом на одном листе и напечатает тонкую разделительную линию между ними.
Выясним технические ограничения платформы 1С 7.7, с которыми можно столкнуться при реализации:
ПроверитьВывод(). Если документ не умещается на одну страницу, горизонтально соединенные секции будут разрываться командой Таб.НоваяСтраница() только по всей ширине листа одновременно. Для многостраничных документов требуется программно контролировать высоту выводимых строк.