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