При доработке печатных форм через расширения конфигурации разработчики нередко сталкиваются с критической ошибкой: после добавления макета в расширение попытка сформировать печатную форму в режиме «1С:Предприятие» приводит к мгновенному падению платформы (аварийному завершению с генерацией дампа). В отдельных случаях сбой продолжает воспроизводиться даже после отключения проблемного расширения. Разберем по шагам, почему возникает эта ошибка, как устроены механизмы работы с макетами в расширениях и какие существуют надежные способы решения проблемы.
Проанализируем механику работы расширений с макетами, чтобы понять истоки проблемы:
rphost.ПолучитьМакет() в таком случае вызывает исключение «Недопустимое значение параметра».rphost удерживает старое состояние схемы данных в памяти, ошибка повторяется при любом вызове связанной функциональности.Самый надежный и рекомендуемый способ доработки печатных форм, исключающий платформенные сбои механизма слияния, — полный отказ от прямого заимствования макета. Вместо заимствования мы добавляем в расширение собственный макет с новым уникальным именем и перенаправляем обращение к нему в коде печати.
Рассмотрим пошаговый алгоритм реализации:
Расш1_ПФ_MXL_Накладная или РасшСчет_Макет.&Вместо.Посмотрим на пример переопределения функции определения пути к макету в модуле менеджера заимствованной обработки печати:
&Вместо("ПолныйПутьКМакету")
Функция РасшСчет_ПолныйПутьКМакету() Экспорт
// Возвращаем путь к собственному макету, созданному внутри расширения
Возврат "Обработка.ПечатьСчетНаОплату.РасшСчет_Макет";
КонецФункции
Если печать реализована через стандартные механизмы вызова макетов, переопределяем процедуру печати или функцию получения табличного документа, обращаясь к нашему новому макету по его собственному имени:
&Вместо("СформироватьПечатнуюФорму")
Функция Расш1_СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
// Получаем макет, созданный непосредственно в объекте расширения
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.КоммерческоеПредложениеКлиенту.Расш1_ПФ_MXL_КоммерческоеПредложение");
ТабличныйДокумент = Новый ТабличныйДокумент;
// Заполнение областей макета данными
Возврат ТабличныйДокумент;
КонецФункции
Если макет подчиненного объекта не определяется платформой внутри менеджера или если требуется использовать макет двоичных данных (DOCX, ODT), оптимальным решением является создание Общего макета в составе самого расширения.
Общие — Общие макеты.Расш1_ПФ_DOCX_ДоговорПоставки) и загружаем в него шаблон документа.
// Для табличных и двоичных документов через системный метод
ДвоичныеДанныеМакета = ПолучитьОбщийМакет("Расш1_ПФ_DOCX_ДоговорПоставки");
// Либо при формировании пути для подсистемы печати БСП
ПутьКМакету = "ОбщийМакет.Расш1_ПФ_DOCX_ДоговорПоставки";
Макет = УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету);
Использование общих макетов расширения полностью изолирует шаблон от базовой конфигурации и гарантирует отсутствие коллизий при вычислении дельты изменений.
Если логика доработки требует именно заимствования существующего макета табличного документа под тем же именем, обратим внимание на его палитру свойств в расширении. По умолчанию для заимствованного макета свойство Способ расширения установлено в значение Объединять. Именно режим объединения провоцирует сбой библиотеки moxel.dll.
Объединять на Замещать.В режиме замещения платформа перестает построчно и поклеточно вычислять разницу между типовым макетом и расширением, а полностью подменяет исходный макет версией из расширения, что устраняет причину дампа.
При использовании Библиотеки Стандартных Подсистем (БСП) важно учитывать работу регистра сведений пользовательских макетов печати:
УправлениеПечатью.МакетПечатнойФормы() в первую очередь проверяет наличие отредактированной версии макета в информационной базе. Если пользователь ранее изменял печатную форму в режиме предприятия (раздел Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм), платформа проигнорирует версию из расширения и загрузит макет из базы. В такой ситуации необходимо нажать кнопку Использовать стандартный макет в интерфейсе управления макетами.УправлениеПечатью.МакетПечатнойФормы() первым параметром всегда должна передаваться строка пути в формате "Документ.ИмяДокумента.ИмяМакета" или "ОбщийМакет.ИмяМакета". Передача ссылки на объект метаданных (Метаданные.Документы...) приводит к ошибке выполнения или возврату значения Неопределено.Если после удаления проблемного макета или отключения расширения база продолжает аварийно завершать работу при открытии формы печати, выполним принудительную очистку серверного кэша:
1C:Enterprise Server Agent).C:\Program Files\1cv8\srvinfo\reg_1541).snccntx*. Каталоги базы данных и журналы регистрации при этом не затрагиваются.1cv8 внутри %AppData% и %LocalAppData%).