При формировании печатных форм и этикеток в 1С разработчики часто сталкиваются со странным поведением: метод ПроверитьВывод() объекта ТабличныйДокумент возвращает Ложь, утверждаю, что область не влезает на текущий лист. Однако если игнорировать этот результат и принудительно вызвать метод Вывести(), область прекрасно размещается на странице, а количество страниц не увеличивается.
Рассмотрим подробно причины такого несовпадения и разберем практические способы решения этой проблемы.
Проанализируем ситуацию изнутри. Метод ПроверитьВывод() рассчитывает геометрические размеры выводимых областей до физического рендеринга на листе. На его расчеты оказывают прямое влияние несколько факторов:
АвтоМасштаб: Когда включено автомасштабирование (ТабДок.АвтоМасштаб = Истина), платформа сжимает документ при выводе, чтобы он вписался в границы страницы. Однако ПроверитьВывод() оценивает размеры в 100% масштабе без учета будущего сжатия, из-за чего считает, что область превышает границы.АвтоВысотаСтроки = Истина, платформа рассчитывает запас высоты шрифта с запасом по системным метрикам. На этапе предварительной проверки виртуальная высота оказывается больше, чем реальная высота при физической отрисовке.КлючПараметровПечати: Метод ПроверитьВывод() ориентируется на драйвер целевого принтера. Если не задан КлючПараметровПечати или в системе не настроены корректно параметры страницы по умолчанию (особенно при печати на специфических форматах вроде принтеров этикеток), расхождение геометрии становится неизбежным.Посмотрим на пример кода, в котором демонстрируется данная проблема при динамическом формировании текста с переносами:
ТабДок = Новый ТабличныйДокумент;
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ВысотаСтраницы = 49;
ТабДок.ШиринаСтраницы = 124;
Макет = ПолучитьМакет("Макет");
Область1 = Макет.ПолучитьОбласть("Область1");
СтрокаПараметра = "";
Сч = 0;
Пока Сч < 100 Цикл
Сч = Сч + 1;
СтрокаПараметра = СтрокаПараметра + " Текст с переносом";
Область1.Параметры.АдресДоставки = СтрокаПараметра;
// В какой-то момент ПроверитьВывод вернет Ложь,
// несмотря на то, что фактически область еще помещается на лист
Если Не ТабДок.ПроверитьВывод(Область1) Тогда
Прервать;
КонецЕсли;
ТабДок.Вывести(Область1);
КонецЦикла;
ТабДок.Показать();
Разберем по шагам несколько рабочих вариантов решения задачи, в зависимости от контекста вашей разработки.
Чтобы платформа точно рассчитывала границы областей, необходимо привязать печатную форму к сохраненным пользовательским настройкам печати или явно указать принтер.
Установите свойство КлючПараметровПечати перед проверкой вывода:
ТабДок.КлючПараметровПечати = "ПараметрыПечати_ЭтикеткаУпаковки";
Если печать выполняется на специализированный принтер (например, принтер этикеток 49х124 мм), убедитесь, что в свойствах самого принтера в операционной системе выбран правильный размер бумаги по умолчанию. В противном случае платформа 1С будет выполнять расчеты относительно стандартного листа А4.
Если включен АвтоМасштаб или используется сложная АвтоВысотаСтроки, наиболее надежным способом является выведение области во вспомогательный табличный документ и анализ количества страниц.
Рассмотрим пример функции для точной проверки:
Функция БезопаснаяПроверкаВывода(ТабДок, ПроверяемаяОбласть)
// Создаем временный документ и копируем ключевые настройки
ВременныйТабДок = Новый ТабличныйДокумент;
ВременныйТабДок.ОриентацияСтраницы = ТабДок.ОриентацияСтраницы;
ВременныйТабДок.ВысотаСтраницы = ТабДок.ВысотаСтраницы;
ВременныйТабДок.ШиринаСтраницы = ТабДок.ШиринаСтраницы;
ВременныйТабДок.ПолеСверху = ТабДок.ПолеСверху;
ВременныйТабДок.ПолеСнизу = ТабДок.ПолеСнизу;
ВременныйТабДок.ПолеСлева = ТабДок.ПолеСлева;
ВременныйТабДок.ПолеСправа = ТабДок.ПолеСправа;
// Выводим уже сформированную часть и новую область во временный документ
ВременныйТабДок.Вывести(ТабДок);
ВременныйТабДок.Вывести(ПроверяемаяОбласть);
// Если число страниц осталось равным 1 (или не изменилось), вывод возможен
Возврат (ВременныйТабДок.КоличествоСтраниц() <= 1);
КонецФункции
Если проблема вызвана исключительно расчетом геометрии при включенном свойстве АвтоМасштаб, отключите его перед проверкой вывода и включите обратно перед отображением пользователю:
// Временно отключаем автомасштаб для корректного расчета
ТабДок.АвтоМасштаб = Ложь;
Если ТабДок.ПроверитьВывод(ОбластьАдресДоставки) Тогда
ТабДок.Вывести(ОбластьАдресДоставки);
Иначе
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок.Вывести(ОбластьАдресДоставки);
КонецЕсли;
// Включаем обратно перед выводом на экран
ТабДок.АвтоМасштаб = Истина;
Выяснив причину поведения платформы, вы можете выбрать наиболее подходящий вариант: использовать временный ТабличныйДокумент для точной проверки строк с автовысотой или настроить параметры печати и принтера по умолчанию.