Разделение ячеек в табличном документе 1С 8.3

· 9 мин

Содержание

Разделить ячейку в 1С напрямую нельзя — и это первое, что стоит принять. Табличный документ в 1С 8.3 построен как жёсткая сетка строк и колонок, где одна ячейка уже является минимальным элементом. То, что в Excel или Word называют «разбить ячейку», в 1С делают ровно наоборот: через объединение и его отмену. Если вам нужно «разрезать» одну широкую ячейку надвое, почти всегда это значит, что раньше несколько соседних ячеек объединили в одну, и теперь объединение надо снять.

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

Почему ячейку нельзя «разрезать», как в Excel

В табличном документе каждая ячейка адресуется номером строки и колонки: R1C1 — первая строка, первая колонка, R3C5 — третья строка, пятая колонка. Сетка задаётся заранее, и платформа не умеет делить одну клетку на две меньшие «на лету».

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

Отсюда простое правило:

  • «Разделить ячейку» в 1С = снять объединение с группы ячеек.
  • «Объединить ячейки » = склеить несколько соседних клеток в одну видимую область.

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

== Данные при отмене объединения не исчезают, но «сползают»: текст остаётся в левой верхней ячейке бывшей области, остальные становятся пустыми. ==

Отмена объединения ячеек в редакторе Конфигуратора

Самый частый сценарий — правка макета печатной формы или готового табличного документа в Конфигураторе. Порядок действий:

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

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

Рядом живут и соседние операции с сеткой. В меню Таблица есть команды вставки и удаления строк и колонок: с их помощью вы либо добавляете место под новые клетки, либо убираете лишние. Удаление строки или колонки стирает и всё их содержимое по всему листу, а не только в выбранной ячейке — это ещё одно следствие того, что сетка общая.

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

Ширина колонок — общая на весь лист

Здесь кроется главная причина, по которой «разрезать» одну ячейку в табличном документе не получается так, как хочется. Ширина колонки распространяется на весь столбец — на все строки листа сразу. Нельзя сделать так, чтобы в одной строке колонка была узкой, а в другой широкой.

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

  1. Добавляют в сетку дополнительную колонку (меню Таблица, команда вставки колонки) — она появляется сразу во всех строках.
  2. В той строке, которую нужно «разделить», оставляют клетки как есть — получаются две отдельные ячейки.
  3. Во всех остальных строках соседние клетки, попавшие под новую границу, объединяют обратно, чтобы внешне там ничего не изменилось.

То есть разделение одной строки — это объединение всех остальных. Звучит непривычно, но для макетов печатных форм это стандартный приём: сетка строится от самой дробной строки, а крупные ячейки получаются слиянием.

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

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

Разделение ячеек в отчётах на СКД

В отчётах на системе компоновки данных вы не рисуете каждую ячейку руками — структуру итоговой таблицы строит платформа по настройкам. Поэтому «разделение» ячейки здесь означает управление тем, сколько колонок и подколонок окажется в результате.

Что регулирует дробление колонок в СКД:

  • Группировки по колонкам. В настройках отчёта (Настройки → Структура) добавьте группировку в ветку колонок — каждое значение поля развернётся в отдельный столбец. Вложенные группировки по колонкам дают «подколонки» — визуально это и есть деление шапки на части.
  • Расположение ресурсов. Параметр расположения (вместе/отдельно) определяет, встанут ли несколько показателей в одну ячейку группировки или разъедутся по соседним столбцам.
  • Собственный макет. На вкладке макетов оформления можно задать свой табличный документ для области группировки и внутри него объединить или разделить клетки вручную — так же, как в обычном макете.

Короткий пример. Нужна шапка, где верхний уровень — год, а под ним столбцы по кварталам. В настройках отчёта откройте ветку колонок структуры и добавьте туда группировку по полю года, а внутри неё — вложенную группировку по кварталу. В результат попадёт двухуровневая шапка: широкая ячейка года сверху и дробные ячейки кварталов под ней. Числа кварталов встанут ровно по тем значениям, что есть в данных за выбранный период.

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

Программное разбиение: объект ТабличныйДокумент

Когда табличный документ собирается кодом, вы управляете сеткой через объект ТабличныйДокумент и его области. Область задаётся методом Область:

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

// Область по номерам: строка 1, колонки с 1 по 3
Область = ТабДок.Область(1, 1, 1, 3);

// или строкой в формате R1C1
ОбластьПоИмени = ТабДок.Область("R1C1:R1C3");

Объединение выполняет метод Объединить:

ТабДок.Объединить(ТабДок.Область(1, 1, 1, 3));
ТабДок.Область(1, 1, 1, 1).Текст = "Шапка отчёта";

Отдельного метода «разъединить» в объектной модели нет. На уровне кода это и не нужно: вы просто не вызываете Объединить для тех клеток, которые должны остаться раздельными. Если документ собирается из макета, где объединение уже прописано, перенесите слияние в сам макет и выводите области через Вывести, а раздельные ячейки заполняйте по отдельности.

Обращение к конкретной клетке для записи значения:

ТабДок.Область(НомерСтроки, НомерКолонки).Текст = "Значение";

Как разложить содержимое одной ячейки по нескольким

Второе значение запроса «разделить ячейку» — не про сетку, а про данные: в одной ячейке лежит строка вида Иванов Иван Иванович, а нужно разнести её по трём столбцам. Это задача разбора строки, и решается она функцией СтрРазделить.

СтрРазделить(Строка, Разделитель, ВключатьПустые) возвращает массив подстрок. Полный пример, который раскладывает ФИО по колонкам:

ФИО = "Иванов Иван Иванович";

// третий параметр Ложь — пустые элементы отбрасываем
ЧастиФИО = СтрРазделить(ФИО, " ", Ложь);

НомерСтроки = 1;
Для НомерКолонки = 1 По ЧастиФИО.Количество() Цикл
    Ячейка = ТабДок.Область(НомерСтроки, НомерКолонки);
    // в массиве индекс с нуля, поэтому НомерКолонки - 1
    Ячейка.Текст = ЧастиФИО[НомерКолонки - 1];
КонецЦикла;

Индекс массива начинается с нуля, а колонки табличного документа — с единицы, поэтому в примере обращение идёт по НомерКолонки - 1. Разделителем может быть любой символ: пробел, точка с запятой, табуляция. Если в исходных данных встречаются двойные разделители (два пробела подряд), параметр ВключатьПустые = Ложь убирает лишние пустые элементы.

Обратная операция — собрать несколько ячеек в одну строку — делается функцией СтрСоединить(Массив, Разделитель).

Когда разделитель непостоянный (где-то запятая, где-то точка с запятой) или данные грязные, разбор удобнее вести не по одному символу, а через регулярные выражения или предварительную замену всех возможных разделителей на один. Но для типовых задач — ФИО, адрес по частям, артикул с кодом — хватает связки СтрРазделить + цикл. Главное помнить: функция возвращает именно массив строк, и если исходное значение было числом или ссылкой, его сначала приводят к строке.

Динамическое изменение структуры отчёта

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

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

Для Каждого Месяц Из СписокМесяцев Цикл
    ОбластьКолонка.Параметры.Заголовок = Месяц.Представление;
    ТабДок.Присоединить(ОбластьКолонка);
КонецЦикла;

Разница между двумя методами вывода:

МетодКуда добавляет областьКогда применять
Вывестивниз, новой строкойрост таблицы по строкам
Присоединитьвправо, в ту же строкурост по колонкам (подневные, помесячные)

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

Типичные ошибки при работе с ячейками

Разберём сбои, которые встречаются чаще всего, и как их читать:

Диагностика: выберите симптом

Частые вопросы

Можно ли разделить одну ячейку на две, не трогая остальные строки?
Нет. Ширина колонки общая для всего столбца. Чтобы в одной строке появились две клетки вместо одной, добавьте колонку во весь лист и объедините лишние клетки во всех остальных строках.
Куда девается текст при отмене объединения?
Остаётся в левой верхней ячейке бывшей объединённой области. Соседние клетки становятся пустыми — текст по ним автоматически не распределяется.
Как разнести ФИО или адрес из одной ячейки по нескольким колонкам?
Функцией СтрРазделить разбейте строку по разделителю (пробел, запятая) в массив, затем запишите элементы массива в отдельные ячейки циклом.
Есть ли программный метод, обратный Объединить?
Отдельного метода разъединения в объекте ТабличныйДокумент нет. При сборке кодом просто не вызывайте Объединить для клеток, которые должны остаться раздельными.
Почему объединение ячеек в макете на СКД не меняет готовый отчёт?
Количество и вложенность колонок в отчёте определяют группировки по колонкам в настройках, а не слияние клеток в макете. Управляйте дроблением через структуру отчёта.