СКД. Как объединить заголовки родительских группировок колонок в таблице

28.06.13

Разработка - СКД

Проблема в СКД. При формировании в колонках таблицы вложенных группировок, родительский заголовок группировки, не объединяет заголовки дочерних группировок.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Объединяемые заголовки
.erf 9,99Kb
153 2 500 руб. Купить
Объединяемые заголовки для 8.2
.erf 10,28Kb
115 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Имеем отчет вида:


 

Необходимо одинаковые заголовки группировок объединить.

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

// Проверка двух смежных ячеек на идентичночность
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол)

Ячейка = ТабДок.Область(индСтр, индКол);
ЯчейкаСлед = ТабДок.Область(индСтр, индКол+1);
Если
ПустаяСтрока(Ячейка.Текст) Тогда

Возврат ложь

ИначеЕсли
//Проверяем на соответствие заголовка
Ячейка.Текст = ЯчейкаСлед.Текст
// Проверяем на соответствие имени (отсеиваем уже объединенные ячейки)
и Ячейка.Имя = "R"+индСтр+"C"+индКол Тогда

Возврат Истина;

Иначе

Возврат ложь

КонецЕсли;

КонецФункции

// Обработка заголовков таблицы
//
// Параметры
// Табл - < Тип.ТабличныйДокумент> - Табличный документ формы
Процедура ОбработатьЗаголовки(ТабДок)

ОбъединяемаяОбласть = Неопределено;

//Для оптимизации здесь нужно будет ограничить высоту таблицы
Для индСтр=1 По ТабДок.ВысотаТаблицы Цикл

НачальнаяКолонка = 0;
Для
индКол=1 По ТабДок.ШиринаТаблицы Цикл

// определяем начало объединения
Если ОбъединятьЯчейки(ТабДок, индСтр, индКол) Тогда

Если не
НачальнаяКолонка Тогда

НачальнаяКолонка = индКол;

КонецЕсли;

ИначеЕсли
НачальнаяКолонка Тогда
// завершаем объединение

ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
ОбъединяемаяОбласть = ТабДок.Область(индСтр, НачальнаяКолонка, индСтр, индКол);
ОбъединяемаяОбласть.Объединить();
ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
НачальнаяКолонка = 0;

Иначе

НачальнаяКолонка = 0;

КонецЕсли;

КонецЦикла;

// Если нашли в строке области для объединения то прекращаем дальнейшие поиски
Если не ОбъединяемаяОбласть = Неопределено Тогда

возврат;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Вставляем вызов после формирования табличного документа:

Результат представлен ниже:

Решение претендует на универсальность.
Но главный недостаток этого способа, трудно заранее определить начальную и конечную область поиска, т. к. процедура может отработать и объединить любые другие смежные идентичные ячейки. Если есть идеи как однозначно идентифицировать ячейки заголовка группировок пишите. А пока этот код можно использовать с некоторыми изменения в каждом конкретном случае.

 

Благодарности:

На поиски решения вдохновила статья also http://1cskd.ru/2010/07/kak-v-skd-nakryt-kolonki-shapkoj/

p.s.

Добавлен доработанный файл для 8.2, где предоставлен модифицированный пример для нескольких ресурсов (показателей) - спасибо Evgeniy.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    245783    1350    419    

1128

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    4947    279    shapa_pro    25    

66

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    15557    ovetgana    112    

105

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    9114    krasnoshchekovpavel    5    

66

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8302    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15474    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

СКД – инструмент, на базе которого в современных конфигурациях реализованы практически все отчеты. СКД используется в динамических списках, печатных формах и универсальных механизмах. Если построить простейший отчет может каждый разработчик, то с нюансами знакомы далеко не все. Расскажем о неочевидных на первый взгляд приемах, способных значительно повысить качество отчетов.

24.12.2024    13059    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    9507    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Saint 12.11.10 03:09 Сейчас в теме
Если операция производится над сформированным табличным документом, то причём здесь СКД?
19. AlexO 136 19.03.13 23:54 Сейчас в теме
(1) Saint,
над сформированным табличным документом, то причём здесь СКД?

Вы знаете способ обработать СКД напрямую?
20. Saint 20.03.13 02:45 Сейчас в теме
(19) AlexO, C добрым утром! Вопрос по комментарию трёхгодичной давности? Тем не менее попытаюсь ещё раз сформулировать: какое отношение описанный алгоритм имеет к СКД? Здесь обрабатывается уже сформированный табличный документ. А как он был сформирован для описанного алгоритма дело десятое. Точно также можно обрабатывать табличный документ, сформированный вручную.
22. AlexO 136 20.03.13 11:13 Сейчас в теме
(20) Saint,
А как он был сформирован для описанного алгоритма дело десятое

Как раз наипервейшее. Потому как СКД настолько закрытый и запутанный механизм, что любое осмысленное вмешательство в него, дающее уверенный результат - уже огромный плюс.
user825364; +1 Ответить
2. Defor 108 12.11.10 04:45 Сейчас в теме
Проблема в СКД. При формировании в колонках таблицы вложенных группировок, родительский заголовок группировки, не объединяет заголовки дочерних группировок.


Это решение призвано привести в порядок вертикальные группировки в СКД. Если этот вариант можно использовать еще где нибудь я не против.
3. malina-da 10.10.11 10:24 Сейчас в теме
Спасибо за решение, сделал и для горизонтальных и вертикальных ячеек.
4. doronin70 19.01.12 17:58 Сейчас в теме
Классно работает и для вертикальных и для горизонтальных ячеек. А у кого получилось одновременное объединение горизонтальных и верткальных? Например объединенная ячейка должна быть высотой 2 строки и шириной 3 колонки ?
5. free-lancer-2018 247 20.11.12 15:21 Сейчас в теме
В платформе 8.2 уже все объединяет, если грамотно настроить
6. serg_gres 155 28.11.12 14:25 Сейчас в теме
(5) adminfo2002, серьезно?
Пример в студию.
8. free-lancer-2018 247 28.11.12 16:18 Сейчас в теме
(6) serg_gres, ок, сейчас потрачу полчасика на пример... подожди, не уходи :)
9. serg_gres 155 28.11.12 16:56 Сейчас в теме
13. bus1ka 10.01.13 22:07 Сейчас в теме
(8) adminfo2002, и я жду... )) передо мной сейчас такая же задача. Но как не пыталась, простой настройкой не обошлась
18. AlexO 136 19.03.13 23:53 Сейчас в теме
(8) adminfo2002,
ок, сейчас потрачу полчасика на пример

Полгода прошло... у вас там временная аномалия? :)
(16) sdv88,
как в публикации на картинке где без объединения

"А вот тут немного снять.. здесь подчистить... тут отрезать...и вот изящная ложка готова!"
"Не, мне баклушу как сделать?!..."
Кто ж поймет этих 1сников...
35. Maximysis 9 06.03.15 06:34 Сейчас в теме
(8) adminfo2002, Конечно пiZдеть проще)
pkorneenko; +1 Ответить
51. Hans 3 24.01.19 15:18 Сейчас в теме
11. Defor 108 29.11.12 05:48 Сейчас в теме
(5) adminfo2002, действительно, было бы очень интересно посмотреть на новое решение ...
7. serg_gres 155 28.11.12 14:32 Сейчас в теме
Вопрос автору: объединятся ли смежные ячейки ресурсов с одинаковым значением?
10. Defor 108 29.11.12 05:45 Сейчас в теме
(7) serg_gres, не понял, зачем объединять ячейки ресурсов? Если речь идет об общей родительской группировке этих ресурсов, то да объединятся.
12. bus1ka 10.01.13 22:05 Сейчас в теме
Единственное найденное решение, на мой взгляд. И в 8.2 ничего подобного, как ни настраивай...
14. sdv88 87 01.03.13 14:50 Сейчас в теме
мне наоборот надо чтобы родительская группировка не объединялась.. версия платформы 8.2.14.540. есть какая то настройка?
15. Defor 108 07.03.13 08:10 Сейчас в теме
А можно поподробнее описать, в каком виде вы хотите видеть родительские группировки?
16. sdv88 87 07.03.13 14:30 Сейчас в теме
как в публикации на картинке где без объединения(покупатели или поставщики). чтобы над каждой колонкой было название верхней группировки. то есть начальный вариант в этой публикации
17. Defor 108 18.03.13 09:11 Сейчас в теме
Смотрите скриншот "Настройки СКД"
21. Defor 108 20.03.13 05:49 Сейчас в теме
Если данное решение можно применить где-то еще я буду только рад. Но в первую очередь это будет полезно пользователям СКД.
23. kurmanov 104 24.06.13 13:44 Сейчас в теме
Спасибо! Полезная вещь, очень помогла.
24. Evgeniy 107 27.06.13 14:04 Сейчас в теме
работает только при выводе одного показателя в отчете.
Если делаешь вывод более одного показателя, то объединение не срабатывает:(
25. Defor 108 30.06.13 10:17 Сейчас в теме
Спасибо за замечание, добавлен доработанный пример для 8.2.
26. lamdth 10 02.07.13 15:43 Сейчас в теме
Подскажите, если у меня нет кнопки сформировать, и форма рисуется стандартно, как мне использовать данную процедуру?
28. Defor 108 11.07.13 07:02 Сейчас в теме
(26) lamdth,
На форме создайте кнопку, прицепите к ней свой обработчик, текст можно подсмотреть где угодно. Например выдрать из моего отчета этой темы. Пример есть в книге "Руководство разработчика" гл 10.4.
27. KliMich 03.07.13 09:56 Сейчас в теме
Спасибо!
Возьму на вооружение.
29. ixijixi 2132 09.10.13 15:13 Сейчас в теме
Нечто подобное методами СКД. Не так красиво, правда http://www.forum.mista.ru/topic.php?id=637203
30. rborovikov 10.02.14 22:26 Сейчас в теме
А как сделали рисунок "Имеем отчет вида"???
31. Defor 108 18.02.14 16:57 Сейчас в теме
(30) rborovikov,
На скриншоте "Настройки СКД" показан пример настроек или можно скачать приложенный отчет и там посмотреть.
32. andreich_ru 07.07.14 12:34 Сейчас в теме
Спасибо, помогло.
Я при использовании немного дополнил функцию ОбъединятьЯчейки():
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол)

	ТекстДляОбъединения = Новый Массив;
	ТекстДляОбъединения.Добавить("Начальный остаток");
	ТекстДляОбъединения.Добавить("Приход");
	ТекстДляОбъединения.Добавить("Расход");
	ТекстДляОбъединения.Добавить("Конечный остаток");
	
	Ячейка = ТабДок.Область(индСтр, индКол);
	ЯчейкаСлед = ТабДок.Область(индСтр, индКол+1);
	
	Если ПустаяСтрока(Ячейка.Текст) Тогда

		Возврат Ложь

	//Проверяем, чтобы текст был одним из указанных в ТекстДляОбъединения
	ИначеЕсли ТекстДляОбъединения.Найти(Ячейка.Текст) <> Неопределено И Ячейка.Текст = ЯчейкаСлед.Текст И Ячейка.Имя = "R"+индСтр+"C"+индКол Тогда 
		
		Возврат Истина;

	Иначе

		Возврат Ложь

	КонецЕсли;

КонецФункции
Показать

Добавил массив, в котором указал конкретные строки, которые должны быть в ячейках для объединения. Потому что исходный вариант иногда объединял не то, что нужно.
33. Leits 2 23.10.14 11:05 Сейчас в теме
скачал для 8.2, процедуры в модуле форме вообще не прорабатываются, т.е. удалил вообще форму - результат тот же
p.s. допёр - сделано в обычных формах, хотя написано 8.2 думал на управляемых
34. пользователь 06.01.15 14:47
Сообщение было скрыто модератором.
...
36. anig99 2864 17.04.15 14:44 Сейчас в теме
Спасибо за алгоритм. Есть небольшое дополнение. Чтобы сделать именно шапку на колонками, а не просто объединить одинаковые ячейки и не оставлять итоги по группировке слева от колонок, то можно использовать группировку полей. Вот как у меня на рисунке. Тогда при использовании доп. кода по объединению ячеек можно получить красивую таблицу с шапками колонок.

Прикрепленные файлы:
Istur; Defor; igee12; +3 1 Ответить
37. graZy 16 17.04.15 15:20 Сейчас в теме
Наткнулся случайно.
я чего-то не понял (может быть реализация связана с "-5" лет назад? или связано с особыми требованиями к формату отчета)
потому как ну нет проблемы вроде с отображением группировок

настройка "расположение группировок - вместе" дает красивый результат (ну на платформе 8.3. точно, при том что по умолчанию подразумевает "вместе" и ничего настраивать не нужно)
39. Defor 108 27.05.15 07:33 Сейчас в теме
(37) graZy,
Сейчас проверил на платформе 8.3.4.465 (другой под рукой не было), проблема осталась.

з.ы.
Проверил на 8.3.5.1383 - результат тот же. (Для проверки можно использовать отчет из загрузок например "Объединяемые заголовки для 8.2" и закомментировать вызов "ОбработатьЗаголовки(...)"
40. graZy 16 27.05.15 14:52 Сейчас в теме
(39)

(39)
8.3.5.1119

(экперементировал на своем отчете)

рис 1 "расположение полей группировок вместе"
рис 2 "расположение полей группировок отдельно"

Прикрепленные файлы:
41. Defor 108 28.05.15 15:01 Сейчас в теме
(40) graZy,
На втором вашем рисунке как раз нужно добиться общей шапки для "кварталов" и "полугодий"
38. Гость 22.05.15 13:49
42. graZy 16 29.05.15 12:05 Сейчас в теме
так а чем отчет на первом рисунке не устраивает??? (зачем городить рисунок 2 с объединением) --- как писал ранее, если это только не требования к форме отчета (тогда понятно зачем) - в остальных случаях рис1 по мне так идеально подходит (и все стандартными средствами СКД)
43. demientut 26 19.11.15 13:54 Сейчас в теме
Переработал функционал из поста 32.
Проблема в том, что если по колонкам есть уже объединенные ячейки то механизм не срабатывает.
Сделал универсальную шнягу, которая объединяет даже объединенные ячейки по списку:

// Возвращает количество объединяемых ячеек
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения)
	Ячейка = ТабДок.Область(индСтр, индКол);
	
	Если ПустаяСтрока(Ячейка.Текст) Тогда
		Возврат 0;
	КонецЕсли;
	
	Если ТекстДляОбъединения.Найти(Ячейка.Текст) = Неопределено Тогда
		Возврат 0;
	КонецЕсли;
	
	КоличествоКолонок = 0;
	Для СледКолонка = индКол+1 По ТабДок.ШиринаТаблицы Цикл
		ЯчейкаСлед = ТабДок.Область(индСтр, СледКолонка);
		//Проверяем, чтобы текст был одним из указанных в ТекстДляОбъединения
		Если Ячейка.Текст = ЯчейкаСлед.Текст ИЛИ ПустаяСтрока(ЯчейкаСлед.Текст) Тогда
			КоличествоКолонок = КоличествоКолонок + 1;
		Иначе
			Возврат КоличествоКолонок;
		КонецЕсли;	
	КонецЦикла; 
	
	Возврат КоличествоКолонок;
	
КонецФункции


// Обработка заголовков таблицы
//
// Параметры
// Табл - < Тип.ТабличныйДокумент> - Табличный документ формы
Процедура ОбработатьЗаголовки(ТабДок)
	
	ТекстДляОбъединения = Новый Массив;

	// накачиваем массив значениями текстов для анализа и объединения (замените на свое)
	Выборка = Справочники.Регионы.Выбрать();
	Пока Выборка.Следующий() Цикл
		ТекстДляОбъединения.Добавить(СокрЛП(Выборка.Наименование));
	КонецЦикла; 
	// конец
	
	ОбъединяемаяОбласть = Неопределено;
	
	//Для оптимизации здесь нужно будет ограничить высоту таблицы
	Для индСтр=1 По ТабДок.ВысотаТаблицы Цикл
		
		Для индКол=1 По ТабДок.ШиринаТаблицы Цикл
			
			// определяем количество колонок объединения
			КоличествоКолонок = ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения);
			Если КоличествоКолонок Тогда
				ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
				ОбъединяемаяОбласть = ТабДок.Область(индСтр, индКол, индСтр, индКол+КоличествоКолонок);
				ОбъединяемаяОбласть.Объединить();
				ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
				ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
				индКол = индКол+КоличествоКолонок;
			КонецЕсли;
		КонецЦикла;
		
		// Если нашли в строке области для объединения то прекращаем дальнейшие поиски
		Если не ОбъединяемаяОбласть = Неопределено Тогда
			
			возврат;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

// Вызов формирования отчета и постобработка колонок
Процедура ДействияФормыСформироватьОтчет(Кнопка)
	
	//Получаем схему из макета
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//Из схемы возьмем настройки по умолчанию
	//Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	
	Настройки = КомпоновщикНастроек.Настройки;
	
	//Помещаем в переменную данные о расшифровке данных
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Формируем макет, с помощью компоновщика макета
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	//Передаем в макет компоновки схему, настройки и данные расшифровки
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);
	
	//Выполним компоновку с помощью процессора компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
	
	//Очищаем поле табличного документа
	Результат = ЭлементыФормы.Результат;
	Результат.Очистить();
	
	//Выводим результат в табличный документ
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(Результат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	ОбработатьЗаголовки(Результат);
КонецПроцедуры

Показать
KPAMOP; e-9; umni4ka; Andrei_Ivanov; Дейл; Volfy; whilefor; dyuha; andreich_ru; +9 Ответить
44. aleksey_1984 04.02.16 08:35 Сейчас в теме
(43) demien@tut.by, (43) demien@tut.by,
Добрый день.

Что бы настройки брались пользовательские надо
вместо этого:
Настройки = КомпоновщикНастроек.Настройки;

Надо написать это:
Настройки= КомпоновщикНастроек.ПолучитьНастройки();

Взял отсюда:
http://1cskd.ru/2012/03/programmnoe-vypolnenie-skd-i-polzovatelskienastrojki/
SagittariusA; Irwin; dyuha; +3 Ответить
49. Volfy 72 17.05.18 15:41 Сейчас в теме
(43)
// Возвращает количество объединяемых ячеек
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения)
Ячейка = ТабДок.Область(индСтр, индКол);

Если ПустаяСтрока(Ячейка.Текст) Тогда
Возврат 0;
КонецЕсли;

Если ТекстДляОбъединения.Найти(Ячейка.Текст) = Неопределено Тогда
Возврат 0;
КонецЕсли;

КоличествоКолонок = 0;
Для СледКолонка = индКол+1 По ТабДок.ШиринаТаблицы Цикл
ЯчейкаСлед = ТабДок.Область(индСтр, СледКолонка);
//Проверяем, чтобы текст был одним из указанных в ТекстДляОбъединения
Если Ячейка.Текст = ЯчейкаСлед.Текст ИЛИ ПустаяСтрока(ЯчейкаСлед.Текст) Тогда
КоличествоКолонок = КоличествоКолонок + 1;
Иначе
Возврат КоличествоКолонок;
КонецЕсли;
КонецЦикла;

Возврат КоличествоКолонок;

КонецФункции


// Обработка заголовков таблицы
//
// Параметры
// Табл - - Табличный документ формы
Процедура ОбработатьЗаголовки(ТабДок)

ТекстДляОбъединения = Новый Массив;

// накачиваем массив значениями текстов для анализа и объединения (замените на свое)
Выборка = Справочники.Регионы.Выбрать();
Пока Выборка.Следующий() Цикл
ТекстДляОбъединения.Добавить(СокрЛП(Выборка.Наименование));
КонецЦикла;
// конец

ОбъединяемаяОбласть = Неопределено;

//Для оптимизации здесь нужно будет ограничить высоту таблицы
Для индСтр=1 По ТабДок.ВысотаТаблицы Цикл

Для индКол=1 По ТабДок.ШиринаТаблицы Цикл

// определяем количество колонок объединения
КоличествоКолонок = ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения);
Если КоличествоКолонок Тогда
ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
ОбъединяемаяОбласть = ТабДок.Область(индСтр, индКол, индСтр, индКол+КоличествоКолонок);
ОбъединяемаяОбласть.Объединить();
ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
индКол = индКол+КоличествоКолонок;
КонецЕсли;
КонецЦикла;

// Если нашли в строке области для объединения то прекращаем дальнейшие поиски
Если не ОбъединяемаяОбласть = Неопределено Тогда

возврат;

КонецЕсли;

КонецЦикла;

КонецПроцедуры
Показать



Огромное спасибо за предоставленный вариант, работает безукоризненно!
45. AllexSoft 15.02.16 16:52 Сейчас в теме
Актуально, но нормально не работает (( мне например итог по группировке не нужен вообще (на скриншоте из примера первая колонка Покупатели), так еще и 3 группировки в колонках! как этому хозяйству ума дать ? может 1С что нибудь стандартное придумало все же ?
46. dyuha 53 05.05.16 01:05 Сейчас в теме
Требовалось объединить более одного уровня группировки. Наваял вот. Пользуйтесь, кому надо. Спасибо авторам.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки, Истина);
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
	ДокументРезультат = ОбработатьЗаголовки(ДокументРезультат);
КонецПроцедуры

Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол)
	Ячейка = ТабДок.Область(индСтр, индКол);
	ЯчейкаСлед = ТабДок.Область(индСтр, индКол+1);
	Если ПустаяСтрока(Ячейка.Текст) Тогда
		Возврат ложь
	ИначеЕсли
		Ячейка.Текст = ЯчейкаСлед.Текст
			И Ячейка.Верх = Ячейка.Низ И ЯчейкаСлед.Верх = ЯчейкаСлед.Низ Тогда
		Возврат Истина;
	Иначе
		Возврат ложь
	КонецЕсли;
КонецФункции

Функция ОбработатьЗаголовки(ТабДок)
	ВысотаФ = ТабДок.ФиксацияСверху;
	ШиринаФ = ТабДок.ФиксацияСлева;
	ОбъединяемаяОбласть = Неопределено;
	Для индСтр = -ВысотаФ По -1 Цикл
		Если ТабДок.Область(-индСтр,1).Текст = "" Тогда
			Возврат ТабДок;
		КонецЕсли; 
		НачальнаяКолонка = 0;
		Для индКол=ШиринаФ+1 По ТабДок.ШиринаТаблицы Цикл
			Если ОбъединятьЯчейки(ТабДок, -индСтр, индКол) Тогда
				Если не НачальнаяКолонка Тогда
					НачальнаяКолонка = индКол;
				КонецЕсли;
			ИначеЕсли НачальнаяКолонка Тогда
				ТекстЗаголовка = ТабДок.Область(-индСтр, индКол).Текст;
				ОбъединяемаяОбласть = ТабДок.Область(-индСтр, НачальнаяКолонка, -индСтр, индКол);
				ОбъединяемаяОбласть.Объединить();
				ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
				ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
				НачальнаяКолонка = 0;
			Иначе
				НачальнаяКолонка = 0;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Возврат ТабДок;
КонецФункции
Показать

Выбираем только шапку и объединяем все, что можем.
oleg-ts; metatron_rus; sergiz; kriswell; Divedition; Fales; White13; SagittariusA; VickWood; kabantus; Hartge; Ryo3000; Dream_kz; Simonov_NPM; mr_sav; KAV2; Zazamuh; 1C-Nic; oleg-x; TimkoNzt; ivv1970; asid; ye_s; Lyns_owner; atmic; ЧИА; alexsander.sharikov; xa1ter; Yarilo; hlop11; kovgard; ll13; artfa; user590008_Fallen_Lord3; whilefor; info6ps; +36 Ответить
52. demONx7 27.12.19 02:53 Сейчас в теме
(46)Под скажите, а как посчитать итоги по объединенным таким образом ячейкам?
58. SagittariusA 01.11.22 10:49 Сейчас в теме
(46) есть нюанс - если выводить заголовок через доп. группировку, то он его "затирает", объединяя ячейки как пустые.
59. dyuha 53 02.11.22 01:27 Сейчас в теме
(58) Дело давнее. Сейчас я, скорее всего, макет бы нарисовал и не парился. А так, код открыт. В (57) дополнение полезное. Может, вообще, правильней справа вверх объединять.
47. Yashazz 4900 17.11.16 18:06 Сейчас в теме
Блин. Обрадовался было, что есть способ сделать это средствами СКД, а тут опять свинство под названием "поячейно курочим готовый моксель". Тьфу. Аж минуснуть захотелось.
TeMochkiN; Svetly_prazdnic; LavinVladik; +3 2 Ответить
55. Monte Carlo 16.02.20 13:56 Сейчас в теме
(47) Если Вы знаете как сделать более красиво, поделитесь, пожалуйста.
56. Yashazz 4900 17.02.20 10:19 Сейчас в теме
(55) К сожалению, как средствами СКД - не знаю. Я пару раз такое делал на уровне изменения сериализованного мокселя, операциями над хмл, но там тоже или кусок выдирать (сам фрагмент заголовка), или всё целиком пилить (а тогда времязатратно).
Monte Carlo; +1 Ответить
48. pirm2 20.11.17 14:50 Сейчас в теме
Так что ли?
Прикрепленные файлы:
Svetly_prazdnic; +1 Ответить
54. Monte Carlo 12.02.20 23:33 Сейчас в теме
(48) А что похоже, что так?
50. Volfy 72 17.05.18 15:42 Сейчас в теме
Спасибо за полезную тему, очень помогло объединить заголовки месяцев над неделями.
Прикрепленные файлы:
53. Monte Carlo 12.02.20 23:30 Сейчас в теме
Расшифровка при этом ломается.
57. gztrbnst 20.05.20 19:53 Сейчас в теме
Написал корявый, но (вроде) рабочий код, когда нужно объединить заголовки так, чтобы группировки уровнем ниже с одинаковыми заголовками не объединялись, если подчиняются разным верхним группировкам.

Функция ОбработатьЗаголовки(ТабДок)
    ВысотаФ = ТабДок.ФиксацияСверху;
    ШиринаФ = ТабДок.ФиксацияСлева;
	ШиринаТаблицы = ТабДок.ШиринаТаблицы;
	МассивМассивовОбъединяемыхОбластей = Новый Массив;
	МассивОбъединяемыхОбластей = Новый Массив;
	НачальнаяКолонка = ШиринаФ + 1;
	КонечнаяКолонка = ШиринаТаблицы;
	МассивОбъединяемыхОбластей.Добавить(Новый Структура("НачальнаяКолонка, КонечнаяКолонка", НачальнаяКолонка, КонечнаяКолонка));
	МассивМассивовОбъединяемыхОбластей.Добавить(МассивОбъединяемыхОбластей);	
	Строка = 1;
	Пока Строка <= ВысотаФ Цикл
		Если Строка = МассивМассивовОбъединяемыхОбластей.Количество() Тогда
			Для Каждого ОбъединяемаяОбласть Из МассивМассивовОбъединяемыхОбластей[Строка-1] Цикл
				НачальнаяКолонка = ОбъединяемаяОбласть.НачальнаяКолонка;			
				КонечнаяКолонка = ОбъединяемаяОбласть.КонечнаяКолонка;
				Колонка = НачальнаяКолонка;
				Пока Колонка <= КонечнаяКолонка Цикл
					Если НЕ ОбъединятьЯчейки(ТабДок, Строка, Колонка) ИЛИ Колонка = КонечнаяКолонка Тогда
						Если Колонка <> НачальнаяКолонка Тогда
							МассивОбъединяемыхОбластей.Добавить(Новый Структура("НачальнаяКолонка, КонечнаяКолонка", НачальнаяКолонка, Колонка));
						КонецЕсли;
						НачальнаяКолонка = Колонка + 1;
					КонецЕсли;	
					Колонка = Колонка + 1;
				КонецЦикла;
			КонецЦикла;
			Если МассивОбъединяемыхОбластей.Количество() = 0 И ОбъединяемаяОбласть.НачальнаяКолонка = ШиринаФ + 1 И ОбъединяемаяОбласть.КонечнаяКолонка = ШиринаТаблицы Тогда
				МассивОбъединяемыхОбластей.Добавить(Новый Структура("НачальнаяКолонка, КонечнаяКолонка", ОбъединяемаяОбласть.НачальнаяКолонка, ОбъединяемаяОбласть.КонечнаяКолонка));
			КонецЕсли;	
			МассивМассивовОбъединяемыхОбластей.Добавить(МассивОбъединяемыхОбластей);
			МассивОбъединяемыхОбластей = Новый Массив;
		КонецЕсли;
		Строка = Строка + 1;
	КонецЦикла;
	Строка = 1;
	Пока Строка < МассивМассивовОбъединяемыхОбластей.Количество() Цикл
		Для Каждого ОбъединяемаяОбласть Из МассивМассивовОбъединяемыхОбластей[Строка] Цикл
			ТекстЗаголовка = ТабДок.Область(Строка, ОбъединяемаяОбласть.НачальнаяКолонка).Текст;
			ОбъединяемаяОбласть = ТабДок.Область(Строка, ОбъединяемаяОбласть.НачальнаяКолонка, Строка, ОбъединяемаяОбласть.КонечнаяКолонка);
			ОбъединяемаяОбласть.Объединить();
			ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
			ОбъединяемаяОбласть.Текст = ТекстЗаголовка;		
		КонецЦикла;
		Строка = Строка + 1;
	КонецЦикла;
	Возврат ТабДок;
КонецФункции

Функция ОбъединятьЯчейки(ТабДок, Строка, НачальнаяКолонка)
    Ячейка = ТабДок.Область(Строка, НачальнаяКолонка);
    ЯчейкаСлед = ТабДок.Область(Строка, НачальнаяКолонка+1);
    Если ПустаяСтрока(Ячейка.Текст) Тогда
        Возврат ложь
    ИначеЕсли
        Ячейка.Текст = ЯчейкаСлед.Текст
            И Ячейка.Верх = Ячейка.Низ И ЯчейкаСлед.Верх = ЯчейкаСлед.Низ Тогда
        Возврат Истина;
	Иначе
        Возврат ложь;
    КонецЕсли;
КонецФункции
Показать
Прикрепленные файлы:
user744718; molodoi1sneg; dyuha; SagittariusA; manu; +5 Ответить
60. user744718 28.02.25 19:29 Сейчас в теме
(57) Нашел то, что нужно, спасибо большое!
Для отправки сообщения требуется регистрация/авторизация