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