Как получить объект или ссылку в модуле менеджера 1С при формировании печатной формы?

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

При разработке и доработке печатных форм в конфигурациях 1С:Предприятие 8 часто возникает вопрос: как обратиться к конкретному документу или справочнику внутри модуля менеджера? В отличие от модуля объекта, здесь нет привычных контекстных переменных ЭтотОбъект или ЭтаСсылка. Разберем подробно, как устроена работа в модуле менеджера, каким образом передаются ссылки и как правильно формировать данные для печати.

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

Сначала выясним причину, почему в модуле менеджера нельзя напрямую обратиться к свойствам документа. Модуль менеджера исполняется на сервере и предназначен для управления всем типом данных в целом, а не конкретным экземпляром базы данных. В нем выполняются операции массовой обработки, поиск и, в современных конфигурациях на Библиотеке Стандартных Подсистем (БСП), формирование печатных форм.

У модуля менеджера нет собственного экземпляра объекта или ссылки. Поэтому попытка вызвать контекстные свойства приведет к ошибке. Для доступа к данным конкретного документа необходимо получать ссылку или массив ссылок через входные параметры процедур и функций.

Передача ссылок через параметры процедур печати

В типовых решениях БСП процедуры печати вынесены в модуль менеджера, так как они рассчитаны на групповую печать (обработку сразу нескольких документов). Ссылки на документы передаются в качестве входящего параметра, как правило, в виде массива МассивОбъектов или в структуре ПараметрыПечати.

Рассмотрим стандартный пример передачи параметров в процедуру печати модуля менеджера:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.СформироватьПечатнуюФорму(КоллекцияПечатныхФорм, "МояПечатнаяФорма") Тогда
		
		// Ссылки на документы находятся в массиве МассивОбъектов
		СформироватьМоюПечатнуюФорму(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм);
		
	КонецЕсли;

КонецПроцедуры

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


Для Каждого СсылкаИзМассива Из МассивОбъектов Цикл
    ДокументОбъект = СсылкаИзМассива.ПолучитьОбъект();
    // Работа с объектом документа
КонецЦикла;

Почему не рекомендуется использовать ПолучитьОбъект() при печати

Проанализируем ситуацию, почему обращение к объектам через метод ПолучитьОбъект() при формировании печатных форм является неоптимальным:

  1. Избыточная нагрузка на сервер: Метод ПолучитьОбъект() считывает из базы данных все реквизиты документа и его табличные части, создавая полноценный объект в памяти. При массовой печати десятков или сотен документов это приводит к падению производительности.
  2. Печать не меняет данные: Вывод табличного документа — это операция чтения. Для чтения данных достаточно выполнить один пакетный запрос к таблицам базы данных по переданному массиву ссылок.

Для сбора сведений для печатной формы правильно использовать запрос к базе данных с фильтром ГДЕ Ссылка В (&МассивОбъектов).

Причины пустых таблиц данных и обход типовых проверок

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

Для решения этих задач применяют следующие подходы:

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