Почему метод ПроверитьВывод в 1С возвращает Ложь для области, которая помещается на страницу

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

При формировании печатных форм и этикеток в 1С разработчики часто сталкиваются со странным поведением: метод ПроверитьВывод() объекта ТабличныйДокумент возвращает Ложь, утверждаю, что область не влезает на текущий лист. Однако если игнорировать этот результат и принудительно вызвать метод Вывести(), область прекрасно размещается на странице, а количество страниц не увеличивается.

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

Причины не корректного срабатывания метода ПроверитьВывод

Проанализируем ситуацию изнутри. Метод ПроверитьВывод() рассчитывает геометрические размеры выводимых областей до физического рендеринга на листе. На его расчеты оказывают прямое влияние несколько факторов:

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

Репродукция проблемы в коде

Посмотрим на пример кода, в котором демонстрируется данная проблема при динамическом формировании текста с переносами:


ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ВысотаСтраницы = 49;
ТабДок.ШиринаСтраницы = 124;

Макет = ПолучитьМакет("Макет");
Область1 = Макет.ПолучитьОбласть("Область1");

СтрокаПараметра = "";
Сч = 0;

Пока Сч < 100 Цикл
    Сч = Сч + 1;
    СтрокаПараметра = СтрокаПараметра + " Текст с переносом";
    Область1.Параметры.АдресДоставки = СтрокаПараметра;
    
    // В какой-то момент ПроверитьВывод вернет Ложь,
    // несмотря на то, что фактически область еще помещается на лист
    Если Не ТабДок.ПроверитьВывод(Область1) Тогда
        Прервать;
    КонецЕсли;
    
    ТабДок.Вывести(Область1);
КонецЦикла;

ТабДок.Показать();

Способы решения и обхода проблемы

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

Вариант 1. Использование КлючаПараметровПечати и системных настроек принтера

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

Установите свойство КлючПараметровПечати перед проверкой вывода:

ТабДок.КлючПараметровПечати = "ПараметрыПечати_ЭтикеткаУпаковки";

Если печать выполняется на специализированный принтер (например, принтер этикеток 49х124 мм), убедитесь, что в свойствах самого принтера в операционной системе выбран правильный размер бумаги по умолчанию. В противном случае платформа 1С будет выполнять расчеты относительно стандартного листа А4.

Вариант 2. Проверка через временный табличный документ

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

Рассмотрим пример функции для точной проверки:


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

Вариант 3. Временное отключение автомасштабирования

Если проблема вызвана исключительно расчетом геометрии при включенном свойстве АвтоМасштаб, отключите его перед проверкой вывода и включите обратно перед отображением пользователю:


// Временно отключаем автомасштаб для корректного расчета
ТабДок.АвтоМасштаб = Ложь;

Если ТабДок.ПроверитьВывод(ОбластьАдресДоставки) Тогда
    ТабДок.Вывести(ОбластьАдресДоставки);
Иначе
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    ТабДок.Вывести(ОбластьАдресДоставки);
КонецЕсли;

// Включаем обратно перед выводом на экран
ТабДок.АвтоМасштаб = Истина;

Выяснив причину поведения платформы, вы можете выбрать наиболее подходящий вариант: использовать временный ТабличныйДокумент для точной проверки строк с автовысотой или настроить параметры печати и принтера по умолчанию.

← На главную