Как программно объединить ячейки в табличном документе 1С?
Для объединения ячеек предназначена функция Объединить(). Функция применяется к прямоугольной область табличного документа.
Пример
В результате формирования отчета была получена таблица.
Товар | Склад | Остаток |
Яблоки | Склад 1 | 6 |
Яблоки | Склад 2 | 8 |
Яблоки | Склад 3 | 9 |
Груши | Склад 1 | 7 |
Груши | Склад 2 | 2 |
Необходимо объединить ячейки с одинаковыми товарами.
ОбъединениеНачало=2;
Для Строка=2 По ПоследняяСтрока Цикл
Если ТабДок.Область("R"+Строка+"C1").Текст=ТабДок.Область("R"+Строка(Строка-1)+"C1").Текст
ИЛИ ОбъединениеНачало=Строка ТогдаПродолжить;
Иначе
ТабДок.Область("R"+ОбъединениеНачало+"C1"+":"+"R"+Строка(Строка-1)+"C1").Объединить();
ОбъединениеНачало=Строка;
КонецЕсли;
КонецЦикла;
Для Строка=2 По ПоследняяСтрока Цикл
Если ТабДок.Область("R"+Строка+"C1").Текст=ТабДок.Область("R"+Строка(Строка-1)+"C1").Текст
ИЛИ ОбъединениеНачало=Строка ТогдаПродолжить;
Иначе
ТабДок.Область("R"+ОбъединениеНачало+"C1"+":"+"R"+Строка(Строка-1)+"C1").Объединить();
ОбъединениеНачало=Строка;
КонецЕсли;
КонецЦикла;
В результате получим следующую таблицу.
Товар | Склад | Остаток |
Яблоки | Склад 1 | 6 |
Склад 2 | 8 | |
Склад 3 | 9 | |
Груши | Склад 1 | 7 |
Склад 2 | 2 |
Коротко о том, что мы сделали.
- Создаем цикл, который будет обходить строки табличного документа со второй (заголовок нам не нужен) по последнюю. Переменную ПоследняяСтрока нужно каким-то образом рассчитать.
- Переменная ОбъединениеНачало содержит номер строки, с которой нужно будет начать объединение. Первоначально этот номер равен номеру строки начала обхода таблицы.
- Обходим последовательно каждую строку табличного документа. При этом проверяем, равен ли текст текущей строки и столбца 1 тексту предыдущей строки того же столбца. Если равно, продолжаем цикл.
- Если текст отличается от предыдущей строки, значит объединяем ячейки в первой колонке, начиная с ячейки начала объединения, по последнюю с тем же значением.
- После объединения меняем значение переменной НачалоОбъединения, чтобы следующее объединение начиналось уже со следующей строки.
Здорово! Спасибо. А я то думаю, как бы сделать такое же для колонок. Но там аналогично)
Рады, что помогло :)
Кстати объединение можно делать не только в уже полностью сформированном табличном документе, но и в отдельных областях, которые только готовятся для вывода. Делается все аналогично, но так бывает даже удобнее.
Спасибо! Очень помогла статья! Вот чувствовала, что метод Объединить нужно использовать, а каким боком его применить…. Оказывается, все довольно просто. Респект автору!
О, супер! Спасибо большое! Помогло.
Однако в выражении ТабДок.Область(«R»+Строка+»C1») переменную «Строка» лучше форматировать. То есть:
Формат(Строка,»ЧГ=0″)
Иначе, на строке № 1000 вывалится ошибка из-за пробела между разрядами групп.
Спасибо за замечание, надо попробовать.
Хотя есть некоторые сомнения. Ведь мы переменную Строка берем не из экселевского файла, в котором могут быть разделители групп. Эта переменная образуется в цикле ДЛЯ, ей значения присваивает 1С, они и так будут без разделителей.
Спасибо большое! Этот пример очень помог.
Я бы сменил имя переменной Строка=2 на НомерСтроки=2, «Строка» как приведене к строке и как имя переменной не очень красиво.
А разве в условии Если ТабДок.Область(«R»+Строка+»C1»).Текст=ТабДок.Область(«R»+Строка(Строка-1)+»C1»).Текст
Не должно быть «» вместо «=»?
Имел ввиду «не равно»
Думаю, нет. Мы же хотим объединить ячейки с одинаковым содержимым. Значит должно быть «равно».
спасибо. помогло. последнюю строку делаем вне диапазона, типа количествоСтрок в обрабатываемой таблице, и тогда все работает.