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