В процессе разработки печатных форм в системе 1С:Предприятие 8 часто возникают требования, которые выходят за рамки стандартных настроек табличного документа. Для этой задачи есть конструктор макетов и запросов печатных форм. Одной из таких задач является вывод нижнего или верхнего колонтитула на абсолютно всех страницах документа, при этом нумерация страниц должна появиться только на второй странице, а сама цифра номера должна начинаться с единицы.
Стандартный механизм настройки ТабличныйДокумент через свойства ВыводитьС и НачальныйНомерСтраницы не позволяет гибко управлять составом колонтитула для конкретных страниц. Для решения проблемы подойдёт печать сложных форм по шаблонам Word. Если мы установим параметр "Выводить с 2", то на первой странице колонтитул пропадет полностью — и текст, и номер. Если мы оставим "Выводить с 1", то номер отобразится и на первом листе, что часто противоречит корпоративным стандартам или ГОСТам. Рассмотрим подробнее, как обойти эти ограничения и реализовать требуемую логику программно.
Этот способ является наиболее элегантным и "правильным" с точки зрения архитектуры платформы. Разберем ситуацию: объект ТабличныйДокумент хранит настройки печати и колонтитулов для всего документа целиком. Чтобы обойти это ограничение, мы разделим наш отчет на две части. Для проектирования нестандартных макетов подойдёт конструктор произвольных документов и печатных форм.
Проанализируем алгоритм реализации:
[&НомерСтраницы].ПакетОтображаемыхДокументов.Посмотрим на пример кода, реализующего этот подход:
// Создаем основной контейнер
Пакет = Новый ПакетОтображаемыхДокументов;
// Формируем первую страницу
ТабДок1 = Новый ТабличныйДокумент;
// ... Код заполнения первой страницы (Вывести области) ...
ТабДок1.НижнийКолонтитул.Выводить = Истина;
ТабДок1.НижнийКолонтитул.ТекстСлева = "ООО 'Наша Компания' - Информационный лист";
ТабДок1.НижнийКолонтитул.ТекстСправа = ""; // Здесь пусто, номера нет
// Формируем остальные страницы
ТабДок2 = Новый ТабличныйДокумент;
// ... Код заполнения остальных страниц ...
ТабДок2.НижнийКолонтитул.Выводить = Истина;
ТабДок2.НижнийКолонтитул.ТекстСлева = "ООО 'Наша Компания' - Информационный лист";
ТабДок2.НижнийКолонтитул.ТекстСправа = "Страница [&НомерСтраницы]";
ТабДок2.НачальныйНомерСтраницы = 1;
// Добавляем документы в пакет
Пакет.Содержимое.Добавить(ТабДок1);
Пакет.Содержимое.Добавить(ТабДок2);
// Показываем пользователю единое окно предпросмотра
Пакет.Показать("Печать документа с кастомной нумерацией");
Преимущество этого метода в том, что при печати принтер воспримет это как одно задание, но настройки колонтитулов сохранятся индивидуально для каждой части.
Выясним причину, почему разработчики часто избегают стандартных колонтитулов. Главная причина — невозможность вставить в стандартный колонтитул сложные данные или менять его формат на лету. В этом случае мы можем полностью отказаться от системного механизма и имитировать колонтитулы обычными областями макета. Для автоматизации вывода визуальных элементов есть обработка вывода факсимиле и логотипов в 1С.
Разберем по шагам, как это работает:
ОбластьКолонтитулБезНомера и ОбластьКолонтитулСНомером.ПроверитьВывод().Ложь, значит, следующая область не помещается на текущую страницу.Пример реализации в цикле вывода данных:
НомерТекущейСтраницы = 0;
Для Каждого СтрокаДанных Из ТЗДанные Цикл
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Подготавливаем массив областей для проверки (строка + будущий колонтитул)
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСтрока);
МассивОбластей.Добавить(ОбластьКолонтитула);
Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
// Страница закончилась. Выводим колонтитул
Если НомерТекущейСтраницы = 0 Тогда
ОбластьКол = Макет.ПолучитьОбласть("КолонтитулБезНомера");
Иначе
ОбластьКол = Макет.ПолучитьОбласть("КолонтитулСНомером");
ОбластьКол.Параметры.Номер = НомерТекущейСтраницы;
КонецЕсли;
ТабДок.Вывести(ОбластьКол);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
НомерТекущейСтраницы = НомерТекущейСтраницы + 1;
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Важный нюанс: при таком подходе необходимо тщательно выверять высоту областей макета, чтобы "ручной" колонтитул всегда находился в самом низу листа. Часто для этого используют пустые строки-распорки.
Проанализируем ситуацию, когда форму нельзя сильно переделывать, а код вывода слишком сложен для внедрения ПроверитьВывод. Для технической правки ячеек существует обработка редактирования готовых табличных документов. В 1С существует возможность программно размещать графические объекты поверх ячеек табличного документа.
Мы можем оставить стандартный колонтитул на всех страницах (включая первую) и с текстом, и с номером. Но на первой странице мы программно "нарисуем" белый прямоугольник без границ ровно в том месте, где выводится номер страницы.
Рассмотрим, как это реализовать:
Рисунок типа ТипРисункаТабличногоДокумента.Прямоугольник.WebЦвета.Белый и цвет линии, совпадающий с фоном.Этот метод считается "костылем", но в критических ситуациях, когда время на разработку ограничено, он позволяет добиться нужного визуального результата без переписывания логики формирования документа. Однако помните, что при сохранении в некоторые форматы (например, HTML или при специфическом рендеринге в PDF) слои могут сместиться.
Выясним, какой из методов лучше выбрать. Если ваша печатная форма в дальнейшем будет сохраняться в формат PDF, то наиболее надежным будет Метод 2 (ручной вывод). Это связано с тем, что штатный механизм формирования PDF в 1С при объединении нескольких табличных документов (через Вывести()) часто применяет настройки первого документа ко всем последующим, игнорируя индивидуальные параметры колонтитулов.
Использование ПакетОтображаемыхДокументов идеально подходит для непосредственной печати на принтер или для экранного просмотра пользователем, так как он сохраняет целостность настроек каждого листа.
Подводя итог, можно сказать: несмотря на отсутствие прямой галочки "Скрыть номер на первой странице, но оставить текст", платформа 1С предоставляет достаточно инструментов для реализации этой задачи. Выбор конкретного метода зависит от сложности вашей печатной формы и того, как именно пользователь будет с ней работать (печать, экспорт или просмотр).