При формировании печатных форм в 1С программисты часто сталкиваются с ситуацией, когда необходимо расположить две разные таблицы или области макета не одну под другой, а бок о бок, реализуя печать в несколько колонок. Казалось бы, метод Присоединить() предназначен именно для этого, но на практике он часто ведет себя непредсказуемо, отправляя область вниз документа. Разберем детально, основываясь на инструкции по редактированию печатных форм (поможет редактор печатных форм в пользовательском режиме), почему так происходит и как добиться желаемого результата.
Проанализируем основную ошибку. Когда мы вызываем метод ПолучитьОбласть("ИмяОбласти"), и эта область в макете задана только именованием строк, 1С считает, что данная область занимает всю ширину табличного документа (от первой до последней возможной колонки). Следовательно, когда вы пытаетесь применить Присоединить() к такой области, системе просто «некуда» вставлять данные справа, так как все пространство по горизонтали уже зарезервировано первой областью. В результате платформа принимает решение вывести область ниже, как если бы вы использовали метод Вывести(). Для этой задачи есть инструмент анализа ошибок в печатных формах.
Самый правильный и надежный способ заставить 1С выводить области рядом — это четко ограничить их не только по строкам, но и по колонкам. Для этого в макете необходимо создать именованные колонки и при получении области использовать оператор пересечения |.
Рассмотрим по шагам, как это реализовать:
Шапка), что часто требуется при ручной регистрации внешних печатных форм — для этого подойдёт вывод печатей и подписей в формы 1С.ЛеваяЧасть и ПраваяЧасть).Посмотрим на пример кода:
Макет = ЭтотОбъект.ПолучитьМакет("Макет");
ТабДок = Новый ТабличныйДокумент;
// Получаем левую часть через пересечение строки и колонки
ЛеваяОбласть = Макет.ПолучитьОбласть("Шапка|ЛеваяЧасть");
ТабДок.Вывести(ЛеваяОбласть);
// Присоединяем правую часть к той же строке
ПраваяОбласть = Макет.ПолучитьОбласть("Шапка|ПраваяЧасть");
ТабДок.Присоединить(ПраваяОбласть);
ТабДок.Показать("Результат формирования");
В данном случае ЛеваяОбласть имеет фиксированную ширину. Метод Присоединить() видит свободные колонки справа от выведенной области и корректно размещает в них ПраваяОбласть.
Если структура вашего отчета слишком сложна или вы работаете с динамически формируемыми таблицами, где заранее неизвестно количество колонок, метод Присоединить() может быть неудобен. В этом случае проанализируем использование метода ВставитьОбласть(). Этот метод позволяет буквально «скопировать» прямоугольный фрагмент из одного места в другое по заданным координатам. Для решения таких задач подойдёт конструктор произвольных документов и макетов 1С.
Рассмотрим алгоритм работы:
Пример программной реализации:
ОбщаяТаблица = Новый ТабличныйДокумент;
// Предположим, Таб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С не умеет автоматически переносить «правую» часть таблицы на новый лист по горизонтали, если она не помещается по ширине. Используйте метод ПроверитьВывод() перед печатью, чтобы убедиться, что документ выглядит корректно.Для максимально комфортной работы старайтесь проектировать макет таким образом, чтобы области, которые будут выводиться рядом, имели общую сетку строк. Использование именованных колонок (вертикальных секций) в сочетании с горизонтальными секциями — это «золотой стандарт» разработки печатных форм в 1С. Это избавляет от необходимости вручную вычислять координаты ячеек и позволяет визуально контролировать результат еще на этапе проектирования макета в конфигураторе. Ускоряет редактирование макетов инструмент управления размещением факсимиле в документах.
Разберем еще один пример, когда нужно вывести «Подвал» накладной, состоящий из двух блоков: подписей слева и итоговой печати справа:
// Пример правильной последовательности
ОбластьПодписи = Макет.ПолучитьОбласть("Подвал|ЛеваяСторона");
ТабДок.Вывести(ОбластьПодписи);
ОбластьПечать = Макет.ПолучитьОбласть("Подвал|ПраваяСторона");
// Заполняем параметры области перед присоединением
ОбластьПечать.Параметры.ДатаПечати = ТекущаяДата();
ТабДок.Присоединить(ОбластьПечать);
Такой подход гарантирует, что обе части подвала окажутся на одном уровне по вертикали и будут корректно спозиционированы относительно друг друга.