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