Работа в объединенных решениях, таких как 1С:CRM 3 + 1С:ERP 2.5, часто сопряжена с трудностями при модификации стандартных механизмов печати. Библиотека стандартных подсистем (БСП) накладывает свои правила на именование макетов, а механизмы расширений требуют строгого соблюдения правил видимости методов. Разберем по шагам, почему возникают ошибки при копировании макетов и как правильно выносить доработки в расширения.
Когда мы пытаемся изменить или скопировать макет через стандартную форму «Пользовательские макеты печати», система может выдать ошибку: Макет "Документ.КоммерческоеПредложениеКлиенту.ПФ_MXL_Макет434" не существует. Проанализируем, почему это происходит.
Механизм БСП ищет макет в метаданных по его полному пути. В сложных конфигурациях, особенно в CRM-модулях, имена макетов могут динамически дополняться суффиксами (например, «434») в процессе объединения конфигураций или при использовании различных версий шаблонов. Если в коде процедуры ПриДобавленииКомандПечати или в менеджере печати указан идентификатор, который не совпадает в точности с именем макета в конфигураторе, поиск завершится неудачей.
Рассмотрим подробнее, как работает поиск макета в общем модуле УправлениеПечатью. Программа выполняет функцию НайтиМакет(), которая обращается к метаданным объекта. Если вы добавили свой макет в расширение, но не обновили идентификаторы объектов метаданных, БСП может его «не видеть».
Для решения этой проблемы выполните следующие действия:
ДобавитьКомандыПечати идентификатор команды совпадает с ожидаемым именем макета./С ЗапуститьОбновлениеИнформационнойБазы для обновления справочника идентификаторов метаданных.Часто программисты сталкиваются с тем, что при переносе кода формирования печатной формы в расширение, система перестает видеть методы. Ошибка Метод объекта не обнаружен (КП_СформироватьПечатнуюФорму...) сигнализирует о проблемах с областью видимости или некорректном обращении к модулю.
Посмотрим на пример кода, который вызывает ошибку:
// В расширении происходит вызов
CRM_Модуль = ОбщегоНазначения.ОбщийМодуль("CRM_Модуль_МетодыМодулейМенеджеровДокументов");
Возврат CRM_Модуль.КП_СформироватьПечатнуюФормуКоммерческогоПредложения1(МассивОбъектов, ОбъектыПечати);
Выясним причину этой ситуации. В 1С существует несколько нюансов при работе с расширениями:
1. Использование функции ОбщегоНазначения.ОбщийМодуль. Эта функция БСП ищет модуль в основной конфигурации. Если ваш новый модуль находится только в расширении, БСП может его не найти без указания префикса расширения или если настройки БСП не предполагают поиск в динамических модулях. Вместо этого лучше обращаться к модулю напрямую по его имени, если он объявлен в том же расширении.
2. Свойства общего модуля. Проанализируйте свойства модуля в расширении. Для того чтобы метод был доступен при печати (которая часто инициируется с клиента, но исполняется на сервере), у модуля должны стоять флаги «Сервер» и «Вызов сервера» (если обращение идет напрямую с клиента) или «Внешнее соединение».
3. Экспортность метода. Убедитесь, что процедура или функция в расширении объявлена с ключевым словом Экспорт:
Функция КП_СформироватьПечатнуюФормуКоммерческогоПредложения1(МассивОбъектов, ОбъектыПечати) Экспорт
// Логика формирования табличного документа
КонецФункции
В отличие от типовой ERP, документ Коммерческое предложение клиенту в CRM имеет расширенную логику. Печатные формы здесь могут формироваться не только через MXL-макеты, но и через шаблоны Word/OpenOffice. Если вы создаете печатную форму через механизм БСП, важно правильно встроиться в цепочку вызовов CRM.
Рассмотрим, как правильно зарегистрировать команду печати в модуле менеджера, чтобы она была подхвачена подсистемой:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "КоммерческоеПредложениеКлиенту1";
КомандаПечати.Представление = НСтр("ru = 'КП (своя форма)'");
КомандаПечати.ПроверкаПроведенности = Истина;
КомандаПечати.Порядок = 1;
КонецПроцедуры
Если после добавления этого кода команда не появилась, проверьте общий модуль CRM_УправлениеПечатьюПереопределяемый. В объединенных решениях CRM часто перехватывает управление печатью, и вам может потребоваться внести изменения в процедуру ПриПечати этого модуля (через расширение с аннотацией &После или &Вместо).
Пользователи часто жалуются, что во внешних печатных формах или новых макетах не заполняется список товаров. Это происходит потому, что в CRM данные о товарах могут храниться не в стандартной табличной части Товары, а во вложенных структурах, связанных с Вариантами коммерческого предложения.
При формировании запроса для печати рекомендуем использовать типовые функции CRM, которые собирают данные по всем активным вариантам КП. Например, обратите внимание на методы в модуле CRM_МетодыМодулейМенеджеровДокументов. Если вы пишете свой запрос «с нуля» в расширении, обязательно учитывайте реквизит Вариант и связь с табличными частями CRM.
Чтобы быстро найти место возникновения ошибки, используйте следующие приемы:
УправлениеПечатью в функции СформироватьПечатныеФормы. Проверьте, какие именно идентификаторы приходят в параметре ИменаМакетов.Важно: При работе с ОбщегоНазначения.ОбщийМодуль всегда проверяйте актуальность кэша метаданных. В большинстве случаев прямая ссылка на модуль расширения (без использования строковых имен) работает стабильнее и позволяет системе контроля типов 1С отлавливать ошибки еще на этапе компиляции.