В процессе разработки печатных форм в 1С часто возникает задача: необходимо вывести на печать несколько документов на основе данных, содержащихся в разных строках табличной части одного объекта (например, документа Заявки). Стандартный подход, используемый новичками, часто приводит к тому, что в результате формируется только одна копия печатной формы, соответствующая последней обработанной строке. Давайте разберем, почему так происходит и как правильно организовать процесс вывода данных.
Когда мы используем библиотеку стандартных подсистем (БСП) для формирования ODT или DOCX документов, мы работаем с механизмом, который изначально спроектирован для вывода одного макета для одного объекта. Процедура УправлениеПечатьюКлиент.ПоказатьДокумент() открывает окно просмотра. Если мы вызываем её внутри цикла, система постоянно переписывает данные в текущем окне или пересоздает объект печатной формы, из-за чего пользователь видит только финальный результат.
Чтобы вывести несколько договоров в рамках одной печатной формы, необходимо отойти от прямой печати каждого объекта по отдельности. Вместо того чтобы выводить документ в каждом шаге цикла, мы должны накапливать данные в одном ТабличномДокументе. Рассмотрим пошагово, как это реализовать:
ТабличногоДокумента вне цикла.ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(), чтобы каждый новый договор начинался с чистого листа.Пример программной реализации:
ТабДок = Новый ТабличныйДокумент;
Для Каждого Стр Из ДокументСсылка.ТабличнаяЧасть Цикл
// Здесь происходит формирование печатной формы по конкретной строке
// СформированнаяПечатнаяФорма = ПолучитьСекциюДляСтроки(Стр);
// Выводим полученную область в общий документ
ТабДок.Вывести(СформированнаяПечатнаяФорма);
// Добавляем разделитель страниц для корректного отображения при печати
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
// В завершение выводим итоговый документ пользователю
УправлениеПечатьюКлиент.ПоказатьДокумент(ТабДок);
Если ваша задача — не склеить договоры в один файл, а получить набор отдельных печатных форм, которые пользователь сможет распечатать или отправить по почте независимо, вам следует использовать функционал массовой печати, заложенный в БСП. В этом случае:
Печать вместо цикла по строкам внутри одного документа, мы готовим массив данных.При работе с офисными форматами (ODT/DOCX) помните, что прямая манипуляция объектами этих форматов сложнее, чем работа с классическими ТабличнымиДокументами 1С. Если вы не планируете сложные макеты с уникальным форматированием офисных пакетов, попробуйте перевести печать на стандартные макеты mxl. Это позволит вам использовать весь встроенный инструментарий платформы для работы с таблицами, включая удобную вставку разделителей страниц и группировку данных.
Если же специфика задачи требует именно ODT, обязательно разделите процесс на две логические части: сбор данных из всех строк табличной части в массив структур и последующая генерация итогового документа. Это избавит вас от ошибок, связанных с затиранием данных, и сделает код читаемым и поддерживаемым.
Важно: Всегда проверяйте структуру ДанныеОбъекта перед выводом. Убедитесь, что для каждой итерации цикла вы получаете корректный набор параметров, соответствующий конкретному контрагенту и срокам, указанным в текущей строке документа.