Как исправить ошибки «Макет не существует» и «Метод объекта не обнаружен» при доработке печатных форм в 1С:ERP и CRM

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

Работа в объединенных решениях, таких как 1С:CRM 3 + 1С:ERP 2.5, часто сопряжена с трудностями при модификации стандартных механизмов печати. Библиотека стандартных подсистем (БСП) накладывает свои правила на именование макетов, а механизмы расширений требуют строгого соблюдения правил видимости методов. Разберем по шагам, почему возникают ошибки при копировании макетов и как правильно выносить доработки в расширения.

Причина ошибки «Макет не существует» при редактировании в режиме 1С:Предприятие

Когда мы пытаемся изменить или скопировать макет через стандартную форму «Пользовательские макеты печати», система может выдать ошибку: Макет "Документ.КоммерческоеПредложениеКлиенту.ПФ_MXL_Макет434" не существует. Проанализируем, почему это происходит.

Механизм БСП ищет макет в метаданных по его полному пути. В сложных конфигурациях, особенно в CRM-модулях, имена макетов могут динамически дополняться суффиксами (например, «434») в процессе объединения конфигураций или при использовании различных версий шаблонов. Если в коде процедуры ПриДобавленииКомандПечати или в менеджере печати указан идентификатор, который не совпадает в точности с именем макета в конфигураторе, поиск завершится неудачей.

Рассмотрим подробнее, как работает поиск макета в общем модуле УправлениеПечатью. Программа выполняет функцию НайтиМакет(), которая обращается к метаданным объекта. Если вы добавили свой макет в расширение, но не обновили идентификаторы объектов метаданных, БСП может его «не видеть».

Для решения этой проблемы выполните следующие действия:

  1. Проверьте точное имя макета в конфигураторе (включая расширения).
  2. Убедитесь, что в модуле менеджера документа в процедуре ДобавитьКомандыПечати идентификатор команды совпадает с ожидаемым именем макета.
  3. Запустите обновление информационной базы с параметром /С ЗапуститьОбновлениеИнформационнойБазы для обновления справочника идентификаторов метаданных.

Разбор ошибки «Метод объекта не обнаружен» в расширении

Часто программисты сталкиваются с тем, что при переносе кода формирования печатной формы в расширение, система перестает видеть методы. Ошибка Метод объекта не обнаружен (КП_СформироватьПечатнуюФорму...) сигнализирует о проблемах с областью видимости или некорректном обращении к модулю.

Посмотрим на пример кода, который вызывает ошибку:


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

Выясним причину этой ситуации. В 1С существует несколько нюансов при работе с расширениями:

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

2. Свойства общего модуля. Проанализируйте свойства модуля в расширении. Для того чтобы метод был доступен при печати (которая часто инициируется с клиента, но исполняется на сервере), у модуля должны стоять флаги «Сервер» и «Вызов сервера» (если обращение идет напрямую с клиента) или «Внешнее соединение».

3. Экспортность метода. Убедитесь, что процедура или функция в расширении объявлена с ключевым словом Экспорт:


Функция КП_СформироватьПечатнуюФормуКоммерческогоПредложения1(МассивОбъектов, ОбъектыПечати) Экспорт
    // Логика формирования табличного документа
КонецФункции

Специфика печати в 1С:CRM 3.0

В отличие от типовой ERP, документ Коммерческое предложение клиенту в CRM имеет расширенную логику. Печатные формы здесь могут формироваться не только через MXL-макеты, но и через шаблоны Word/OpenOffice. Если вы создаете печатную форму через механизм БСП, важно правильно встроиться в цепочку вызовов CRM.

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


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

Если после добавления этого кода команда не появилась, проверьте общий модуль CRM_УправлениеПечатьюПереопределяемый. В объединенных решениях CRM часто перехватывает управление печатью, и вам может потребоваться внести изменения в процедуру ПриПечати этого модуля (через расширение с аннотацией &После или &Вместо).

Проблема заполнения табличных частей (Товары)

Пользователи часто жалуются, что во внешних печатных формах или новых макетах не заполняется список товаров. Это происходит потому, что в CRM данные о товарах могут храниться не в стандартной табличной части Товары, а во вложенных структурах, связанных с Вариантами коммерческого предложения.

При формировании запроса для печати рекомендуем использовать типовые функции CRM, которые собирают данные по всем активным вариантам КП. Например, обратите внимание на методы в модуле CRM_МетодыМодулейМенеджеровДокументов. Если вы пишете свой запрос «с нуля» в расширении, обязательно учитывайте реквизит Вариант и связь с табличными частями CRM.

Итоговые рекомендации по отладке

Чтобы быстро найти место возникновения ошибки, используйте следующие приемы:

  1. Установите точку останова в общем модуле УправлениеПечатью в функции СформироватьПечатныеФормы. Проверьте, какие именно идентификаторы приходят в параметре ИменаМакетов.
  2. Если используется расширение, проверьте, что в свойствах расширения снят флаг «Безопасный режим». В безопасном режиме работа с некоторыми серверными вызовами может быть ограничена.
  3. Для проверки видимости метода попробуйте вызвать его из простой внешней обработки. Если внешняя обработка видит метод модуля расширения, а система печати нет — значит, проблема в параметрах вызова внутри БСП.

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

← На главную