Почему ТабДок.Автомасштаб = Истина не работает и как заставить документ помещаться по ширине страницы?

Программист 1С v8.3 (Обычные формы)
← На главную

Разработка печатных форм в 1С — это процесс, требующий внимания к деталям, особенно когда речь идет о выводе сложных документов с большим количеством колонок. Одной из самых частых проблем, с которой сталкиваются программисты, является ситуация, когда программная установка ТабДок.Автомасштаб = Истина; игнорируется платформой, и документ при печати «вылезает» за границы листа или отображается в некорректном масштабе. Давайте подробно разберем, почему это происходит и как гарантированно добиться размещения документа по ширине страницы.

Разберем основную причину: влияние универсальных механизмов печати

В типовых конфигурациях (особенно на обычных формах, таких как УТ 10.3, БП 2.0 или самописных решениях того периода) часто используется процедура УниверсальныеМеханизмы.НапечататьДокумент. Проанализируем ситуацию: когда мы передаем сформированный ТабличныйДокумент в эту процедуру, платформа открывает общую форму печати. Проблема заключается в том, что эта форма может переопределять или попросту не считывать свойство Автомасштаб непосредственно из переданного объекта.

Как отмечают опытные разработчики, при передаче документа в обработчик печати критически важным становится свойство ИмяПараметровПечати. Рассмотрим пример кода, который решает проблему:


ТабДок = Новый ТабличныйДокумент;
// Указываем уникальный ключ для сохранения настроек печати
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДоговорКуплиПродажи";
// Пытаемся установить автомасштаб
ТабДок.Автомасштаб = Истина;

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

Проанализируем альтернативу: КоличествоСтраницПоШирине

Если стандартный Автомасштаб продолжает капризничать, рассмотрим более жесткий, но надежный метод управления компоновкой листа. Вместо того чтобы полагаться на автоматику, мы можем явно приказать системе уместить весь контент в одну страницу по горизонтали. Для этого используется свойство КоличествоСтраницПоШирине.

Посмотрим, как это реализовать программно:


Функция ПечатьДоговора(Ссылка) Экспорт
    ТабДок = Новый ТабличныйДокумент;
    // ... здесь идет код заполнения документа из макета ...
    
    // Отключаем стандартный автомасштаб, чтобы он не конфликтовал
    ТабДок.Автомасштаб = Ложь; 
    // Принудительно вписываем в 1 страницу по ширине
    ТабДок.КоличествоСтраницПоШирине = 1; 
    
    Возврат ТабДок;
КонецФункции

Этот метод часто оказывается более стабильным, особенно если вы выводите счет с QR кодом, так как он заставляет драйвер принтера принудительно сжимать изображение до нужных границ, игнорируя промежуточные расчеты платформы. Для этой задачи можно использовать готовое решение для формирования счета с QR-кодом.

Выясним причину: «Мусор» в макете и невидимые колонки

Иногда корень проблемы лежит не в коде, а в самом макете (Макет). Свойство Автомасштаб рассчитывает коэффициент сжатия, исходя из самой правой заполненной или измененной колонки. Рассмотрим типичные ошибки оформления макета:

  1. Пунктирные линии границ: Если в макете вы случайно изменили ширину колонки далеко справа или добавили QR и штрихкоды, 1С будет считать, что эта область должна попасть на печать.
  2. Случайные объекты: Невидимые рисунки, картинки товара, пустые текстовые области или примечания, вышедшие за правую границу документа, заставляют Автомасштаб учитывать их, из-за чего основной текст становится слишком мелким или вовсе не влезает.
  3. Штриховка: Если при просмотре макета вы не видите пунктирной линии края страницы, это может означать, что область печати не определена корректно.

Совет: Чтобы очистить макет, выделите несколько «лишних» колонок справа от вашего документа, нажмите правую кнопку мыши и выберите «Удалить». Это гарантирует, что 1С не будет учитывать «фантомную» ширину при расчете масштаба. При необходимости можно воспользоваться руководством по редактированию печатных форм в 1С.

Рассмотрим особенности работы драйвера принтера

Нужно понимать, что 1С не сама масштабирует документ, а отправляет команды драйверу принтера. Выясним, как это влияет на результат:

Алгоритм Автомасштаб запрашивает у текущего принтера размер непечатных полей. Если у вас по умолчанию установлен принтер с узкими полями (или виртуальный PDF-принтер), а печать идет на обычный лазерный принтер с широкими полями, расчет может быть неверным. Всегда проверяйте настройки принтера по умолчанию в операционной системе, так как именно на них ориентируется метод Показать() и Напечатать() при первичной инициализации объекта ТабличныйДокумент.

Пошаговый чек-лист для исправления проблемы

Если ваш документ все равно не выводится по ширине страницы, выполните следующие шаги вместе с нами:

  1. Убедитесь, что установка свойств происходит после того, как в ТабДок выведены все области. Если установить масштаб у пустого документа, а потом выводить в него области, настройки могут сброситься.
  2. Проверьте, не переопределяется ли свойство Масштаб (в процентах) далее по коду. Если Масштаб установлен в 100, то Автомасштаб может быть проигнорирован.
  3. Добавьте уникальное ИмяПараметровПечати, чтобы исключить влияние старых настроек от других документов.
  4. Используйте отладчик: поставьте точку остановки перед выводом на экран и проверьте значение свойства ТабДок.Автомасштаб. Если там Ложь, значит, какая-то общая процедура (например, из БСП или Универсальных механизмов) меняет его значение.
  5. Попробуйте связку ТабДок.Автомасштаб = Истина; ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; (если документ очень широкий).

Помните, что Автомасштаб умеет только уменьшать документ. Если ваш макет слишком узкий и вы хотите растянуть его на весь лист А4, это свойство не поможет — в таком случае нужно программно увеличивать ширину колонок через свойство Область.ШиринаКолонки.

← На главную