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