Как напечатать две идентичные накладные на одном листе в 1С?

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

В практике работы с программами 1С, особенно в производственных решениях типа УПП (Управление производственным предприятием), часто возникает задача экономии бумаги или упрощения документооборота. Типичный запрос пользователя: «Нужно, чтобы на одном листе А4 печатались сразу две одинаковые накладные — одна для нас, другая для клиента». Разберем подробно, как реализовать этот функционал программными и пользовательскими средствами.

Способ 1: Настройка параметров страницы

Прежде чем приступать к написанию кода, проанализируем штатные возможности платформы 1С. У объекта ТабличныйДокумент есть встроенные механизмы управления размещением данных на листе.

Рассмотрим порядок действий при использовании интерактивной настройки:

  1. Сформируем печатную форму на экране.
  2. Перейдем в меню Файл — Параметры страницы.
  3. Найдем поле Экземпляров на страницу и установим значение «2».
  4. В поле Количество копий укажем «2».

Почему это может не сработать? Как отмечается в обсуждении, этот способ часто игнорируется драйверами принтеров или настройками конкретной формы. Выделим основные причины неудачи:

Способ 2: Программное дублирование через временный документ

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

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


// Создаем результирующий документ
ФинальныйТабДок = Новый ТабличныйДокумент;

// Выводим первую копию
ФинальныйТабДок.Вывести(ИсходныйТабДок);

// Добавляем разделитель, чтобы визуально и физически отделить накладные
ФинальныйТабДок.ВывестиГоризонтальныйРазделительСтраниц();

// Выводим вторую копию
ФинальныйТабДок.Вывести(ИсходныйТабДок);

// Настраиваем параметры для помещения на один лист
ФинальныйТабДок.АвтоМасштаб = Истина;
ФинальныйТабДок.Показать();

В этом примере метод Вывести() копирует все области, форматирование и рисунки из одного документа в другой. Это самый «чистый» способ, так как он не требует переделки логики заполнения данных.

Способ 3: Модификация цикла формирования в модуле объекта

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


// Предположим, у нас есть макет и области: Заголовок, Шапка, Строка, Подвал
Макет = ПолучитьМакет("Накладная");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// ... получение остальных областей

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

Этот метод позволяет более гибко управлять содержимым. Например, на первой копии можно написать «Экземпляр продавца», а на второй — «Экземпляр покупателя».

Важные технические нюансы при работе с PDF

Поскольку конечная цель — получение PDF-файла, нужно учитывать, как платформа 1С сохраняет документы. Проанализируем использование метода Записать(). Если вы просто установили количество экземпляров в параметрах страницы, при программном сохранении в PDF эти настройки будут потеряны. Платформа запишет «что видит» в табличном документе.

Следовательно, единственный гарантированный способ получить две накладные в одном PDF-файле на одной странице — это использование Способа 2 или Способа 3 (программное объединение в одну форму). Только тогда при вызове команды:

ТабДок.Записать("C:\Temp\Invoice.pdf", ТипФайлаТабличногоДокумента.PDF);

вы получите корректный файл, где на одной странице расположены два макета.

Проверка возможности размещения (ПроверитьВывод)

Чтобы убедиться, что две накладные физически помещаются на один лист, полезно использовать метод ПроверитьВывод(). Это позволит избежать ситуации, когда вторая накладная «уезжает» на второй лист из-за большого количества строк в табличной части.


МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ИсходныйТабДок);
МассивОбластей.Добавить(ИсходныйТабДок);

Если Не ФинальныйТабДок.ПроверитьВывод(МассивОбластей) Тогда
    // Если не влезает, можно принудительно уменьшить масштаб
    ФинальныйТабДок.МасштабПечати = 85; 
КонецЕсли;

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

← На главную