При разработке дополнительных отчетов и обработок в 1С часто возникает задача сформировать печатную форму или отправить отчет по расписанию без участия пользователя и открытия управляемой формы. В таких случаях команда обработки настраивается с вариантом запуска Вызов серверного метода, а весь исполняемый код размещается в модуле объекта обработки. Разберем, как правильно обращаться к макетам в контексте модуля объекта и почему может возникать ошибка при вызове метода ПолучитьМакет.
В контексте формы разработчики привыкли использовать конструкцию с конвертацией формы в объект, например, через РеквизитФормыВЗначение("Объект").ПолучитьМакет(...). Однако внутри модуля объекта эта конструкция не требуется и неприменима, так как код уже выполняется в контексте серверного объекта обработки.
Для получения макета (табличного документа, двоичных данных, текстового документа или схемы компоновки данных) достаточно вызвать стандартный метод ПолучитьМакет напрямую из контекста объекта:
// Получение макета табличного документа
Макет = ЭтотОбъект.ПолучитьМакет("Макет");
// Либо прямое обращение к методу контекста модуля
Макет = ПолучитьМакет("Макет");
Посмотрим, как выглядит экспортная процедура выполнения серверной команды внешней обработки, подключаемой через Библиотеку Стандартных Подсистем (БСП):
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПечати");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабличныйДокумент.Вывести(ОбластьШапка);
// Дальнейшие действия: сохранение в файл, отправка по почте и т.д.
КонецПроцедуры
Если при попытке выполнить код Макет = ЭтотОбъект.ПолучитьМакет("ИмяМакета"); возникает ошибка Недопустимое значение параметра (параметр номер '1'), проанализируем основные причины этой неполадки:
Имя, а не Синоним) макета в дереве метаданных внешней обработки..epf) не был пересохранен перед регистрацией или тестированием, серверный контекст будет работать со старой версией файла.Если в качестве макета выступает Схема компоновки данных (СКД), процесс ее извлечения в модуле объекта аналогичен. Метод ПолучитьМакет возвращает объект типа СхемаКомпоновкиДанных. Разберем по шагам, как программно сформировать отчет на СКД без вывода формы на экран:
Процедура СформироватьОтчетНаСКД() Экспорт
// 1. Получаем макет схемы компоновки данных
СхемаСКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// 2. Получаем настройки по умолчанию или из компоновщика настроек
Настройки = СхемаСКД.НастройкиПоУмолчанию;
// 3. Формируем макет компоновщика
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаСКД, Настройки, ДанныеРасшифровки);
// 4. Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// 5. Выводим результат в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Если требуется получить макет внешней обработки из общего модуля, регламентного задания или модуля документа без интерактивного открытия формы, внешнюю обработку необходимо инициализировать программно на стороне сервера:
ОбъектОбработки = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
Макет = ОбъектОбработки.ПолучитьМакет("ИмяМакета");
// Получаем объект обработки по ссылке на справочник
ОбъектОбработки = ДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(СсылкаНаОбработку);
Макет = ОбъектОбработки.ПолучитьМакет("ИмяМакета");
Важно: Метод ПолучитьМакет() доступен исключительно на стороне сервера. Попытка вызвать его на тонком или веб-клиенте приведет к ошибке компиляции или выполнения.