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