Как напечатать два экземпляра документа на одном листе с разделителем в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Штатный параметр ЭкземпляровНаСтранице в методе Таблица.ПараметрыСтраницы(...) масштабирует документ средствами подсистемы печати Windows, однако при этом невозможно добавить разделительную полосу между экземплярами. Разберем рабочие способы реализации этой задачи в 1С 7.7.

Способ 1. Горизонтальное присоединение секций в макете

Рассмотрим классический вариант построения печатной формы штатными средствами встроенного языка 1С 7.7. Для этого макет таблицы разбивается на логические части, а вывод строк выполняется последовательно слева направо.

Разберем по шагам алгоритм создания такой печатной формы:

  1. В макете печатной формы создаем секции для одного экземпляра (например, Шапка, Строка, Подвал).
  2. Создаем дополнительную узкую колонку-секцию (например, Разделитель), у которой правая граница ячеек оформлена пунктирным стилем линии.
  3. При выводе каждой строки сначала выводим секцию левого экземпляра, затем присоединяем разделитель, а затем повторно присоединяем эту же секцию для правого экземпляра.

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


Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Печать");

Таб.ВывестиСекцию("Шапка");
Таб.ПрисоединитьСекцию("РазделительШапка");
Таб.ПрисоединитьСекцию("Шапка");

ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
    Таб.ВывестиСекцию("Строка");
    Таб.ПрисоединитьСекцию("РазделительСтрока");
    Таб.ПрисоединитьСекцию("Строка");
КонецЦикла;

Таб.ВывестиСекцию("Подвал");
Таб.ПрисоединитьСекцию("РазделительПодвал");
Таб.ПрисоединитьСекцию("Подвал");

Таб.ПараметрыСтраницы(2); // 2 - альбомная ориентация
Таб.Показать("Печать двух экземпляров");

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

Способ 2. Использование внешней компоненты Йоксель

Если печатная форма уже сформирована стандартным кодом конфигурации как один документ и переписывать секции макета трудоемко, проанализируем вариант с использованием популярной библиотеки «Йоксель» (Yoksel). Этот инструмент позволяет манипулировать областями сформированного табличного документа в памяти.

Разберем пример кода, в котором готовая таблица 1С загружается в Йоксель, дублируется правее исходной области, а на границе устанавливается рамка:


ТабДок = СоздатьОбъект("ТабличныйДокумент");
ТабДок.ЗагрузитьИзТаблицы(Таб);

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

// Копируем исходный документ
Область = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы(), ТабДок.ШиринаТаблицы());

// Вставляем копию справа от оригинала
ТабДок.ВставитьОбласть(Область, 1, ТабДок.ШиринаТаблицы() + 1);

// Задаем правую границу для центральной колонки
ОбластьРамки.РамкаСправа = 1;

ТабДок.ПараметрыСтраницы.Ориентация = 2; // Альбомная
ТабДок.Показать("ДаблДок");

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

Способ 3. Использование возможностей драйвера принтера

Рассмотрим аппаратный способ, не требующий изменения программного кода конфигурации:

  1. В 1С формируем документ в обычном виде на две последовательные страницы.
  2. В диалоге печати открываем свойства принтера.
  3. В настройках спуска полос выбираем режим «2 страницы на листе» (N-up printing).
  4. Активируем опцию «Границы страниц» (или «Разделительная линия» в зависимости от производителя принтера).

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

Особенности многостраничной и двусторонней печати

Выясним технические ограничения платформы 1С 7.7, с которыми можно столкнуться при реализации:

  1. Отсутствие метода проверки высоты: В платформе 7.7 нет метода ПроверитьВывод(). Если документ не умещается на одну страницу, горизонтально соединенные секции будут разрываться командой Таб.НоваяСтраница() только по всей ширине листа одновременно. Для многостраничных документов требуется программно контролировать высоту выводимых строк.
  2. Двусторонняя печать (дуплекс): Если документ печатается на двух сторонах листа в альбомном формате, обязательно проверьте направление переворота в параметрах печати. Необходимо выставить переворот по короткому краю («блокнот»), иначе оборотная сторона после разрезания листа окажется перевернутой на 180 градусов.
← На главную