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