Как правильно использовать метод Присоединить для вывода таблиц рядом в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При формировании печатных форм в 1С программисты часто сталкиваются с ситуацией, когда необходимо расположить две разные таблицы или области макета не одну под другой, а бок о бок, реализуя печать в несколько колонок. Казалось бы, метод Присоединить() предназначен именно для этого, но на практике он часто ведет себя непредсказуемо, отправляя область вниз документа. Разберем детально, основываясь на инструкции по редактированию печатных форм (поможет редактор печатных форм в пользовательском режиме), почему так происходит и как добиться желаемого результата.

Почему метод Присоединить выводит данные ниже предыдущих?

Проанализируем основную ошибку. Когда мы вызываем метод ПолучитьОбласть("ИмяОбласти"), и эта область в макете задана только именованием строк, 1С считает, что данная область занимает всю ширину табличного документа (от первой до последней возможной колонки). Следовательно, когда вы пытаетесь применить Присоединить() к такой области, системе просто «некуда» вставлять данные справа, так как все пространство по горизонтали уже зарезервировано первой областью. В результате платформа принимает решение вывести область ниже, как если бы вы использовали метод Вывести(). Для этой задачи есть инструмент анализа ошибок в печатных формах.

Решение №1: Использование пересечения областей (синтаксис «Вертикальная черта»)

Самый правильный и надежный способ заставить 1С выводить области рядом — это четко ограничить их не только по строкам, но и по колонкам. Для этого в макете необходимо создать именованные колонки и при получении области использовать оператор пересечения |.

Рассмотрим по шагам, как это реализовать:

  1. В макете создайте именованную область строк (например, Шапка), что часто требуется при ручной регистрации внешних печатных форм — для этого подойдёт вывод печатей и подписей в формы 1С.
  2. Создайте именованные области колонок (например, ЛеваяЧасть и ПраваяЧасть).
  3. В коде обращайтесь к их пересечению.

Посмотрим на пример кода:


Макет = ЭтотОбъект.ПолучитьМакет("Макет");
ТабДок = Новый ТабличныйДокумент;

// Получаем левую часть через пересечение строки и колонки
ЛеваяОбласть = Макет.ПолучитьОбласть("Шапка|ЛеваяЧасть");
ТабДок.Вывести(ЛеваяОбласть);

// Присоединяем правую часть к той же строке
ПраваяОбласть = Макет.ПолучитьОбласть("Шапка|ПраваяЧасть");
ТабДок.Присоединить(ПраваяОбласть);

ТабДок.Показать("Результат формирования");

В данном случае ЛеваяОбласть имеет фиксированную ширину. Метод Присоединить() видит свободные колонки справа от выведенной области и корректно размещает в них ПраваяОбласть.

Решение №2: Использование метода ВставитьОбласть

Если структура вашего отчета слишком сложна или вы работаете с динамически формируемыми таблицами, где заранее неизвестно количество колонок, метод Присоединить() может быть неудобен. В этом случае проанализируем использование метода ВставитьОбласть(). Этот метод позволяет буквально «скопировать» прямоугольный фрагмент из одного места в другое по заданным координатам. Для решения таких задач подойдёт конструктор произвольных документов и макетов 1С.

Рассмотрим алгоритм работы:

  1. Сформируйте первую таблицу в отдельный временный табличный документ.
  2. Сформируйте вторую таблицу во второй временный табличный документ.
  3. В итоговом документе определите координаты вставки для каждой таблицы.

Пример программной реализации:


ОбщаяТаблица = Новый ТабличныйДокумент;

// Предположим, Таб1 и Таб2 уже заполнены данными
Высота1 = Таб1.ВысотаТаблицы;
Ширина1 = Таб1.ШиринаТаблицы;

// Вставляем первую таблицу в начало (R1C1)
ОбщаяТаблица.ВставитьОбласть(Таб1.Область(1, 1, Высота1, Ширина1), ОбщаяТаблица.Область(1, 1, Высота1, Ширина1));

// Определяем координаты для второй таблицы (смещаемся вправо на ширину первой + 1 колонка)
НачалоКолонки2 = Ширина1 + 1;
КонецКолонки2 = Ширина1 + Таб2.ШиринаТаблицы;
Высота2 = Таб2.ВысотаТаблицы;

ОбщаяТаблица.ВставитьОбласть(Таб2.Область(1, 1, Высота2, Таб2.ШиринаТаблицы), ОбщаяТаблица.Область(1, НачалоКолонки2, Высота2, КонецКолонки2));

Важное замечание: Метод ВставитьОбласть() не всегда идеально переносит форматирование, такое как ширина колонок или высота строк. После вставки может потребоваться дополнительный цикл для программной корректировки ширины колонок в результирующем документе.

Важные нюансы и подводные камни

Выясним причины возможных искажений при выводе:

  1. Ширина колонок: Метод Присоединить() не меняет ширину колонок в итоговом документе. Если в макете-источнике колонка была широкой, а в итоговом документе на этом месте стоит узкая колонка, текст будет обрезан. Всегда проверяйте свойство ШиринаКолонки после вывода.
  2. Порядок вызова: Запомните правило: первая область в строке всегда выводится методом Вывести(), а все последующие, которые должны встать справа от неё — методом Присоединить(). Если вы начнете новую строку методом Присоединить(), результат будет непредсказуемым.
  3. Автовысота строк: Если в правой (присоединенной) области текста больше, чем в левой, и включена автовысота, вся строка растянется. Это может нарушить визуальную симметрию левой таблицы. Рекомендуется использовать фиксированную высоту строк для сложных форм.
  4. Разрывы страниц: При использовании Присоединить() 1С не умеет автоматически переносить «правую» часть таблицы на новый лист по горизонтали, если она не помещается по ширине. Используйте метод ПроверитьВывод() перед печатью, чтобы убедиться, что документ выглядит корректно.

Практический совет по проектированию макетов

Для максимально комфортной работы старайтесь проектировать макет таким образом, чтобы области, которые будут выводиться рядом, имели общую сетку строк. Использование именованных колонок (вертикальных секций) в сочетании с горизонтальными секциями — это «золотой стандарт» разработки печатных форм в 1С. Это избавляет от необходимости вручную вычислять координаты ячеек и позволяет визуально контролировать результат еще на этапе проектирования макета в конфигураторе. Ускоряет редактирование макетов инструмент управления размещением факсимиле в документах.

Разберем еще один пример, когда нужно вывести «Подвал» накладной, состоящий из двух блоков: подписей слева и итоговой печати справа:


// Пример правильной последовательности
ОбластьПодписи = Макет.ПолучитьОбласть("Подвал|ЛеваяСторона");
ТабДок.Вывести(ОбластьПодписи);

ОбластьПечать = Макет.ПолучитьОбласть("Подвал|ПраваяСторона");
// Заполняем параметры области перед присоединением
ОбластьПечать.Параметры.ДатаПечати = ТекущаяДата();
ТабДок.Присоединить(ОбластьПечать);

Такой подход гарантирует, что обе части подвала окажутся на одном уровне по вертикали и будут корректно спозиционированы относительно друг друга.

← На главную