При обновлении конфигурации 1С:ЗУП до версии 3.1.18 и выше многие разработчики столкнулись с внезапным прекращением работы внешних печатных форм. В процессе печати система выдает ошибку, ссылаясь на модуль УправлениеПечатьюМультиязычность и функцию ЯзыкиМакета. Давайте разберемся, почему это происходит и как вернуть работоспособность вашим обработкам.
Выясним причину сбоя. В новых версиях Библиотеки стандартных подсистем (БСП) разработчики ужесточили правила проверки путей к макетам. Когда вы вызываете процедуру ВывестиТабличныйДокументВКоллекцию, система теперь более требовательна к параметрам. Если в аргументе ПолныйПутьКМакету передается путь, похожий на путь к объекту метаданных (например, Справочник.Сотрудники), БСП пытается найти этот макет в основной конфигурации. Так как внешняя печатная форма является отдельным файлом, а не частью конфигурации, система не находит нужный макет в метаданных и вызывает исключение.
Самый эффективный способ устранения ошибки — изменение логики вызова процедуры печати. Нам необходимо убрать передачу избыточных параметров, которые заставляют систему искать макет вне контекста внешней обработки.
Рассмотрим пример кода, который часто встречается в старых реализациях:
// Некорректный вызов в новой версии БСП
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПФ_MXL_Макет",
"Синоним макета",
ТабличныйДокумент,
,
"Справочник.Сотрудники", // Избыточный параметр, вызывающий ошибку
"ПФ_MXL_Макет"
);
Чтобы исправить ситуацию, очистим аргумент ПолныйПутьКМакету. Это позволит функции БСП корректно обработать макет, находящийся внутри самой внешней обработки.
Печать, которая экспортируется для вызова из БСП.УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию.Неопределено аргументы, которые указывают на ПолныйПутьКМакету, если они не требуются для работы текущей логики.Пример исправленного корректного вызова:
// Исправленный вызов
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ПФ_MXL_Макет",
"Синоним макета",
ТабличныйДокумент
);
Проанализируем работу системы изнутри. В процедуре ЯзыкиМакета происходит проверка количества точек в пути макета:
ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина);
Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если вы передаете строку типа Справочник.Сотрудники, система интерпретирует это как попытку обращения к метаданным. Поскольку внешняя обработка не зарегистрирована в дереве метаданных конфигурации как объект с макетом ПФ_MXL_Макет, система считает, что макет отсутствует, и аварийно завершает работу.
В завершение разберем несколько важных советов, которые помогут избежать подобных проблем в будущем:
ЭтотОбъект.ПолучитьМакет("ИмяМакета"), не привязываясь к метаданным основной конфигурации.Применив данные рекомендации, вы восстановите работу всех внешних печатных форм и обеспечите совместимость вашего кода с обновлениями платформы 1С.