Как исправить ошибку «Макет не найден» при заполнении .docx в 1С:Бухгалтерия 3.0?

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

Разработка собственных печатных форм в формате Microsoft Word (.docx) в современных конфигурациях 1С, таких как Бухгалтерия предприятия 3.0, часто выполняется с использованием Библиотеки стандартных подсистем (БСП). Однако при работе через механизм расширений программисты нередко сталкиваются с ошибкой Макет "" не найден. Рассмотрим детально, почему возникает эта проблема, как правильно организовать архитектуру печатной формы и разберем корректный программный код для работы с офисными документами.

Анализ причины ошибки

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

Основные факторы, влияющие на появление ошибки:

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

Шаг 1. Регистрация команды печати в модуле менеджера

Для начала разберем, как правильно добавить команду печати. В модуле менеджера объекта (документа или справочника), который мы расширяем, необходимо переопределить процедуру ДобавитьКомандыПечати. Обратите внимание на использование аннотации &После.


&После("ДобавитьКомандыПечати")
Процедура ШифтДобавитьКомандыПечати(КомандыПечати)
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.МенеджерПечати = "Обработка.ШифтКП";
    КомандаПечати.Идентификатор = "ШифтКП";
    КомандаПечати.Представление = "Коммерческое предложение (цветное)";
    КомандаПечати.Обработчик = "ПечатьНаКлиенте";
    КомандаПечати.Порядок = 1;
КонецПроцедуры

Здесь важно, чтобы Идентификатор был уникальным и далее использовался без изменений во всех процедурах формирования документа.

Шаг 2. Реализация клиентской логики и вызов формы настроек

Часто перед печатью требуется уточнить параметры (например, выбрать ответственного или формат цен). В этом случае мы используем промежуточную форму. Рассмотрим обработчик ПечатьНаКлиенте в модуле формы объекта:


&НаКлиенте
Функция ПечатьНаКлиенте(ПараметрыПечати) Экспорт
    // Вызываем форму настроек перед печатью
    ОписаниеОповещения = Новый ОписаниеОповещения("ПечатьНаКлиентеЗавершение", ЭтотОбъект, ПараметрыПечати);
    ОткрытьФорму(
        "Обработка.ШифтКП.Форма.ФормаНастроек", 
        , 
        ЭтотОбъект, 
        , 
        , 
        , 
        ОписаниеОповещения, 
        РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
    );
    Возврат Неопределено;
КонецФункции

&НаКлиенте
Процедура ПечатьНаКлиентеЗавершение(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        // Передаем управление стандартному механизму БСП
        УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
            "Обработка.ШифтКП",
            "ШифтКП",
            ДополнительныеПараметры.ОбъектыПечати,
            ЭтотОбъект,
            Результат
        );
    КонецЕсли;
КонецПроцедуры

Шаг 3. Формирование печатной формы в модуле менеджера обработки

Теперь перейдем к самому ответственному этапу — заполнению макета .docx данными. Выясним причину, по которой макет может быть «не найден». В процедуре Печать мы должны четко инициализировать коллекцию. Рассмотрим исправленный подход:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Проверяем, нужно ли печатать наш макет
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ШифтКП") Тогда
        ПечатьОбъекта(КоллекцияПечатныхФорм, МассивОбъектов, ПараметрыПечати);
    КонецЕсли;
КонецПроцедуры

Процедура ПечатьОбъекта(КоллекцияПечатныхФорм, МассивОбъектов, ПараметрыПечати) Экспорт
    Ссылка = МассивОбъектов[0];
    ТипМакета = "DOCX";
    
    // Получаем структуру сведений о печатной форме
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ШифтКП");
    
    // КРИТИЧЕСКИЙ МОМЕНТ: явное обращение к макету обработки в расширении
    Попытка
        ДвоичныеДанныеМакета = Обработки.ШифтКП.ПолучитьМакет("ОсновнойМакет");
    Исключение
        ВызватьИсключение "Не удалось получить макет 'ОсновнойМакет'. Проверьте его наличие в расширении.";
    КонецПопытки;

    СсылкаНаМакет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, ТипМакета, "ШифтКП");
    ПечатнаяФормаWord = УправлениеПечатью.ИнициализироватьПечатнуюФорму(ТипМакета, СсылкаНаМакет.НастройкиСтраницыМакета, СсылкаНаМакет);

    // Заполнение данными
    СтруктураПараметров = ПолучитьДанныеДокумента(Ссылка); 
    СтруктураОбластей = Новый Структура;
    УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Шапка", "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "Подвал", "Общая");
    УправлениеПечатью.ДобавитьОписаниеОбласти(СтруктураОбластей, "СписокУслуг", "СтрокаТаблицы");

    // Вывод областей
    ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Шапка);
    УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров);

    ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.СписокУслуг);
    УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров.Товары);

    ОбластьМакета = УправлениеПечатью.ОбластьМакета(СсылкаНаМакет, СтруктураОбластей.Подвал);
    УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаWord, ОбластьМакета, СтруктураПараметров);

    // Финализация
    АдресХранилищаОфисныйДокумент = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаWord);
    УправлениеПечатью.ОчиститьСсылки(ПечатнаяФормаWord, Ложь);
    УправлениеПечатью.ОчиститьСсылки(СсылкаНаМакет);

    ОфисныеДокументы = Новый Соответствие;
    ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, "Коммерческое предложение");
    ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецПроцедуры

Важные рекомендации по работе с .docx

Чтобы избежать ошибок при заполнении параметров, проанализируем структуру самого файла Word. БСП использует механизм Закладок (Bookmarks) для определения областей документа. Рассмотрим основные правила подготовки макета:

  1. Имена областей: Если в коде вы указываете область Шапка, в файле Word должна существовать закладка с именем Шапка_Начало и Шапка_Конец (или одна общая закладка Шапка, охватывающая текст).
  2. Табличные части: Для вывода строк таблицы (например, СписокУслуг) закладка должна охватывать всю строку таблицы целиком. Внутри ячеек параметры указываются в фигурных скобках, например: {Наименование}.
  3. Регистр имен: Имена параметров в структуре 1С (например, СтруктураПараметров.Вставить("Цена", 100)) должны строго совпадать с именами в макете {Цена}.

Почему важно использовать Обработки.ШифтКП.ПолучитьМакет?

В среде расширений платформа 1С иногда может путать контексты. Если вы вызываете ПолучитьМакет("Имя") просто в модуле менеджера, система может искать этот макет в объекте основной конфигурации, который вы расширяете. Прямое указание имени обработки гарантирует, что двоичные данные будут извлечены именно из вашего расширения.

Проанализируем также настройку самого макета в дереве метаданных. Убедитесь, что для макета ОсновнойМакет в свойстве «Тип макета» выбрано значение «Двоичные данные». Если выбрать «Active document», методы БСП ИнициализироватьМакетОфисногоДокумента не смогут корректно обработать файл, что также может привести к косвенным ошибкам поиска макета.

Резюме

Для успешного решения проблемы «Макет не найден» выполните следующие действия: проверьте идентичность строк-идентификаторов в процедурах регистрации и печати, убедитесь, что макет в расширении имеет тип Двоичные данные, и используйте полное обращение к метаданным при получении макета. Соблюдение этих правил обеспечит стабильную работу печати документов в формате Word в любой современной конфигурации на базе 1С:Предприятие 8.3.

← На главную