Как получить значение реквизита в модуле менеджера для вывода в печатную форму

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке печатных форм в среде 1С:Предприятие 8 часто возникает задача вывести в макет данные, которые отображаются на форме документа или списка (например, реквизит Ответственный или Автор документа). Разберем, почему нельзя обратиться к элементам формы напрямую из модуля менеджера и как правильно извлечь данные с помощью запроса и заполнить параметры макета.

Особенности контекста модуля менеджера

Проанализируем контекст исполнения кода в модуле менеджера. В отличие от модуля формы или модуля объекта, в модуле менеджера:

  1. Отсутствует контекст формы: модуль менеджера не имеет доступа к открытым формам, элементам управления и полям ввода. В форме списка данные не сохраняются в постоянную память, она лишь отображает данные базы.
  2. Отсутствует неявная ссылка ЭтотОбъект: все процедуры печати (например, формирующие табличный документ) принимают ссылку на документ или массив ссылок в качестве входящих параметров (например, МассивОбъектов или СсылкаНаДокумент).
  3. Все данные из базы извлекаются запросами: обращение через точку к реквизитам ссылки (например, Ссылка.Ответственный) внутри циклов приводит к неоптимальным неявным запросам. Поэтому стандартной практикой является выборка всех нужных полей единым запросом.

Получение стандартного реквизита документа запросом

Рассмотрим по шагам, как получить стандартный реквизит документа (например, Ответственный с типом СправочникСсылка.Пользователи) и передать его в область макета.

Если печатная форма уже формируется в модуле менеджера, в процедуре печати всегда присутствует выборка данных документа. Добавим выборку нужного поля в запрос:


// Создаем запрос для выборки данных документа
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   Реализация.Ссылка КАК Ссылка,
|   Реализация.Номер КАК Номер,
|   Реализация.Дата КАК Дата,
|   Реализация.Ответственный КАК Ответственный
|ИЗ
|   Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
|   Реализация.Ссылка В (&МассивОбъектов)";

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументы = РезультатЗапроса.Выбрать();

Вывод данных в область макета

Разберем, как передать полученное значение в параметр области макета. Для этого необходимо спозиционировать выборку и обратиться к свойству Параметры полученной области:


Пока ВыборкаДокументы.Следующий() Цикл

    // Получаем область подвала или подписей из макета
    ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");

    // Заполняем параметр области явно
    ОбластьПодписи.Параметры.ОтветственныйЗаРеализацию = ВыборкаДокументы.Ответственный;

    // Либо используем автоматическое заполнение параметров по совпадению имен
    // ОбластьПодписи.Параметры.Заполнить(ВыборкаДокументы);

    // Выводим сформированную область в табличный документ
    ТабличныйДокумент.Вывести(ОбластьПодписи);

КонецЦикла;

Ошибки при получении дополнительных реквизитов и сведений

Посмотрим на пример распространенной ошибки при попытке получить реквизит через регистр сведений ЗначенияСвойствОбъектов:


// Ошибочный подход:
Запрос.УстановитьПараметр("Объект", "Ответственный"); // Передана строка вместо ссылки
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("код нужного свойства"));

Выясним, почему такой код работает некорректно:

  1. В параметр &Объект должна передаваться ссылка на сам документ (например, СсылкаНаДокумент), а не строка с названием поля.
  2. Поиск через метод НайтиПоКоду() не рекомендуется использовать в модулях конфигурации, так как коды элементов могут меняться при синхронизации данных.
  3. Если Ответственный является штатным реквизитом шапки документа, обращаться к регистру сведений ЗначенияСвойствОбъектов вовсе не требуется — данные выбираются напрямую из таблицы самого документа.

Таким образом, для передачи любого реквизита в печатную форму в модуле менеджера достаточно включить его имя в секцию ВЫБРАТЬ основного запроса к документу и присвоить полученное значение соответствующему параметру макета.

← На главную