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