К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в макете 1С присоединить колонки

Как в макете 1С присоединить колонки: Присоединить() для табличного документа, объединение ячеек, примеры кода, типичные ошибки и проверка результата.

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

Выбор способа зависит от структуры макета. Если шапка отчёта должна содержать ячейку, растянутую на несколько колонок («Номенклатура» над колонками «Код» и «Наименование»), достаточно объединения ячеек в самом макете или в коде. Если количество колонок заранее неизвестно — например, колонки формируются по периодам или по видам цен из запроса — используют циклическое присоединение областей справа.

Ниже разобраны оба сценария с примерами кода, условиями выбора, способами проверки результата и типичными ошибками. Материал ориентирован на встроенный язык 1С:Предприятие 8 и объект «ТабличныйДокумент».

Два смысла «присоединить колонки» в 1С

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

Вторая задача — объединение ячеек по горизонтали внутри одной строки. Например, заголовок «Показатели» должен занимать три колонки сразу. Для этого выделяют прямоугольную область ячеек и вызывают Объединить(), либо выполняют то же действие интерактивно в редакторе макета через контекстное меню «Объединить».

Подготовка макета: области для колонок

Создайте макет типа «Табличный документ» в нужном объекте конфигурации (обработка, отчёт, документ). Для присоединения колонок в макете должны быть выделены именованные области, содержащие только нужные колонки. Чтобы создать область, выделите диапазон ячеек и задайте имя через меню «Таблица — Имена — Назначить имя» или через свойство «Имя» в палитре свойств.

Типичный набор областей для отчёта с динамическими колонками: «ШапкаЛевая» (фиксированные колонки: номер, номенклатура), «ШапкаКолонка» (одна повторяющаяся колонка заголовка), «СтрокаЛевая» и «СтрокаКолонка» для данных. Область для присоединения обычно содержит одну колонку, которая будет повторяться в цикле.

Следите, чтобы высота присоединяемой области совпадала с высотой строк, к которым она присоединяется. Если область «ШапкаКолонка» занимает две строки, а левая часть шапки — одну, при выводе получится смещение и «ступеньки» в таблице.

Присоединение колонок методом Присоединить()

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

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

Макет = ПолучитьМакет("МакетОтчета");

// Левая часть шапки

ОбластьЛевая = Макет.ПолучитьОбласть("ШапкаЛевая");

ТабДок.Вывести(ОбластьЛевая);

// Присоединяем колонки по периодам

ОбластьКолонка = Макет.ПолучитьОбласть("ШапкаКолонка");

Для Каждого СтрокаПериода Из ТаблицаПериодов Цикл

ОбластьКолонка.Параметры.Период = СтрокаПериода.Период;

ТабДок.Присоединить(ОбластьКолонка);

КонецЦикла;

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

Для строк данных логика та же: выводите «СтрокаЛевая» методом Вывести(), затем в цикле по колонкам присоединяете «СтрокаКолонка» с заполненными параметрами. Если данных для ячейки нет, присвойте параметру пустую строку или ноль — незаполненный параметр выведется как «<Параметр>» и испортит печатную форму.

Порядок действий
  1. 1
    Создайте макет табличного документа и назовите области для левой части и повторяемой колонки
  2. 2
    В коде получите макет и создайте объект ТабличныйДокумент
  3. 3
    Выведите левую фиксированную часть методом Вывести()
  4. 4
    Получите область колонки и в цикле заполняйте параметры, присоединяя её методом Присоединить()
  5. 5
    Повторите то же для строк данных
  6. 6
    Выведите итоговую строку или колонтитулы и проверьте результат на печати

Объединение ячеек по горизонтали

Если задача — растянуть одну ячейку на несколько колонок, применяется метод Объединить(). В коде выделяется прямоугольная область методом Область() с указанием диапазона строк и колонок, после чего вызывается объединение:

// Объединить ячейки строки 2 с колонки 3 по колонку 5

ОбластьЯчеек = ТабДок.Область(2, 3, 2, 5);

ОбластьЯчеек.Объединить();

ОбластьЯчеек.Текст = "Итоги по группе";

ОбластьЯчеек.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;

Тот же результат можно получить без кода: в редакторе макета выделите нужные ячейки, откройте контекстное меню и выберите «Объединить». Это удобно для статичных шапок, где структура известна заранее. Программное объединение нужно, когда диапазон объединяемых колонок вычисляется в ходе выполнения — например, заголовок группы должен охватывать столько колонок, сколько периодов попало в отчёт.

После объединения текст и параметры задаются у всей объединённой области целиком. Рамки и цвет фона также назначаются объединённой области, а не отдельным исходным ячейкам.

Выбор подхода под конкретную задачу

Для статичной печатной формы, где состав колонок фиксирован, проще всего нарисовать всё в макете и объединить ячейки в редакторе — код будет минимальным, а правки дизайна не потребуют переписывания модуля. Программное объединение оправдано, когда число объединяемых колонок зависит от данных.

Для отчётов с переменным числом колонок метод Присоединить() — стандартное решение. Однако если структура отчёта сложная (группировки, итоги по строкам и колонкам, отборы), рассмотрите систему компоновки данных: СКД умеет выводить группировки по колонкам без ручного управления областями, и это надёжнее при изменении требований.

Сравнение вариантов

Объединить() в макете

Подходит для статичных шапок и подписей. Ограничение: структура колонок фиксирована, изменения только через редактирование макета.

Вывести() + Присоединить()

Подходит для динамического числа колонок по данным запроса. Ограничение: нужно вручную следить за высотой областей и порядком вывода.

СКД с группировкой по колонкам

Подходит для аналитических отчётов с отборами и итогами. Ограничение: менее гибкая настройка внешнего вида отдельных ячеек.

Проверка результата и типичные ошибки

После формирования откройте табличный документ на предпросмотре и проверьте: колонки идут в ожидаемом порядке, заголовки соответствуют данным под ними, нет сдвинутых строк и ячеек с текстом «<Параметр>». Дополнительно проверьте разбиение на страницы — широкая таблица с присоединёнными колонками может не помещаться на лист, тогда настройте масштаб, ориентацию страницы или свойство «АвтоМасштаб».

Частая ошибка — вызов Присоединить() до первого Вывести(): присоединять не к чему, и результат будет непредсказуемым. Вторая типичная проблема — разная высота областей левой части и присоединяемой колонки, из-за чего строки «разъезжаются». Третья — повторное использование области без сброса параметров: значение из предыдущей итерации попадает в следующую колонку.

Типичные ошибки
01
Присоединить() вызван до Вывести() — колонка уходит не туда или документ формируется с пустой левой частью
02
Разная высота областей — строки таблицы смещаются, появляются ступеньки и разрывы рамок
03
Не очищены параметры области между итерациями — в следующей колонке дублируются данные предыдущей
04
Объединение ячеек после заполнения текста в каждой — часть текста теряется, сначала объединяйте, потом записывайте значение
05
Несовпадение имён областей в коде и макете — возникает ошибка получения области
Контрольные точки

Как проверить результат

Порядок колонок
Норма

Колонки идут в порядке обхода данных, заголовки совпадают со значениями под ними

Тревожный признак

Заголовок одного периода стоит над данными другого

Высота строк
Норма

Все строки ровные, рамки ячеек совпадают по горизонтали

Тревожный признак

Ступеньки, разорванные рамки, сдвиг содержимого

Параметры
Норма

Все ячейки заполнены данными или пусты по замыслу

Тревожный признак

Виден текст вида <Параметр> или данные дублируются из соседней колонки

Печать
Норма

Таблица помещается на лист, перенос страниц корректный

Тревожный признак

Колонки обрезаны справа или уходят на отдельные страницы

Ограничения и риски

Метод Присоединить() работает только с объектом «ТабличныйДокумент» в коде; в схеме компоновки данных и в макетах СКД присоединение областей выполняется иначе — через настройки группировок. Не пытайтесь смешивать ручное формирование табличного документа с выводом результата СКД в один документ без чёткого разделения областей.

При большом числе присоединяемых колонок (сотни и более) формирование документа может занять заметное время, а открытие результата — потреблять много памяти. Если колонок потенциально очень много, ограничьте их число настройками отчёта или перенесите данные в строки.

Удобный приём: храните в макете отдельную область «ИтогКолонка» для итоговой колонки справа и присоединяйте её после цикла. Так итоги визуально отделяются от данных, а код остаётся линейным и простым для сопровождения.
ПЗ
Практическое замечание

FAQ

Чем Присоединить() отличается от Вывести()?

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

Можно ли присоединить сразу несколько колонок одной областью?

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

Как объединить ячейки после того, как колонки уже присоединены?

Получите прямоугольную область методом ТабДок.Область(строка1, колонка1, строка2, колонка2), где координаты колонок соответствуют присоединённой части, и вызовите Объединить(). Номера колонок придётся вычислять: ширина левой части плюс число присоединённых колонок.

Почему вместо значения в ячейке выводится имя параметра в угловых скобках?

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

Как сделать динамические колонки без ручного Присоединить()?

Используйте систему компоновки данных: добавьте в настройки отчёта группировку по нужному полю в раздел колонок таблицы. СКД сама сформирует колонки по всем значениям из данных, посчитает итоги и применит отборы без программирования областей.

Работает ли Присоединить() в мобильной платформе и тонком клиенте?

Метод относится к объекту ТабличныйДокумент и выполняется там, где доступен этот объект — обычно формирование делают на сервере, а результат показывают в клиенте. Клиентская платформа при этом не влияет на логику присоединения областей.

Итог

Что важно запомнить

Колонки в макете 1С присоединяют методом ТабличныйДокумент.Присоединить() после первоначального Вывести() левой части, а растягивание ячейки на несколько колонок делают методом Объединить() в коде или в редакторе макета. Следите за совпадением высот областей и очищайте параметры между итерациями — это устраняет большинство дефектов вывода.