Разработка собственных печатных форм в формате Microsoft Word (.docx) в современных конфигурациях 1С, таких как Бухгалтерия предприятия 3.0, часто выполняется с использованием Библиотеки стандартных подсистем (БСП). Однако при работе через механизм расширений программисты нередко сталкиваются с ошибкой Макет "" не найден. Рассмотрим детально, почему возникает эта проблема, как правильно организовать архитектуру печатной формы и разберем корректный программный код для работы с офисными документами.
Когда система выдает сообщение об ошибке, в котором имя макета указано как пустые кавычки (""), это чаще всего означает, что подсистема печати не смогла сопоставить переданный идентификатор печатной формы с данными в коллекции. Проанализируем типичную ситуацию: код написан в расширении, макет добавлен там же, но при вызове стандартных методов БСП контекст поиска макета теряется или происходит обращение к основной конфигурации вместо расширения.
Основные факторы, влияющие на появление ошибки:
ПолучитьМакет() в модуле менеджера может не сработать, если система пытается найти его в основной конфигурации.Для начала разберем, как правильно добавить команду печати. В модуле менеджера объекта (документа или справочника), который мы расширяем, необходимо переопределить процедуру ДобавитьКомандыПечати. Обратите внимание на использование аннотации &После.
&После("ДобавитьКомандыПечати")
Процедура ШифтДобавитьКомандыПечати(КомандыПечати)
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.МенеджерПечати = "Обработка.ШифтКП";
КомандаПечати.Идентификатор = "ШифтКП";
КомандаПечати.Представление = "Коммерческое предложение (цветное)";
КомандаПечати.Обработчик = "ПечатьНаКлиенте";
КомандаПечати.Порядок = 1;
КонецПроцедуры
Здесь важно, чтобы Идентификатор был уникальным и далее использовался без изменений во всех процедурах формирования документа.
Часто перед печатью требуется уточнить параметры (например, выбрать ответственного или формат цен). В этом случае мы используем промежуточную форму. Рассмотрим обработчик ПечатьНаКлиенте в модуле формы объекта:
&НаКлиенте
Функция ПечатьНаКлиенте(ПараметрыПечати) Экспорт
// Вызываем форму настроек перед печатью
ОписаниеОповещения = Новый ОписаниеОповещения("ПечатьНаКлиентеЗавершение", ЭтотОбъект, ПараметрыПечати);
ОткрытьФорму(
"Обработка.ШифтКП.Форма.ФормаНастроек",
,
ЭтотОбъект,
,
,
,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
);
Возврат Неопределено;
КонецФункции
&НаКлиенте
Процедура ПечатьНаКлиентеЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Передаем управление стандартному механизму БСП
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Обработка.ШифтКП",
"ШифтКП",
ДополнительныеПараметры.ОбъектыПечати,
ЭтотОбъект,
Результат
);
КонецЕсли;
КонецПроцедуры
Теперь перейдем к самому ответственному этапу — заполнению макета .docx данными. Выясним причину, по которой макет может быть «не найден». В процедуре Печать мы должны четко инициализировать коллекцию. Рассмотрим исправленный подход:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, нужно ли печатать наш макет
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ШифтКП") Тогда
ПечатьОбъекта(КоллекцияПечатныхФорм, МассивОбъектов, ПараметрыПечати);
КонецЕсли;
КонецПроцедуры
Процедура ПечатьОбъекта(КоллекцияПечатныхФорм, МассивОбъектов, ПараметрыПечати) Экспорт
Ссылка = МассивОбъектов[0];
ТипМакета = "DOCX";
// Получаем структуру сведений о печатной форме
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ШифтКП");
// КРИТИЧЕСКИЙ МОМЕНТ: явное обращение к макету обработки в расширении
Попытка
ДвоичныеДанныеМакета = Обработки.ШифтКП.ПолучитьМакет("ОсновнойМакет");
Исключение
ВызватьИсключение "Не удалось получить макет 'ОсновнойМакет'. Проверьте его наличие в расширении.";
КонецПопытки;
СсылкаНаМакет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, ТипМакета, "ШифтКП");
ПечатнаяФормаWord = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, СсылкаНаМакет.НастройкиСтраницыМакета, СсылкаНаМакет);
// Заполнение данными
СтруктураПараметров = ПолучитьДанныеДокумента(Ссылка);
СтруктураОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Шапка", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Подвал", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "СписокУслуг", "СтрокаТаблицы");
// Вывод областей
ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Шапка);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров);
ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.СписокУслуг);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров.Товары);
ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Подвал);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров);
// Финализация
АдресХранилищаОфисныйДокумент = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаWord);
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФормаWord, Ложь);
УправлениеПечатью.ОчиститьСсылки(СсылкаНаМакет);
ОфисныеДокументы = Новый Соответствие;
ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, "Коммерческое предложение");
ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецПроцедуры
Чтобы избежать ошибок при заполнении параметров, проанализируем структуру самого файла Word. БСП использует механизм Закладок (Bookmarks) для определения областей документа. Рассмотрим основные правила подготовки макета:
Шапка, в файле Word должна существовать закладка с именем Шапка_Начало и Шапка_Конец (или одна общая закладка Шапка, охватывающая текст).СписокУслуг) закладка должна охватывать всю строку таблицы целиком. Внутри ячеек параметры указываются в фигурных скобках, например: {Наименование}.СтруктураПараметров.Вставить("Цена", 100)) должны строго совпадать с именами в макете {Цена}.Почему важно использовать Обработки.ШифтКП.ПолучитьМакет?
В среде расширений платформа 1С иногда может путать контексты. Если вы вызываете ПолучитьМакет("Имя") просто в модуле менеджера, система может искать этот макет в объекте основной конфигурации, который вы расширяете. Прямое указание имени обработки гарантирует, что двоичные данные будут извлечены именно из вашего расширения.
Проанализируем также настройку самого макета в дереве метаданных. Убедитесь, что для макета ОсновнойМакет в свойстве «Тип макета» выбрано значение «Двоичные данные». Если выбрать «Active document», методы БСП ИнициализироватьМакетОфисногоДокумента не смогут корректно обработать файл, что также может привести к косвенным ошибкам поиска макета.
Для успешного решения проблемы «Макет не найден» выполните следующие действия: проверьте идентичность строк-идентификаторов в процедурах регистрации и печати, убедитесь, что макет в расширении имеет тип Двоичные данные, и используйте полное обращение к метаданным при получении макета. Соблюдение этих правил обеспечит стабильную работу печати документов в формате Word в любой современной конфигурации на базе 1С:Предприятие 8.3.