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

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

В условиях жесткой экономии ресурсов и бумаги компании часто прибегают к оптимизации печатных форм. Типичная задача — распечатать два экземпляра одного и того же документа (например, счета-фактуры или накладной) на одном физическом листе бумаги формата А4, чтобы затем аккуратно разрезать его пополам. Однако при использовании встроенного метода ЭкземпляровНаСтранице(2) многие разработчики сталкиваются с тем, что программа выводит только один уменьшенный документ в верхней половине листа, оставляя нижнюю часть абсолютно пустой.

В этой статье мы подробно разберем, почему так происходит, как работает механизм многостраничной печати в платформе 1С:Предприятие 7.7, и рассмотрим несколько эффективных способов решения этой задачи программными и аппаратными средствами.

Выясняем причину: почему половина листа остается пустой?

Главное заблуждение при работе с методом ЭкземпляровНаСтранице() заключается в предположении, что платформа должна автоматически продублировать сформированный табличный документ на свободное место страницы. На самом деле этот метод управляет исключительно разметкой физического листа бумаги при выводе на печать.

Когда мы передаем параметр 2 в метод Таб.ЭкземпляровНаСтранице(2), мы сообщаем драйверу принтера следующее: "Раздели физический лист бумаги пополам и размести на нем две последовательные логические страницы нашего табличного документа".

Если в коде обработчика печати мы сформировали и вывели только одну страницу (один экземпляр), система честно напечатает эту единственную страницу на первой половине листа, а для второй половины у нее просто не окажется данных. Чтобы получить две копии документа на одном листе, мы должны принудительно сформировать в коде двухстраничный табличный документ.

Решение 1. Программное дублирование вывода (Рекомендуемый способ)

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

Рассмотрим пример реализации такого алгоритма в коде:


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

// Запускаем цикл вывода двух копий одного документа
Для НомерКопии = 1 По 2 Цикл
    
    // Заполняем параметры шапки (например, признак Оригинал/Копия)
    Если НомерКопии = 1 Тогда
        ТекстКопии = "Экземпляр продавца";
    Иначе
        ТекстКопии = "Экземпляр покупателя";
    КонецЕсли;
    
    // Выводим секции документа
    Таб.ВывестиСекцию("Шапка");
    
    // Предположим, у нас есть табличная часть
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Таб.ВывестиСекцию("Строка");
    КонецЦикла;
    
    Таб.ВывестиСекцию("Подвал");
    
    // Если это первая копия, принудительно добавляем разрыв страницы
    Если НомерКопии = 1 Тогда
        Таб.НоваяСтраница();
    КонецЕсли;
    
КонецЦикла;

// Настраиваем параметры размещения на листе
Таб.ЭкземпляровНаСтранице(2); // Задаем 2 логические страницы на 1 физический лист
Таб.КоличествоЭкземпляров(1); // Печатаем 1 комплект

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

Этот подход гарантирует, что система сама смасштабирует каждую копию под отведенную ей половину листа, а на выходе мы получим два полноценных экземпляра с возможностью их индивидуального обозначения (например, "Экземпляр 1" и "Экземпляр 2").

Решение 2. Создание компактного "двойного" макета

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

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

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

Важное примечание: данный способ требует ювелирной точности при настройке высоты строк в конфигураторе. Любое изменение количества строк в табличной части реального документа может "сдвинуть" нижнюю копию на следующий лист, что приведет к порче бумаги.

Решение 3. Динамический расчет масштаба при большом количестве строк

В отличие от современных версий платформы 1С v8, где существует удобное свойство автоматического масштабирования АвтоМасштаб, в 1С 7.7 управлять масштабом печатного листа приходится вручную. Если в вашем счете-фактуре окажется много товарных позиций, стандартный двухстраничный документ просто не уместится на одном листе даже при делении пополам.

Посмотрим на пример кода, который динамически рассчитывает и уменьшает масштаб печати в зависимости от количества строк в документе перед выводом:


КоличествоСтрокДок = КоличествоСтрок();

// Задаем базовые параметры страницы (Ориентация: Портрет)
// Параметры метода: Ориентация, Масштаб в %
Если КоличествоСтрокДок > 15 Тогда
    // Если позиций много, сильно сжимаем документ до 75%
    Таб.ПараметрыСтраницы(1, 75, , , , , , , , );
ИначеЕсли КоличествоСтрокДок > 8 Тогда
    // Средний уровень сжатия
    Таб.ПараметрыСтраницы(1, 85, , , , , , , , );
Иначе
    // Стандартный масштаб
    Таб.ПараметрыСтраницы(1, 100, , , , , , , , );
КонецЕсли;

Таб.ЭкземпляровНаСтранице(2);

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

Важные технические нюансы и "подводные камни"

Проанализируем частые ошибки настройки макетов, из-за которых печать по два экземпляра на страницу может ломаться или выглядеть некорректно:

1. Невидимые пустые колонки справа. Если в вашем макете справа от основной таблицы случайно остались незаполненные, но созданные колонки, 1С 7.7 будет учитывать их при расчете общей ширины страницы. В результате принтер попытается уместить эти пустые поля на листе, сильно уменьшив полезный текст документа до нечитаемого состояния. Всегда удаляйте неиспользуемые колонки справа до самых границ таблицы.

2. Большие поля страницы по умолчанию. Стандартные настройки принтера часто резервируют под поля (отступы от края листа) по 10-20 миллиметров. При делении листа пополам эти отступы "съедают" слишком много полезного пространства. Рекомендуется принудительно задавать минимальные поля в коде:


// Устанавливаем минимальные поля: левое, правое, верхнее, нижнее по 5 мм
Таб.ПараметрыСтраницы(,, 5, 5, 5, 5, , , , ,);

3. Глюки с разрывом страниц при малом количестве строк. В некоторых релизах платформы 1С 7.7 наблюдается особенность: если на логической странице выводится слишком мало информации, встроенный механизм может проигнорировать команду НоваяСтраница(). Чтобы гарантировать корректный переход, убедитесь, что в конце каждого экземпляра выводится пустая секция фиксированной высоты, играющая роль отступа.

← На главную