При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией: макет табличного документа заимствован в расширение, в него внесены правки (изменены шрифты, добавлены колонки или логотип), но при выводе на печать система упорно показывает старый вариант из основной конфигурации. Это может сбивать с толку, особенно когда программный код в расширении работает корректно, а визуальная часть игнорируется. Разберем подробно, почему так происходит и как заставить платформу использовать актуальный макет.
Прежде чем приступать к сложным техническим манипуляциям, проанализируем стандартную возможность платформы — редактирование макетов в режиме 1С:Предприятие. В типовых конфигурациях существует справочник или регистр (в зависимости от версии БСП), где хранятся пользовательские изменения печатных форм.
Если пользователь ранее открывал форму "Макеты печатных форм", выбирал нужный документ и редактировал его вручную, то система создает "копию" макета в базе данных. Эта копия имеет наивысший приоритет. Даже если вы измените макет в конфигураторе или расширении, система будет подтягивать именно тот вариант, который сохранил пользователь. Выясним, есть ли такие правки: перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм. Если нужный макет выделен жирным шрифтом или отмечен специальным значком, значит, его нужно сбросить до стандартного состояния.
Одной из самых частых причин игнорирования изменений является механизм динамического обновления (в народе называемый "демоническим"). Когда расширение обновляется без перезапуска сеансов или "на горячую", сервер 1С может сохранить старую версию метаданных в своем кэше. Рассмотрим, как правильно очистить окружение для применения изменений:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.snccntx. Иногда требуется полная остановка службы ragent и удаление содержимого временных папок сеансовых данных.F7 при выгнанных пользователях).В современных конфигурациях печать реализуется через Библиотеку стандартных подсистем (БСП). Основной метод получения макета выглядит так:
УправлениеПечатью.МакетПечатнойФормы("Документ.ИмяДокумента.ПФ_MXL_ИмяМакета")
Разберем, как работает этот механизм внутри. БСП кэширует структуру макетов в оперативной памяти сервера для ускорения работы. Если вы добавили макет в расширение с тем же именем, функция должна вернуть его. Однако, если расширение подключено некорректно или имеет низкий приоритет, функция может обратиться к основной конфигурации. Посмотрим на критические настройки расширения:
Безопасный режим установлен, платформа может ограничивать доступ к некоторым методам переопределения. Попробуйте снять его в целях тестирования.Если чистка кэша и проверка настроек не помогают, опытные разработчики рекомендуют использовать более надежный метод — создание нового макета в расширении с уникальным префиксом. Это гарантирует, что система не перепутает объекты. Рассмотрим пошаговый алгоритм:
ПФ_MXL_СписаниеОС_Собственный.Печать или СформироватьПечатнуюФорму).&Вместо или &ИзменениеИВызов, чтобы переопределить получение макета.Пример изменения кода в модуле менеджера для использования нового макета:
&Вместо("СформироватьПечатнуюФорму")
Функция Мой_СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
// Вместо стандартного получения макета:
// Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.СписаниеОС.ПФ_MXL_ОС4");
// Используем наш макет из расширения:
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.СписаниеОС.ПФ_MXL_СписаниеОС_Собственный");
// Далее следует логика заполнения параметров макета...
ТабличныйДокумент = Новый ТабличныйДокумент;
// ... заполнение данных ...
Возврат ТабличныйДокумент;
КонецФункции
Иногда проблема кроется не в самом макете, а в том, как программный код обращается к его частям. Проанализируем ситуацию: если в расширенном макете вы случайно изменили имя области (например, было Заголовок, а стало ЗаголовокПФ) или удалили именованную ячейку, к которой обращается код основной конфигурации, система может выдать ошибку или вести себя непредсказуемо. При заимствовании макета всегда проверяйте соответствие имен всех областей (Header, Row, Footer и т.д.), так как регистр букв и наличие пробелов имеют значение для метода ПолучитьОбласть().
Подведем итог: если заимствованный макет не "подхватывается", начните с проверки пользовательских настроек в режиме предприятия и очистки кэша сервера. Если это не помогает, самым стабильным решением будет создание макета с новым именем в расширении и явное указание этого имени в переопределенном программном коде печати. Это исключит влияние механизмов кэширования платформы и гарантирует корректный результат даже после динамических обновлений.