Почему печатная форма в расширении печатается не на всю страницу и как это исправить?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

Разберем типичную, но крайне неприятную ситуацию, с которой сталкиваются разработчики при попытке кастомизации печатных форм через механизм расширений. Представим: вы заимствуете типовой макет (например, «Счет на оплату») в расширение, вносите минимальное косметическое изменение (меняете одно слово или цвет ячейки), и вдруг при печати документ «схлопывается» до 1/4 страницы или выводится с некорректным масштабом. Если вы новичок, вам также может быть полезна общая инструкция по редактированию печатных форм в программах 1С. При этом в основной конфигурации тот же макет работает идеально. Проанализируем, почему это происходит и как решить проблему несколькими способами.

Выясняем причину: потеря параметров страницы

Проанализируем механику работы платформы «1С:Предприятие» (особенно актуально для релизов 8.3.21–8.3.24). Основная причина того, что макет печатается некорректно после изменений в расширении, заключается в потере или повреждении объекта ПараметрыСтраницы. Когда вы меняете хотя бы один символ в заимствованном табличном документе, платформа перестает использовать готовый бинарный макет из основной конфигурации и генерирует новый на основе данных из расширения. В сложных случаях рекомендуется провести комплексный анализ конфигураций и состава расширений на наличие ошибок.

В процессе этой генерации часто происходит следующее:

  1. Сброс флага Автомасштаб: В оригинале обычно установлено значение «По ширине страницы». В расширении это свойство может сброситься в «100%», и если макет широкий, принтер пытается уместить его, уменьшая масштаб до минимума.
  2. Конфликт кэширования: Платформа может хранить старые настройки печати для конкретного пользователя, которые конфликтуют с новой структурой макета из расширения.
  3. Особенности бинарного сравнения: При заимствовании метаданных иногда некорректно переносятся скрытые настройки областей печати и колонок.

Рассмотрим по шагам основные способы решения этой задачи, от простых к более надежным.

Решение 1: Копирование макета вместо заимствования

Как показывает практика и опыт участников форума, прямое заимствование макета через правую кнопку мыши («Добавить в расширение») часто ведет к непредсказуемому поведению. Самый стабильный метод — создать в расширении новый макет, скопировав в него содержимое типового.

Выполним следующие действия:

  1. Откроем типовой макет в основной конфигурации, выделим все ячейки (Ctrl+A) и скопируем их.
  2. В расширении создадим новый объект Макет (тип — Табличный документ) с уникальным именем, например, СчетНаОплату_Кастомный.
  3. Вставим скопированные ячейки в новый макет. Настроим параметры страницы (ориентация, поля, масштаб «По ширине страницы») непосредственно в этом макете в конфигураторе.
  4. Теперь нам нужно заставить систему использовать именно этот макет. Для этого найдем процедуру печати в модуле менеджера или в специализированном модуле (для «Далион», Бит.Финанс или БСП). Нам нужно перехватить формирование печатной формы через &Вместо или &ИзменениеИВызов.

Посмотрим на пример кода, который подменяет макет:


&Вместо("СформироватьПечатнуюФормуСчета")
Функция Расш1_СформироватьПечатнуюФормуСчета(ПараметрыПечати)
    // Вместо получения макета из метаданных объекта основной конфигурации:
    // Макет = УправлениеПечатью.МакетОбъекта("Документ.СчетНаОплату.ПФ_MXL_Счет");
    
    // Получаем наш новый макет из расширения:
    Макет = ПолучитьМакет("СчетНаОплату_Кастомный");
    
    // Далее идет стандартный код заполнения областей
    // ...
    Возврат ТабДок;
КонецФункции

Решение 2: Программная установка параметров страницы

Если вы все же хотите использовать именно заимствованный макет, или если подмена макета затруднена архитектурой конфигурации, можно принудительно устанавливать настройки печати в коде после того, как табличный документ уже сформирован.

Разберем, какие свойства объекта ТабличныйДокумент критически важны для правильного вывода на лист:


// В процедуре печати перед возвратом ТабДока
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; // Или Ландшафт
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;

// Очень важный параметр, который заставляет систему игнорировать старый кэш настроек принтера
ТабДок.КлючПараметровПечати = "УникальныйИдентификаторНовойФормы_" + Строка(Новый УникальныйИдентификатор());

Использование свойства КлючПараметровПечати позволяет системе запомнить настройки масштаба индивидуально для этой печатной формы. Если ключ не указать, 1С может применить настройки от другой формы, что и приводит к визуальному искажению.

Решение 3: Использование внешней печатной формы

Для сложных конфигураций использование внешних печатных форм часто оказывается более оправданным, чем работа с расширениями. Для быстрого старта можно использовать шаблон внешних подключаемых печатных форм для БСП. Внешняя форма полностью автономна, её макет не зависит от процесса объединения метаданных расширения и основной конфигурации.

Основные преимущества этого подхода:

Рекомендации по «лечению» макета без кода

Если вы не хотите менять программный код, попробуйте выполнить «гигиеническую» очистку макета в расширении:

  1. Проверьте лишние колонки: Часто при редактировании макета случайно раздвигается правая граница (появляются пустые колонки с установленной шириной). Платформа пытается уместить их все на один лист, сжимая основную область. Удалите все неиспользуемые колонки справа от макета.
  2. Сброс настроек печати: В режиме конфигуратора откройте макет в расширении. Перейдите в меню Таблица — Настройки печати — Очистить. После этого заново установите через параметры страницы нужный масштаб и поля. Это перепишет блок бинарных данных, который мог быть поврежден при импорте.
  3. Проверка именованных областей: Убедитесь, что заимствованные области (строки/колонки) не содержат пустых именованных зон, выходящих за визуальные границы документа.

Резюме: Проблема «1/4 страницы» — это следствие десинхронизации свойств масштабирования между основной базой и расширением. Наиболее профессиональным и стабильным решением является создание копии макета внутри расширения и его программная подмена. Это гарантирует, что ваши изменения не будут зависеть от специфических ошибок платформы при слиянии заимствованных объектов.

← На главную