В процессе автоматизации печатных форм в 1С часто возникает задача: необходимо для каждой строки табличной части документа сформировать отдельную печатную форму. Например, если в документе 20 товаров, бухгалтер хочет получить 20 страниц, где на каждой странице будет представлена информация только по одному конкретному товару. Давайте разберем, как реализовать такую задачу профессионально, используя возможности встроенного языка 1С.
Для решения этой задачи мы будем использовать объект ТабличныйДокумент. Ключевая особенность этого объекта заключается в том, что при последовательном вызове метода Вывести данные не перезаписываются, а накапливаются. Таким образом, чтобы добавить разрыв страницы между печатными формами, нам понадобится специализированный метод ВывестиГоризонтальныйРазделительСтраниц.
Рассмотрим процесс построения кода. Нам необходимо организовать цикл по строкам табличной части, внутри которого мы будем заполнять макет и добавлять его в итоговый табличный документ.
Шаг 1: Подготовка документа. Создадим пустой объект ТабличныйДокумент, который станет контейнером для всех наших форм.
Шаг 2: Организация цикла. Пройдемся по коллекции Товары нашего объекта. Важно помнить, что если данных много, запрос на получение детальной информации лучше выполнять оптимально.
Шаг 3: Заполнение макета. Получим области макета (Заголовок, Шапка, Детали, Подвал) и заполним их данными из текущей строки цикла.
Шаг 4: Управление разрывами. После вывода всех областей одной формы, используем ВывестиГоризонтальныйРазделительСтраниц для принудительного переноса следующей формы на новую страницу.
Проанализируем готовый пример кода, который решает поставленную задачу:
ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_КачественноеУдостоверение";
Для Каждого Строка Из ЭтотОбъект.СсылкаНаОбъект.Товары Цикл
Макет = ПолучитьМакет("Макет1");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Строка.Номенклатура);
РезультатЗапроса = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьДетальныхЗаписей);
КонецЦикла;
ТабДок.Вывести(ОбластьПодвал);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
Возврат ТабДок;
При работе с большими объемами данных следуйте этим советам:
НачатьАвтогруппировкуСтрок удобны, но их следует использовать обдуманно. Если структура макета статична, настраивайте группировки непосредственно в конструкторе макета 1С.Расширения конфигурации вместо создания внешних печатных форм. Это позволит обновлять систему без потери доработок.Используя данный подход, вы сможете гибко настраивать процесс вывода документов, обеспечивая пользователей необходимым функционалом и соблюдая стандарты разработки 1С.