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

28.06.13

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

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

Скачать файлы

Наименование Файл Версия Размер
Объединяемые заголовки
.erf 9,99Kb
149
.erf 9,99Kb 149 Скачать
Объединяемые заголовки для 8.2
.erf 10,28Kb
110
.erf 10,28Kb 110 Скачать

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


 

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

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

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

Ячейка = ТабДок.Область(индСтр, индКол);
ЯчейкаСлед = ТабДок.Область(индСтр, индКол+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.

См. также

SALE! 20%

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

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    121598    670    389    

711

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4032    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8153    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4649    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5804    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6688    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4517    KVIKS    15    

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

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

Как раз наипервейшее. Потому как СКД настолько закрытый и запутанный механизм, что любое осмысленное вмешательство в него, дающее уверенный результат - уже огромный плюс.
user825364; +1 Ответить
2. Defor 107 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 174 20.11.12 15:21 Сейчас в теме
В платформе 8.2 уже все объединяет, если грамотно настроить
6. serg_gres 153 28.11.12 14:25 Сейчас в теме
(5) adminfo2002, серьезно?
Пример в студию.
8. free-lancer-2018 174 28.11.12 16:18 Сейчас в теме
(6) serg_gres, ок, сейчас потрачу полчасика на пример... подожди, не уходи :)
9. serg_gres 153 28.11.12 16:56 Сейчас в теме
13. bus1ka 10.01.13 22:07 Сейчас в теме
(8) adminfo2002, и я жду... )) передо мной сейчас такая же задача. Но как не пыталась, простой настройкой не обошлась
18. AlexO 135 19.03.13 23:53 Сейчас в теме
(8) adminfo2002,
ок, сейчас потрачу полчасика на пример

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

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

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

		Возврат Ложь

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

	Иначе

		Возврат Ложь

	КонецЕсли;

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

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

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

настройка "расположение группировок - вместе" дает красивый результат (ну на платформе 8.3. точно, при том что по умолчанию подразумевает "вместе" и ничего настраивать не нужно)
39. Defor 107 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 107 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 По ТабДок.ШиринаТаблицы Цикл
			
			// определяем количество колонок объединения
			КоличествоКолонок = ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения);
			Если КоличествоКолонок Тогда
				ТекстЗаголовка = ТабДок.Область(индСтр, индКол).Текст;
				ОбъединяемаяОбласть = ТабДок.Область(индСтр, индКол, индСтр, индКол+КоличествоКолонок);
				ОбъединяемаяОбласть.Объединить();
				ОбъединяемаяОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
				ОбъединяемаяОбласть.Текст = ТекстЗаголовка;
				индКол = индКол+КоличествоКолонок;
			КонецЕсли;
		КонецЦикла;
		
		// Если нашли в строке области для объединения то прекращаем дальнейшие поиски
		Если не ОбъединяемаяОбласть = Неопределено Тогда
			
			возврат;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

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

Показать
e-9; umni4ka; Andrei_Ivanov; Дейл; Volfy; whilefor; dyuha; andreich_ru; +8 Ответить
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 65 17.05.18 15:41 Сейчас в теме
(43)
// Возвращает количество объединяемых ячеек
Функция ОбъединятьЯчейки(ТабДок, индСтр, индКол, ТекстДляОбъединения)
Ячейка = ТабДок.Область(индСтр, индКол);

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

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

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

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

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


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

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

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

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

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

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

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

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

возврат;

КонецЕсли;

КонецЦикла;

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



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

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

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

Выбираем только шапку и объединяем все, что можем.
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; +32 Ответить
52. demONx7 27.12.19 02:53 Сейчас в теме
(46)Под скажите, а как посчитать итоги по объединенным таким образом ячейкам?
58. SagittariusA 01.11.22 10:49 Сейчас в теме
(46) есть нюанс - если выводить заголовок через доп. группировку, то он его "затирает", объединяя ячейки как пустые.
59. dyuha 49 02.11.22 01:27 Сейчас в теме
(58) Дело давнее. Сейчас я, скорее всего, макет бы нарисовал и не парился. А так, код открыт. В (57) дополнение полезное. Может, вообще, правильней справа вверх объединять.
47. Yashazz 4709 17.11.16 18:06 Сейчас в теме
Блин. Обрадовался было, что есть способ сделать это средствами СКД, а тут опять свинство под названием "поячейно курочим готовый моксель". Тьфу. Аж минуснуть захотелось.
TeMochkiN; Svetly_prazdnic; LavinVladik; +3 2 Ответить
55. Monte Carlo 16.02.20 13:56 Сейчас в теме
(47) Если Вы знаете как сделать более красиво, поделитесь, пожалуйста.
56. Yashazz 4709 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 65 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);
    Если ПустаяСтрока(Ячейка.Текст) Тогда
        Возврат ложь
    ИначеЕсли
        Ячейка.Текст = ЯчейкаСлед.Текст
            И Ячейка.Верх = Ячейка.Низ И ЯчейкаСлед.Верх = ЯчейкаСлед.Низ Тогда
        Возврат Истина;
	Иначе
        Возврат ложь;
    КонецЕсли;
КонецФункции
Показать
Прикрепленные файлы:
dyuha; SagittariusA; manu; +3 Ответить
Оставьте свое сообщение