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

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

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

Понимаем разницу между модулем объекта и модулем менеджера

Для начала проанализируем ситуацию. В модуле объекта мы работаем с конкретным экземпляром документа, который уже загружен в память. В модуле менеджера контекста конкретного экземпляра не существует. Менеджер — это набор инструментов для работы со всеми документами данного типа сразу. Именно поэтому стандартная процедура печати в модуле менеджера всегда принимает на вход не один документ, а массив ссылок.

Рассмотрим типовую структуру процедуры печати, которая используется в современных конфигурациях:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Здесь происходит формирование печатных форм
КонецПроцедуры

Здесь МассивОбъектов — это список ссылок на те документы, которые пользователь выбрал в списке или открыл для печати. Наша задача — извлечь данные для каждой ссылки из этого массива.

Шаг 1. Получение данных через запрос

Выясним причину, по которой нельзя просто использовать конструкцию Ссылка.Номер в цикле. Если в массиве будет 100 документов, обращение через точку создаст 100 отдельных обращений к базе данных, что существенно замедлит работу системы. Правильный и профессиональный подход — использование одного запроса ко всей пачке документов.

Разберем пример создания запроса для получения номера и даты документа:


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

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

В этом примере мы передаем весь МассивОбъектов в параметр запроса. Система одним махом выберет все необходимые данные для всех документов.

Шаг 2. Работа с макетом и заполнение параметров

После того как мы получили данные в выборке, нам нужно передать их в макет печатной формы. Рассмотрим подробнее, как это сделать максимально эффективно. Допустим, в нашем макете есть область Заголовок, в которой созданы параметры НомерДок и ДатаДок.

Проанализируем цикл обхода результатов запроса:


Пока Выборка.Следующий() Цикл
    // Получаем область макета
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    
    // Присваиваем значения параметрам области
    ОбластьЗаголовок.Параметры.НомерДок = Выборка.Номер;
    ОбластьЗаголовок.Параметры.ДатаДок  = Формат(Выборка.Дата, "ДЛФ=DD");
    
    // Выводим область в табличный документ
    ТабличныйДокумент.Вывести(ОбластьЗаголовок);
КонецЦикла;

Если имена параметров в макете совпадают с именами полей в запросе, можно использовать метод Заполнить(), что сократит ваш код:


// Если в макете параметры называются "Номер" и "Дата"
ОбластьЗаголовок.Параметры.Заполнить(Выборка);

Шаг 3. Правильное форматирование данных

Просто получить значение реквизита часто недостаточно для красивой печатной формы. Например, номер документа может содержать лишние нули или префиксы организации (00УТ-00001), а дата может выводиться со временем. Посмотрим, как привести их в "человеческий" вид.

Для форматирования номера в типовых конфигурациях (использующих БСП) рекомендуется использовать специальную функцию:

ПредставлениеНомера = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Выборка.Номер);

Для даты часто требуется формат "01 января 2023 г.". В 1С это реализуется функцией Формат() с использованием строки маски "ДЛФ=DD".

Шаг 4. Обработка табличных частей

Если вам нужно получить не только основные реквизиты, но и данные из табличных частей (например, список товаров), мы рекомендуем использовать вложенные запросы или левое соединение в основном запросе. Это позволит получить все данные за один вызов сервера.

Рассмотрим структуру такого запроса:


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

При обходе такого запроса вы сможете получить выборку по табличной части через Выборка.Товары.Выбрать().

Резюме: алгоритм действий в модуле менеджера

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

  1. Не ищите переменную ЭтотОбъект — в модуле менеджера её нет. Используйте входящий параметр МассивОбъектов.
  2. Всегда используйте Запрос для получения данных. Это стандарт производительности 1С.
  3. Используйте условие ГДЕ Ссылка В (&МассивОбъектов) в тексте запроса.
  4. Обходите выборку в цикле Пока Выборка.Следующий(), формируя табличный документ для каждого найденного объекта.
  5. Применяйте форматирование для дат и номеров, чтобы печатная форма выглядела профессионально.
  6. Заполняйте параметры макета либо напрямую (Область.Параметры.Имя = Значение), либо через метод Заполнить().

Использование этого подхода гарантирует, что ваш код будет работать быстро, стабильно и соответствовать стандартам разработки 1С.

← На главную