gifts2017

Переворот или ТРАНСПОНИРОВАНИЕ Таблицы Значений

Опубликовал OldthiefXXX OldthiefXXX (OldthiefXXX) в раздел Программирование - Практика программирования

Задача такова что необходимо поменять местами Колонки со Строками. Условие Первая колонка значений это название колонок будущей таблицы значений.

Исходная таблица:
Индекс    Колонка1    Колонка2    Колонка3    Колонка4
0    "Тип11"    "Тип21"    "Тип31"    "Тип41"
1    "Тип12"    "Тип22"    "Тип32"    "Тип42"
2    "Тип13"    "Тип23"    "Тип33"    "Тип43"
3    "Тип14"    "Тип24"    "Тип34"    "Тип44"
4    "Тип15"    "Тип25"    "Тип35"    "Тип45"

Полученная таблица:
Индекс    Тип11    Тип12    Тип13    Тип14    Тип15
0    "Тип11"    "Тип12"    "Тип13"    "Тип14"    "Тип15"
1    "Тип21"    "Тип22"    "Тип23"    "Тип24"    "Тип25"
2    "Тип31"    "Тип32"    "Тип33"    "Тип34"    "Тип35"
3    "Тип41"    "Тип42"    "Тип43"    "Тип44"    "Тип45"

Минус ы :
1.того что имя колонок первоначальных не видно.
2. Значение исходной таблицы первой колонки должны быть типизированны для название колонок.

P.S. Может поможет кому ;-)
// Функция возвращает перевернутую ТЗ
// Кидаем ТЗ
Функция ПеревернутьТЗ(ТЗ)
	ТЗ2 = Новый ТаблицаЗначений;
	Массив=Тз.ВыгрузитьКолонку(Тз.Колонки[0]);
	Для Каждого Значения  ИЗ  Массив ЦИКЛ 		ЗН=ВРег(СокрЛП(Значения));
		ТЗ2.Колонки.Добавить(Значения);
	Конеццикла;
	Для каждого стр из Тз.Колонки Цикл 		ТЗ2.Добавить();
	КонецЦикла;
	СчетчикСтрок=-1;
	Для каждого стр из Тз Цикл 		СчетчикСтрок=СчетчикСтрок+1;
		Мас= Новый Массив;
		счетчик=-1;
		Для каждого КН из Тз.Колонки Цикл 			счетчик=счетчик+1;
			ЗначениеИндекса=стр[КН.Имя];
			Мас.Вставить(счетчик,ЗначениеИндекса);
		КонецЦикла;
		ТЗ2.ЗагрузитьКолонку(Мас,ТЗ2.колонки[СчетчикСтрок]);
	КонецЦикла;
	Возврат ТЗ2;	
КонецФункции  

См. также

Подписаться Добавить вознаграждение
Комментарии
1. vladal (Vladal) 21.04.11 12:24
Молодец. Давненько сталкивался с подобным, просто повернуть таблицу на 90 градусов, некий аналог.
2. Ийон Тихий (cool.vlad4) 21.04.11 12:43
Чего-то циклов много...код не очень ...можно при обходе колонок сразу значения добавлять (имхо)....навскидку

Для Каждого Колонка Из Тз.Колонки Цикл
СтрокаРезультат = ТаблицаРезультат.Добавить();
Строка = Тз.ВыгрузитьКолонку(Колонка);
i = 0;
Для Каждого Эл Из Строка Цикл

СтрокаРезультат[i] = Эл;
i=i+1;
КонецЦикла;
КонецЦикла;

Примерно...естественно count i надо убрать и можно придумать получше...
...похоже все это на транспонирование матрицы...
3. Александр Медведев (anig99) 21.04.11 12:47
(2) поворот таблицы на 90 градусов и есть транспонирование. Транспонирование матрицы - частный случай.
4. Ийон Тихий (cool.vlad4) 21.04.11 12:52
(3) да, я знаю, просто намекнул, что переворот как-то не звучит, а транспонирование сразу ясно.
5. OldthiefXXX OldthiefXXX (OldthiefXXX) 21.04.11 13:23
cool.vlad4 пишет:
Чего-то циклов много...код не очень ...можно при обходе колонок сразу значения добавлять (имхо)....навскидку

Для Каждого Колонка Из Тз.Колонки Цикл
СтрокаРезультат = ТаблицаРезультат.Добавить();
Строка = Тз.ВыгрузитьКолонку(Колонка);
i = 0;
Для Каждого Эл Из Строка Цикл

СтрокаРезультат[i] = Эл;
i=i+1;
КонецЦикла;
КонецЦикла;

Примерно...естественно count i надо убрать и можно придумать получше...
...похоже все это на транспонирование матрицы...

Нельзя сначало строки надо подготоваить, пробывал сам посмотри отладчиком.
6. Ийон Тихий (cool.vlad4) 21.04.11 13:28
(5) В смысле строки надо сначала готовить?
Зы Ну и посмотрел отладчиком и что?
7. OldthiefXXX OldthiefXXX (OldthiefXXX) 21.04.11 13:47
cool.vlad4 пишет:
(5) В смысле строки надо сначала готовить?
Зы Ну и посмотрел отладчиком и что?

Если в ТЗ строк нету , то у меня почему то не может загрузить данные в колонку в новой ТЗ2
8. OldthiefXXX OldthiefXXX (OldthiefXXX) 21.04.11 13:48
Тоесть если стереть
Для каждого стр из Тз.Колонки Цикл
ТЗ2.Добавить();
КонецЦикла;
Тогда ничего не получиться
9. Александр Медведев (anig99) 21.04.11 14:16
Транспонирование, а не транспортировка.
10. Ийон Тихий (cool.vlad4) 21.04.11 15:41
Транспортировка таблицы значений это круто :D ...(8) Да, нет же стирать не надо просто код в этот же цикл и писать, и можно от лишнего цикла избавится...например так

Функция ПеревернутьТЗ(ТЗ)
ТЗ2 = Новый ТаблицаЗначений;
Массив=Тз.ВыгрузитьКолонку(Тз.Колонки[0]);
//Имена колонок, не советую так делать кстати
Для Каждого Значения ИЗ Массив ЦИКЛ
ЗН=ВРег(СокрЛП(Значения));
ТЗ2.Колонки.Добавить(Значения);
Конеццикла;
count = ТЗ2.Колонки.Количество();
Для каждого стр из Тз.Колонки Цикл
Строка = ТЗ2.Добавить();
СтрокаИсточник = Тз.ВыгрузитьКолонку(стр);
Для m=0 По count-1 Цикл
Строка[m]=СтрокаИсточник[m];
КонецЦикла;
КонецЦикла;
Возврат ТЗ2;
КонецФункции
11. Игорь Исхаков (Ish_2) 21.04.11 17:31
Скучновато.
Для разнообразия можно было привести
- вариант с запросом, преобразующим ТЗ как внешний источник.
- вариант с СКД , на вход которой подается объект ТЗ
asved.ru; +1 Ответить
12. OldthiefXXX OldthiefXXX (OldthiefXXX) 22.04.11 10:27
Можно былобы выгрузить значение строки в массив былобы круто.
типа ТЗ[0].ВыгрузитьЗначения() хехе ?
13. Александр Рытов (Арчибальд) 22.04.11 10:39
Мне в комментариях к Ликбез: транспонируем ТЗ
написали
КоличествоСтрок = ТЗ.КоличествоСтрок();
КоличествоКолонок = ТЗ.КоличествоКолонок();
РезТЗ = СоздатьОбъект("ТаблицаЗначений");
РезТЗ.КоличествоСтрок(КоличествоКолонок);
РезТЗ.КоличествоКолонок(КоличествоСтрок);
СЗ = СоздатьОбъект("СписокЗначений");
Для Колонка=1 По КоличествоКолонок Цикл
ТЗ.Выгрузить(СЗ,1,КоличествоСтрок,Строка(Колонка));
РезТЗ.Заполнить(СЗ,Колонка,Колонка);
КонецЦикла;
Коротко и ясно...
14. Ийон Тихий (cool.vlad4) 22.04.11 11:21
(13) :D да...и как это коротко и ясно сделать в восьмерке? и потом ему (0) - надо, чтобы первая колонка исходной ТЗ, являлась названием колонок результирующей ТЗ. Вообще задача настолько тривиальна, что даже не стоит замарачиватся на эту тему.
15. Владимир Чаклин (vec435) 03.02.12 11:41
Если добавить перед <возврат Тз> строки

нк=ТЗ2.Колонки.Добавить("поля");
Для СЧклнк=0 ПО Тз.Колонки.количество()-1 Цикл ТЗ2[СЧклнк].поля=Тз.Колонки[СЧклнк].имя; КонецЦикла;
ТЗ2.Колонки.сдвинуть(нк,-(ТЗ2.Колонки.Количество()-1));

увидим транспорированные заголоки исходной ТЗ
16. Александр (aet) 31.05.13 05:15
Если закомментить строчку
ЗН=ВРег(СокрЛП(Значения));
- функционал не изменится
17. Антон Стеклов (asved.ru) 31.05.13 05:38
А слабо сделать то же самое запросом, при этом отсортировать значения в строках?

Примерно так:

Номенклатура1 Ширина Длина Количество
Номенклатура2 Длина Ширина Количество
Номенклатура3 Длина Количество
Номенклатура4 Объем Количество

Необходимо получить таблицу:

Номенклатура1 Длина Количество Ширина
Номенклатура2 Длина Количество Ширина
Номенклатура3 Длина Количество
Номенклатура4 Количество Объем
18. OldthiefXXX OldthiefXXX (OldthiefXXX) 31.05.13 15:11
нет не далеко не слабо!!! хыхых
19. С К (kraynev-navi) 04.02.16 10:25
Еще один нюанс. Предложенный способ не подходит для количества строк больше 1000