Как получить макет внешней обработки без открытия формы в 1С 8.3?

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

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

1. Обращение к макету из модуля объекта внешней обработки

В контексте формы разработчики привыкли использовать конструкцию с конвертацией формы в объект, например, через РеквизитФормыВЗначение("Объект").ПолучитьМакет(...). Однако внутри модуля объекта эта конструкция не требуется и неприменима, так как код уже выполняется в контексте серверного объекта обработки.

Для получения макета (табличного документа, двоичных данных, текстового документа или схемы компоновки данных) достаточно вызвать стандартный метод ПолучитьМакет напрямую из контекста объекта:


// Получение макета табличного документа
Макет = ЭтотОбъект.ПолучитьМакет("Макет");

// Либо прямое обращение к методу контекста модуля
Макет = ПолучитьМакет("Макет");

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


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт

    ТабличныйДокумент = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("МакетПечати");
    
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ТабличныйДокумент.Вывести(ОбластьШапка);
    
    // Дальнейшие действия: сохранение в файл, отправка по почте и т.д.

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

2. Анализ ошибки «Недопустимое значение параметра»

Если при попытке выполнить код Макет = ЭтотОбъект.ПолучитьМакет("ИмяМакета"); возникает ошибка Недопустимое значение параметра (параметр номер '1'), проанализируем основные причины этой неполадки:

  1. Макет отсутствует в составе обработки: самая распространенная ситуация при переносе кода из других обработок или конфигураций. Если программный код перенесен, а сам макет в ветку метаданных внешней обработки не добавлен, платформа не найдет объект с указанным именем.
  2. Опечатка в имени макета: имя макета в коде должно строго совпадать с именем (свойством Имя, а не Синоним) макета в дереве метаданных внешней обработки.
  3. Изменения не сохранены: если макет был только что добавлен, но файл внешней обработки (.epf) не был пересохранен перед регистрацией или тестированием, серверный контекст будет работать со старой версией файла.

3. Получение и программное формирование макета СКД без формы

Если в качестве макета выступает Схема компоновки данных (СКД), процесс ее извлечения в модуле объекта аналогичен. Метод ПолучитьМакет возвращает объект типа СхемаКомпоновкиДанных. Разберем по шагам, как программно сформировать отчет на СКД без вывода формы на экран:


Процедура СформироватьОтчетНаСКД() Экспорт

    // 1. Получаем макет схемы компоновки данных
    СхемаСКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // 2. Получаем настройки по умолчанию или из компоновщика настроек
    Настройки = СхемаСКД.НастройкиПоУмолчанию;
    
    // 3. Формируем макет компоновщика
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);
    
    // 4. Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // 5. Выводим результат в табличный документ
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

4. Получение макета внешней обработки из произвольного серверного кода

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

  1. Из файла на диске:
    
    ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
    Макет = ОбъектОбработки.ПолучитьМакет("ИмяМакета");
    
  2. Из справочника дополнительных отчетов и обработок (БСП):
    
    // Получаем объект обработки по ссылке на справочник
    ОбъектОбработки = ДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(СсылкаНаОбработку);
    Макет = ОбъектОбработки.ПолучитьМакет("ИмяМакета");
    

Важно: Метод ПолучитьМакет() доступен исключительно на стороне сервера. Попытка вызвать его на тонком или веб-клиенте приведет к ошибке компиляции или выполнения.

← На главную