Объединение колонок и полей в 1С: от ячеек макета до консолидации таблиц
Содержание
Колонки в 1С объединяют на трёх уровнях. В печатной форме — ячейки макета: выделить диапазон в Конфигураторе и выполнить команду «Объединить» или в коде вызвать Область.Объединить(). В запросе — склеить поля через + в одно строковое поле. В отчёте на СКД — собрать поля в группу с общим заголовком или в вычисляемое поле.
Четвёртый смысл «объединения» — свести несколько таблиц в одну: ОБЪЕДИНИТЬ ВСЕ в запросе и Свернуть() у таблицы значений. Это консолидация данных, и путать её с объединением ячеек не стоит: первое меняет данные, второе — только внешний вид.
Всё ниже относится к платформе 8.3 и не зависит от конфигурации: одинаково работает в Бухгалтерии, ЗУП, УТ и в самописных базах. Для правки макетов типовых конфигураций нужен Конфигуратор или расширение.
Объединение ячеек в макете и табличном документе
В Конфигураторе, вручную
Макет печатной формы — это табличный документ. Объединение ячеек в нём делается так же, как в редакторе таблиц:
- Откройте макет двойным щелчком в дереве объектов (у документа — ветка «Макеты»).
- Выделите мышью диапазон, например три ячейки шапки подряд.
- Выполните команду «Объединить». Она есть в главном меню
Таблицаи на панели табличного редактора. - Задайте выравнивание: в палитре свойств ячейки — «Горизонтальное положение» = «Центр».
Объединённая ячейка получает адрес левой верхней ячейки. Если в макете есть параметр (например, [Номенклатура]), он должен стоять именно в ней. Текст из остальных ячеек диапазона при объединении теряется.
Правка макета в типовой конфигурации снимает её с полной поддержки. Безопаснее перенести изменение в расширение: заимствуйте макет, правьте копию в расширении — обновления конфигурации её не затронут.
В коде
Когда число колонок заранее неизвестно, объединять приходится программно. У области ячеек табличного документа есть методы Объединить() и Разъединить():
ТабДок = Новый ТабличныйДокумент;
// Шапка над колонками 2-4 первой строки
Область = ТабДок.Область(1, 2, 1, 4);
Область.Объединить();
Область.Текст = "Остатки на складах";
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
// То же через адрес в нотации R1C1
Область = ТабДок.Область("R2C1:R3C1");
Область.Объединить();
Область.Текст = "Номенклатура";
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
Порядок параметров у Область(Верх, Лево, Низ, Право): первая строка, первая колонка, последняя строка, последняя колонка. Нумерация с единицы.
Типичная задача — шапка, ширина которой зависит от данных. Например, отчёт по складам, где складов то три, то семь:
ЧислоСкладов = Склады.Количество();
ПерваяКолонка = 2;
ПоследняяКолонка = ПерваяКолонка + ЧислоСкладов - 1;
Шапка = ТабДок.Область(1, ПерваяКолонка, 1, ПоследняяКолонка);
Шапка.Объединить();
Шапка.Текст = "Склады (" + Формат(ЧислоСкладов, "ЧГ=0") + ")";
Шапка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Для Индекс = 0 По ЧислоСкладов - 1 Цикл
ТабДок.Область(2, ПерваяКолонка + Индекс).Текст = Строка(Склады[Индекс]);
КонецЦикла;
При семи складах шапка займёт колонки со 2-й по 8-ю: 2 + 7 − 1 = 8. Число в строку здесь переводится через Формат(..., "ЧГ=0"), иначе при больших значениях появится разделитель групп разрядов.
💡 Объединяйте область после того, как вывели в неё строки макета через ТабДок.Вывести(). Если объединить пустые ячейки заранее, а потом вывести область поверх, объединение может сбиться.
Склейка полей в одну колонку в запросе
Если нужно не объединить ячейки, а показать два значения в одной колонке — «Артикул Наименование», «Фамилия И. О.», «Договор от даты» — это делается в запросе. Строки в языке запросов складываются оператором +:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Артикул + " " + Номенклатура.Наименование КАК АртикулИНаименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
Три правила, без которых запрос упадёт или вернёт пустоту.
1. NULL обнуляет всю строку
Строка плюс NULL даёт NULL. Это случается при левом соединении, когда справа нет записи. Оборачивайте такие поля в ЕСТЬNULL:
ЕСТЬNULL(Контрагенты.ИНН, "") + " " + ЕСТЬNULL(Контрагенты.Наименование, "") КАК Контрагент
2. Строки неограниченной длины надо привести
Реквизиты вида «Комментарий» обычно имеют неограниченную длину. Склеивать и сравнивать их в запросе нельзя, пока не приведёте к фиксированной длине:
ВЫРАЗИТЬ(Документ.Комментарий КАК СТРОКА(200)) + " / " + Документ.Номер КАК Описание
Текст длиннее 200 символов обрежется — выберите длину с запасом.
3. Числа и даты в запросе в строку не переводятся
Сложить номер с датой документа (Номер + " от " + Дата) язык запросов не даст: дата и число в строку через ВЫРАЗИТЬ не приводятся. Здесь два выхода:
- 📌 вывести поля отдельно, а склеить после выполнения запроса, в коде:
Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy"); - 📌 в отчёте на СКД — сделать вычисляемое поле с функцией
Формат()(см. следующий раздел).
Для ссылок есть функция ПРЕДСТАВЛЕНИЕ(Поле). Она возвращает строку для вывода, но опираться на неё в условиях и группировках не стоит: она медленнее обращения к реквизиту.
Группы полей и вычисляемые поля в СКД
Система компоновки данных умеет «объединять колонки» тремя способами, и выбирать стоит по задаче.
Общий заголовок над несколькими колонками
Нужна шапка «Количество» над колонками «Приход», «Расход», «Остаток» — это группа выбранных полей:
- В схеме компоновки откройте вкладку «Настройки», затем внизу — вкладку «Выбранные поля».
- Через контекстное меню добавьте новую группу.
- Перетащите в неё нужные поля.
- У группы задайте заголовок и расположение «Горизонтально».
В результате над колонками появится объединённая ячейка с заголовком группы. Расположение «Вертикально» ставит поля группы друг под другом в одной колонке — удобно, когда в узкую колонку надо уместить «Код» и «Наименование».
Пользователь может сделать то же самое без Конфигуратора: в отчёте открыть настройки в расширенном режиме и сгруппировать поля на закладке выбранных полей. Так меняются только его пользовательские настройки, схема отчёта остаётся прежней.
Одно поле из нескольких значений
Вычисляемое поле склеивает значения разных типов, чего не умеет запрос. На вкладке «Вычисляемые поля» добавьте поле, например ДокументПредставление, с выражением:
"№ " + Регистратор.Номер + " от " + Формат(Регистратор.Дата, "ДФ=dd.MM.yyyy")
Язык выражений СКД поддерживает Формат(), поэтому дата и число здесь превращаются в строку без проблем. Затем добавьте вычисляемое поле в выбранные поля вместо исходных.
Группировки в одной колонке
Когда у отчёта несколько группировок (Контрагент → Договор → Документ), СКД по умолчанию выводит их иерархией в одной колонке. Управляет этим параметр «Расположение полей группировок» на вкладке «Другие настройки»:
| Значение | Что получится |
|---|---|
| Вместе | Все уровни группировок в одной колонке с отступами |
| Отдельно | Каждая группировка в своей колонке |
| Отдельно и только в итогах | Отдельные колонки, значения только в строках итогов |
| Авто | Расположение выбирает система |
Для выгрузки в Excel и дальнейшей фильтрации удобнее «Отдельно»: каждый признак окажется в своей колонке.
Объединение таблиц и консолидация данных
ОБЪЕДИНИТЬ ВСЕ в запросе
Чтобы получить одну таблицу из нескольких источников — например, приходы и расходы денег из разных документов, — используйте объединение запросов:
ВЫБРАТЬ
Поступление.Контрагент КАК Контрагент,
Поступление.СуммаДокумента КАК Приход,
0 КАК Расход
ИЗ
Документ.ПоступлениеНаРасчетныйСчет КАК Поступление
ГДЕ
Поступление.Проведен
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Списание.Контрагент,
0,
Списание.СуммаДокумента
ИЗ
Документ.СписаниеСРасчетногоСчета КАК Списание
ГДЕ
Списание.Проведен
Правила объединения:
- 🔢 число полей во всех частях одинаковое, сопоставляются они по порядку, а не по имени;
- 🏷️ имена (псевдонимы) задаёт первая часть, в остальных их можно не писать;
- 🧩 недостающее поле заменяется константой:
0,"",NULLилиЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка); - ⚖️
ОБЪЕДИНИТЬбезВСЕубирает полностью одинаковые строки. Это лишняя работа для СУБД и риск потерять две одинаковые оплаты. Для сумм почти всегда нужноОБЪЕДИНИТЬ ВСЕ.
Чтобы свести результат в одну строку на контрагента, поместите объединение во временную таблицу и сгруппируйте:
ВЫБРАТЬ
Движения.Контрагент КАК Контрагент,
СУММА(Движения.Приход) КАК Приход,
СУММА(Движения.Расход) КАК Расход
ИЗ
ВТ_Движения КАК Движения
СГРУППИРОВАТЬ ПО
Движения.Контрагент
Где ВТ_Движения — результат первого запроса с ПОМЕСТИТЬ ВТ_Движения после списка полей первой части.
Свёртка таблицы значений
Если данные уже в памяти, консолидация делается одной строкой:
Таблица.Свернуть("Контрагент", "Приход, Расход");
Первый параметр — колонки группировки, второй — колонки, которые суммируются. Колонки, не попавшие ни в один список, удаляются. Суммируемые колонки должны быть числовыми, иначе свёртка завершится ошибкой.
Две таблицы значений с одинаковыми колонками проще всего объединить, загрузив одну в другую в цикле или передав обе в запрос параметрами: ВЫБРАТЬ ... ПОМЕСТИТЬ ВТ1 ИЗ &Таблица1 КАК Т. Во втором случае у колонок таблиц-параметров должны быть заданы типы (через ОписаниеТипов при создании колонки), иначе запрос не выполнится.
Значения колонки в одну строку
Частая просьба — вывести все товары документа через запятую в одной ячейке. Для этого есть СтрСоединить():
Наименования = Новый Массив;
Для Каждого СтрокаТЧ Из Товары Цикл
Наименования.Добавить(Строка(СтрокаТЧ.Номенклатура));
КонецЦикла;
Итог = СтрСоединить(Наименования, ", ");
СтрСоединить принимает массив строк. Массив ссылок, полученный через ВыгрузитьКолонку(), передать напрямую нельзя — сначала переведите каждое значение в строку, как в примере.
Отличие от «1С:Консолидации»
Иногда под консолидацией понимают сведение отчётности группы компаний. Это задача отдельных прикладных решений (например, «1С:Консолидация», «1С:ERP Управление холдингом»), а не объединения колонок в отчёте. Если нужно свести данные двух-трёх юрлиц в одной базе, хватит отчёта на СКД без отбора по организации или с группировкой по ней.
Какой способ выбрать: сравнение
| Способ | Где работает | Меняет данные | Когда брать |
|---|---|---|---|
| Объединение ячеек в макете | Печатные формы | Нет | Постоянная шапка документа |
Область.Объединить() | Любой табличный документ | Нет | Шапка с переменным числом колонок |
+ в запросе | Запрос | Да, новое поле | Склейка строковых реквизитов |
| Вычисляемое поле СКД | Отчёт на СКД | Да, новое поле | Склейка с датами и числами |
| Группа выбранных полей | Отчёт на СКД | Нет | Общий заголовок над колонками |
ОБЪЕДИНИТЬ ВСЕ | Запрос | Да, новые строки | Данные из разных таблиц в одну |
Свернуть() | Таблица значений | Да, итоги | Свести строки по ключу в памяти |
Правило простое: если задача про вид — объединяйте ячейки или группируйте поля в настройках. Если про данные — делайте это в запросе или вычисляемом поле, чтобы итоги и отборы работали с уже готовым полем.
Ошибки, на которых спотыкаются чаще всего
- 🧷 Объединённые ячейки ломают выгрузку в Excel. Фильтр и сортировка в Excel плохо работают с объединёнными шапками. Если отчёт выгружают для анализа, вместо объединения в шапке используйте расположение группировок «Отдельно».
- 🔁 Расшифровка перестаёт работать. Если склеить поля в запросе, двойной щелчок по ячейке открывает строку, а не документ. Выводите рядом исходное ссылочное поле или используйте вычисляемое поле в СКД, где расшифровка идёт по исходным полям.
- 📏 Сдвиг колонок после
ОБЪЕДИНИТЬ. Поле во второй части запроса стоит не на своём месте — суммы приходов попадают в расходы. Порядок полей во всех частях держите одинаковым и подписывайте каждую константу комментарием. - 🕳️ Пустые строки после склейки. Почти всегда это
NULLиз левого соединения. ПомогаетЕСТЬNULL. - 🔤 «Несовместимые типы» при склейке. В выражение попало число, дата или строка неограниченной длины. Числа и даты — в вычисляемое поле с
Формат(), длинные строки — черезВЫРАЗИТЬ ... КАК СТРОКА(N).
Можно ли объединить ячейки в готовом отчёте без Конфигуратора?
Как разъединить ячейки в макете?
Разъединить() у области.