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