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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Понимание архитектуры печатных форм БСП

Когда мы используем библиотеку стандартных подсистем (БСП) для формирования ODT или DOCX документов, мы работаем с механизмом, который изначально спроектирован для вывода одного макета для одного объекта. Процедура УправлениеПечатьюКлиент.ПоказатьДокумент() открывает окно просмотра. Если мы вызываем её внутри цикла, система постоянно переписывает данные в текущем окне или пересоздает объект печатной формы, из-за чего пользователь видит только финальный результат.

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

Чтобы вывести несколько договоров в рамках одной печатной формы, необходимо отойти от прямой печати каждого объекта по отдельности. Вместо того чтобы выводить документ в каждом шаге цикла, мы должны накапливать данные в одном ТабличномДокументе. Рассмотрим пошагово, как это реализовать:

  1. Создаем экземпляр ТабличногоДокумента вне цикла.
  2. Организуем цикл по строкам табличной части исходного документа.
  3. Внутри цикла для каждой строки формируем секцию печатной формы.
  4. Выводим сформированную секцию в итоговый ТабличныйДокумент.
  5. Используем метод ВывестиГоризонтальныйРазделительСтраниц(), чтобы каждый новый договор начинался с чистого листа.

Пример программной реализации:


ТабДок = Новый ТабличныйДокумент;
Для Каждого Стр Из ДокументСсылка.ТабличнаяЧасть Цикл
    // Здесь происходит формирование печатной формы по конкретной строке
    // СформированнаяПечатнаяФорма = ПолучитьСекциюДляСтроки(Стр);
    
    // Выводим полученную область в общий документ
    ТабДок.Вывести(СформированнаяПечатнаяФорма);
    
    // Добавляем разделитель страниц для корректного отображения при печати
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;

// В завершение выводим итоговый документ пользователю
УправлениеПечатьюКлиент.ПоказатьДокумент(ТабДок);

Альтернативный подход: массовая печать

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

Рекомендации по реализации

При работе с офисными форматами (ODT/DOCX) помните, что прямая манипуляция объектами этих форматов сложнее, чем работа с классическими ТабличнымиДокументами 1С. Если вы не планируете сложные макеты с уникальным форматированием офисных пакетов, попробуйте перевести печать на стандартные макеты mxl. Это позволит вам использовать весь встроенный инструментарий платформы для работы с таблицами, включая удобную вставку разделителей страниц и группировку данных.

Если же специфика задачи требует именно ODT, обязательно разделите процесс на две логические части: сбор данных из всех строк табличной части в массив структур и последующая генерация итогового документа. Это избавит вас от ошибок, связанных с затиранием данных, и сделает код читаемым и поддерживаемым.

Важно: Всегда проверяйте структуру ДанныеОбъекта перед выводом. Убедитесь, что для каждой итерации цикла вы получаете корректный набор параметров, соответствующий конкретному контрагенту и срокам, указанным в текущей строке документа.

← На главную