Как вывести печатную форму всего справочника из формы списка в 1С

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

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

Рассмотрим причинно-следственные связи этой проблемы и разберем архитектурно правильные способы вывода печатных форм из формы списка в обычных формах 1С.

Причины возникновения проблемы и ограничения платформы

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

  1. Контекст метода ПолучитьМакет(): В модуле формы списка этот метод недоступен как стандартная функция контекста. Он принадлежит менеджеру объекта (например, Справочники.Номенклатура), самому объекту (СправочникОбъект), отчету или обработке.
  2. Назначение модуля объекта: Модуль объекта описывает логику работы с конкретной записью базы данных. Создавать экземпляр объекта через ПолучитьОбъект() для каждой строки списка в цикле ради печати неэффективно и создает избыточную нагрузку на сервер.
  3. Разделение логики: Для операций, затрагивающих весь справочник целиком или выборку элементов с отборами, модуль объекта использовать не рекомендуется. Такие задачи должны решаться через модуль менеджера или общий модуль.

Способ 1. Перенос кода печати в модуль менеджера справочника

Наиболее правильным решением с точки зрения архитектуры 1С является перенос процедуры формирования печатной формы в модуль менеджера справочника.

Разберем по шагам, как реализовать этот подход:

  1. Перенесем экспортную процедуру печати из модуля объекта в модуль менеджера справочника.
  2. В модуле формы списка вызовем процедуру через менеджер справочника.
  3. Для получения макета в модуле менеджера или в форме списка будем использовать обращение к менеджеру объекта.

Посмотрим на пример вызова макета через менеджер справочника из формы списка:


// В модуле формы списка
Макет = Справочники.ИмяСправочника.ПолучитьМакет("ИмяМакета");

Если вся процедура печати оформлена в модуле менеджера как экспортная, вызов из формы списка выглядит следующим образом:


// Вызов экспортной процедуры из модуля менеджера
Справочники.ИмяСправочника.ПечатьРеестра(ТекущиеОтборы);

Способ 2. Учет текущих отборов формы списка с помощью Построителя отчета

Чтобы сформировать печатную форму не по всем элементам справочника, а только по тем, которые отфильтрованы пользователем в табличном поле формы списка, проанализируем использование объекта ПостроительОтчета.

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

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


// Получаем построитель отчета на основе источника данных формы списка
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ЭлементыФормы.Список.Значение);

// Выполняем запрос построителя
РезультатЗапроса = Построитель.Результат;
Выборка = РезультатЗапроса.Выбрать();

// Далее заполняем макет табличного документа в цикле
Пока Выборка.Следующий() Цикл
    // Заполнение областей макета
КонецЦикла;

Способ 3. Использование отдельного отчета или обработки

Если печатная форма содержит сложную группировку, иерархию или развитые настройки оформления, проанализируем вариант создания отдельного отчета (например, на базе системы компоновки данных — СКД).

В этом случае из формы списка справочника достаточно передать установленный пользователем отбор в форму отчета и открыть ее:

  1. Считываем параметры отбора из элемента формы ЭлементыФормы.Список.Значение.Отбор.
  2. Открываем форму отчета и передаем настройки через параметры формы.
  3. Сформированный отчет выводит табличную часть с нужным оформлением.

Итоги

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

← На главную