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