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