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