Разберем типичную, но крайне неприятную ситуацию, с которой сталкиваются разработчики при попытке кастомизации печатных форм через механизм расширений. Представим: вы заимствуете типовой макет (например, «Счет на оплату») в расширение, вносите минимальное косметическое изменение (меняете одно слово или цвет ячейки), и вдруг при печати документ «схлопывается» до 1/4 страницы или выводится с некорректным масштабом. Если вы новичок, вам также может быть полезна общая инструкция по редактированию печатных форм в программах 1С. При этом в основной конфигурации тот же макет работает идеально. Проанализируем, почему это происходит и как решить проблему несколькими способами.
Проанализируем механику работы платформы «1С:Предприятие» (особенно актуально для релизов 8.3.21–8.3.24). Основная причина того, что макет печатается некорректно после изменений в расширении, заключается в потере или повреждении объекта ПараметрыСтраницы. Когда вы меняете хотя бы один символ в заимствованном табличном документе, платформа перестает использовать готовый бинарный макет из основной конфигурации и генерирует новый на основе данных из расширения. В сложных случаях рекомендуется провести комплексный анализ конфигураций и состава расширений на наличие ошибок.
В процессе этой генерации часто происходит следующее:
Рассмотрим по шагам основные способы решения этой задачи, от простых к более надежным.
Как показывает практика и опыт участников форума, прямое заимствование макета через правую кнопку мыши («Добавить в расширение») часто ведет к непредсказуемому поведению. Самый стабильный метод — создать в расширении новый макет, скопировав в него содержимое типового.
Выполним следующие действия:
Макет (тип — Табличный документ) с уникальным именем, например, СчетНаОплату_Кастомный.&Вместо или &ИзменениеИВызов.Посмотрим на пример кода, который подменяет макет:
&Вместо("СформироватьПечатнуюФормуСчета")
Функция Расш1_СформироватьПечатнуюФормуСчета(ПараметрыПечати)
// Вместо получения макета из метаданных объекта основной конфигурации:
// Макет = УправлениеПечатью.МакетОбъекта("Документ.СчетНаОплату.ПФ_MXL_Счет");
// Получаем наш новый макет из расширения:
Макет = ПолучитьМакет("СчетНаОплату_Кастомный");
// Далее идет стандартный код заполнения областей
// ...
Возврат ТабДок;
КонецФункции
Если вы все же хотите использовать именно заимствованный макет, или если подмена макета затруднена архитектурой конфигурации, можно принудительно устанавливать настройки печати в коде после того, как табличный документ уже сформирован.
Разберем, какие свойства объекта ТабличныйДокумент критически важны для правильного вывода на лист:
// В процедуре печати перед возвратом ТабДока
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; // Или Ландшафт
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
// Очень важный параметр, который заставляет систему игнорировать старый кэш настроек принтера
ТабДок.КлючПараметровПечати = "УникальныйИдентификаторНовойФормы_" + Строка(Новый УникальныйИдентификатор());
Использование свойства КлючПараметровПечати позволяет системе запомнить настройки масштаба индивидуально для этой печатной формы. Если ключ не указать, 1С может применить настройки от другой формы, что и приводит к визуальному искажению.
Для сложных конфигураций использование внешних печатных форм часто оказывается более оправданным, чем работа с расширениями. Для быстрого старта можно использовать шаблон внешних подключаемых печатных форм для БСП. Внешняя форма полностью автономна, её макет не зависит от процесса объединения метаданных расширения и основной конфигурации.
Основные преимущества этого подхода:
Если вы не хотите менять программный код, попробуйте выполнить «гигиеническую» очистку макета в расширении:
Резюме: Проблема «1/4 страницы» — это следствие десинхронизации свойств масштабирования между основной базой и расширением. Наиболее профессиональным и стабильным решением является создание копии макета внутри расширения и его программная подмена. Это гарантирует, что ваши изменения не будут зависеть от специфических ошибок платформы при слиянии заимствованных объектов.