В платформе 1С:Предприятие 7.7 отсутствует прямой аналог метода ПроверитьВывод(), который доступен в 8-й версии платформы. При печати документов с табличной частью переменной высоты (когда включен автоматический перенос текста в ячейках) часто возникает ситуация, при которой строки подвала или блок подписей отрываются от таблицы и переносятся на новый лист, либо на текущем листе остается один лишь подвал без единой строки номенклатуры.
Рассмотрим подробнее основные проверенные способы решения этой задачи, которые позволяют корректно управлять переносом подвала и не допускать разрыва данных.
Разберем самый простой и быстрый метод, не требующий написания сложного кода. Он основан на встроенных возможностях визуального редактора таблиц 1С 7.7.
Для того чтобы подвал не разрывался на части и не сиротел на отдельной странице без строк таблицы, выполним следующие настройки в макете печатной формы:
При таком подходе платформа автоматически проверит, помещается ли последняя строка таблицы вместе со всей секцией подвала на текущей странице. Если блок не помещается, 1С 7.7 перенесет последнюю строку номенклатуры вместе с подвалом на следующий лист.
Если требуется полный программный контроль над формированием печатной формы, применим алгоритм с двумя таблицами. Этот вариант имитирует работу метода ПроверитьВывод() из платформы 1С 8.x.
Проанализируем порядок действий:
КоличествоСтраниц() у вспомогательной таблицы до и после вывода блока.НоваяСтраница().Посмотрим на пример реализации данного алгоритма в модуле:
// Создаем основную и тестовую таблицы
Таб = СоздатьОбъект("Таблица");
ТестТаб = СоздатьОбъект("Таблица");
// Загружаем макет в обе таблицы
Таб.ИсходнаяТаблица("Макет");
ТестТаб.ИсходнаяТаблица("Макет");
// Задаем одинаковые параметры печати
Таб.ПараметрыПечати(1, 100, 10, 10, 10, 10, 0, 0, 1);
ТестТаб.ПараметрыПечати(1, 100, 10, 10, 10, 10, 0, 0, 1);
// Выводим шапку и строки документа
Таб.ВывестиСекцию("Шапка");
ТестТаб.ВывестиСекцию("Шапка");
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Таб.ВывестиСекцию("Строка");
ТестТаб.ВывестиСекцию("Строка");
КонецЦикла;
// Проверяем вывод подвала
СтрДо = ТестТаб.КоличествоСтраниц();
ТестТаб.ВывестиСекцию("Подвал");
СтрПосле = ТестТаб.КоличествоСтраниц();
// Если количество страниц увеличилось, принудительно переносим подвал
Если СтрПосле > СтрДо Тогда
Таб.НоваяСтраница();
КонецЕсли;
Таб.ВывестиСекцию("Подвал");
Таб.Показать();
Важное примечание: метод КоличествоСтраниц() корректно работает в релизах платформы 1С 7.7, начиная с 26-го. Чтобы расчет был точным, параметры печати (поля, ориентация, масштаб) для основной и тестовой таблиц должны быть абсолютно одинаковыми.
В ситуациях, когда высоту строк необходимо измерять вручную без двухпроходного вывода, применяют точный расчет длины символов. Поскольку метод ВысотаСтроки() при свойстве ячейки «Авто» возвращает 0, длину текста в строке рассчитывают с учетом ширины каждого знака выбранного шрифта.
Выясним, как работает функция расчета высоты строки на основе массива ширин символов:
Функция ПолучитьВысотуСтроки(ТекстСтроки, ШиринаСтолбца, СписокШиринШрифта)
Длина = 0;
Пробел = 0;
КоличествоСтрок = 1;
Для Х = 1 По СтрДлина(ТекстСтроки) Цикл
КодСимвола = КодСимв(Сред(ТекстСтроки, Х, 1));
Если КодСимвола = 32 Тогда
Пробел = Длина;
КонецЕсли;
Длина = Длина + СписокШиринШрифта.ПолучитьЗначение(КодСимвола);
Если Длина > ШиринаСтолбца Тогда
Длина = ?(Пробел = 0, 0, Длина - Пробел);
КоличествоСтрок = КоличествоСтрок + 1;
Пробел = 0;
КонецЕсли;
КонецЦикла;
// Возвращаем итоговую высоту в пунктах (базовая высота + добавочная за перенос)
ВысотаБазовая = СписокШиринШрифта.ПолучитьЗначение(256);
ВысотаПриращения = СписокШиринШрифта.ПолучитьЗначение(257);
Возврат ВысотаБазовая + (КоличествоСтрок - 1) * ВысотаПриращения;
КонецФункции
Этот метод требует предварительной подготовки таблицы ширин для конкретного гарнитура и размера шрифта (например, Arial 8pt), но позволяет с высокой точностью определять момент достижения границы печатного листа.