Табличный документ - группировка колонок с разным форматом строк

1. Manoshkin 357 09.02.21 09:49 Сейчас в теме
Есть необходимость сделать группировку колонок в уже сформированном отчете.
В отчете есть несколько групп строк форматирования:
1-я группа: первая строка и все следующие за телом отчета
2-я группа: тело отчета

Через интерфейс делается без проблем: выделяешь нужную область в теле отчета, Таблица-Группы-Объединить группы, Вертикальная. И вертикальная группировка по 2-й группе появляется и прекрасно работает.

Вопрос: как это сделать программно?
При выполнении:
ДокументРезультат.Область("C2:C5" ).Сгруппировать()

группировка накладывается на 1-ю группу строк.


Подскажите пожалуйста как обратиться к другой форматированной группе строк.
Прикрепленные файлы:
Alchemist; +1 Ответить
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
10. SlavaKron 09.02.21 12:29 Сейчас в теме +3 $m
В качестве шаманства. Следующий код группирует колонки с 1 по 3 для первого нестандартного формата строк:
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ДокументРезультат);

Колонки = ОбъектXDTO.columns;
Колонка = Неопределено;
Для Сч = 0 по Колонки.Количество() - 1 Цикл
	Если ЗначениеЗаполнено(Колонки[Сч].id) Тогда
		Колонка = Колонки[Сч];
		Прервать;
	КонецЕсли;
КонецЦикла;

ПерваяКолонка = 1;
ПоследняяКолонка = 3;	

Если Колонка <> Неопределено Тогда
	НоваяГруппировка = ФабрикаXDTO.Создать(ОбъектXDTO.hg.ВладеющееСвойство.Тип);
	НоваяГруппировка.b = ПерваяКолонка - 1;
	НоваяГруппировка.e = ПоследняяКолонка - 1;
	НоваяГруппировка.columnsID = Колонка.id;
	НоваяГруппировка = ОбъектXDTO.hg.Добавить(НоваяГруппировка);	    
КонецЕсли;	

ДокументРезультат = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
Показать
Alchemist; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. soft_wind 09.02.21 10:20 Сейчас в теме
бред какой-то
... в уже сформированном (только что сделанном) отчете сделать группировку ...
так в сам отчет, в момент формирования вставьте нужные группировки!!!
гораздо проще, а еще лучше переведите на СКД, там в настройках можно будет менять и порядок группировок и состав полей и много чего еще другого.
3. Manoshkin 357 09.02.21 10:36 Сейчас в теме
(2) В СКД нельзя настроить вертикальные группировки без использования таблиц. А требуются вертикальные группировки на отдельные группы (папки) выбранных полей в списке, так как полей много и пользователю хочется сначала сформировать отчет, а затем уже быстренько сворачивать или разворачивать.
4. soft_wind 09.02.21 11:07 Сейчас в теме
ну если так,
в общем нормально, только надо знать (или найти) номера колонок которые надо сворачивать
вот простенький пример, (если я правильно понял)
Прикрепленные файлы:
ТестОбъединениеЯчеек.epf
7. Manoshkin 357 09.02.21 11:24 Сейчас в теме
(4) спасибо за пример. я немного подправил макет чтобы уточнить свою ситуацию. изменил формат колонок "Строки" теперь при свертке группировки она не работает.
Вот как бы сделать группировку для неё, оставив измененный макет.
Прикрепленные файлы:
ТестОбъединениеЯчеекИзм.epf
5. Manoshkin 357 09.02.21 11:15 Сейчас в теме
Отчет уже есть он сделан через СКД, можно сказать без единой строчки кода. Всё устраивает кроме возможности сворачивать группы колонок. В интерфейсе это делается за несколько секунд. И если кто знает как программно обратиться к конкретной группе форматированных строк, то останется только дописать немного пост.обработку результата. А не писать вывод отчета и встраивать нужные группировки.
6. soft_wind 09.02.21 11:17 Сейчас в теме
вот команды из примера
ТабДок.Область(,3,,3).Сгруппировать();
ТабДок.Область(,4,,5).Сгруппировать();

отлично работают
8. Manoshkin 357 09.02.21 11:39 Сейчас в теме
(6) да, верно. но только если у всех строк единый формат колонок. к сожалению при выводе СКД в разных группах строк формат разный. я описал в ответе (7) на (4)-е сообщение.
9. soft_wind 09.02.21 12:02 Сейчас в теме
(8) да, интересный эффект
ну что-же, лишний раз убеждает, что 1С не любит заднепроходных решений ...
10. SlavaKron 09.02.21 12:29 Сейчас в теме +3 $m
В качестве шаманства. Следующий код группирует колонки с 1 по 3 для первого нестандартного формата строк:
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ДокументРезультат);

Колонки = ОбъектXDTO.columns;
Колонка = Неопределено;
Для Сч = 0 по Колонки.Количество() - 1 Цикл
	Если ЗначениеЗаполнено(Колонки[Сч].id) Тогда
		Колонка = Колонки[Сч];
		Прервать;
	КонецЕсли;
КонецЦикла;

ПерваяКолонка = 1;
ПоследняяКолонка = 3;	

Если Колонка <> Неопределено Тогда
	НоваяГруппировка = ФабрикаXDTO.Создать(ОбъектXDTO.hg.ВладеющееСвойство.Тип);
	НоваяГруппировка.b = ПерваяКолонка - 1;
	НоваяГруппировка.e = ПоследняяКолонка - 1;
	НоваяГруппировка.columnsID = Колонка.id;
	НоваяГруппировка = ОбъектXDTO.hg.Добавить(НоваяГруппировка);	    
КонецЕсли;	

ДокументРезультат = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
Показать
Alchemist; +1 Ответить
11. Manoshkin 357 09.02.21 12:35 Сейчас в теме
(10) да, действительно шаманство и оно работает!
12. Manoshkin 357 09.02.21 12:36 Сейчас в теме
13. roman_sktm 18.01.23 12:29 Сейчас в теме
(10) Вставляю Ваш код после вывода отчета СКД в ДокументРезультат в процедуре "ПриКомпоновкеРезультата". При Сч=1 получаю Колонку с заполненным id, цикл прерывается, выполняется условие Если..Тогда и десериализация. Но никаких изменений отчета не вижу при выводе в табличный документ формы отчета (ни группировки колонок, ни изменений по строкам).

Подскажите, пожалуйста, что делаю не так?
Буду также благодарен за ссылки, где можно почитать о механизме, который тут применен.
14. SlavaKron 18.01.23 14:05 Сейчас в теме
(13) А покажите код процедуры ПриКомпоновкеРезультата.
где можно почитать о механизме
К сожалению, данный механизм не документирован – приходится методом проб и ошибок подбирать решение.
15. roman_sktm 18.01.23 14:14 Сейчас в теме
(14)

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

	Колонки = ОбъектXDTO.columns;
	Колонка = Неопределено;
	Для Сч = 0 по Колонки.Количество() - 1 Цикл
	    Если ЗначениеЗаполнено(Колонки[Сч].id) Тогда
	        Колонка = Колонки[Сч];
	        Прервать;
	    КонецЕсли;
	КонецЦикла;

	ПерваяКолонка = 1;
	ПоследняяКолонка = 3;    

	Если Колонка <> Неопределено Тогда
	    НоваяГруппировка = ФабрикаXDTO.Создать(ОбъектXDTO.hg.ВладеющееСвойство.Тип);
	    НоваяГруппировка.b = ПерваяКолонка - 1;
	    НоваяГруппировка.e = ПоследняяКолонка - 1;
	    НоваяГруппировка.columnsID = Колонка.id;
	    НоваяГруппировка = ОбъектXDTO.hg.Добавить(НоваяГруппировка);        
	КонецЕсли;    

	ДокументРезультат = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);	

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

Показать


Итог формирования СКД во вложении (не меняется). Группировки строк создает СКД
Прикрепленные файлы:
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот