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