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

21.04.11

Разработка - Универсальные функции

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

Исходная таблица:
Индекс    Колонка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;	
КонецФункции  

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4506    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    8321    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    55430    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7884    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    69954    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9862    ke.92@mail.ru    17    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Возврат ТЗ2;
	
КонецФункции
Показать
jollyk; klaus38; Maxanamoon; +3 Ответить
21. bprogs 2 16.09.23 11:29 Сейчас в теме
Переворот таблицы свойств в горизонтальный после запроса из базы
&НаСервере
Функция ПеревернутьТаблицуСвойств(ТаблицаСвойств)

	тзСписокСвойств =  ТаблицаСвойств.Скопировать(); 
	тзСписокСвойств.Свернуть("Свойство");
	мСписокСвойств = тзСписокСвойств.ВыгрузитьКолонку("Свойство");
	тзСписокЗначений =  ТаблицаСвойств.Скопировать(); 
	тзСписокЗначений.Свернуть("Значение");
	мСписокЗначений = тзСписокЗначений.ВыгрузитьКолонку("Значение");
	ЗаполняемаяТаблица = ТаблицаСвойств.Скопировать();
	ЗаполняемаяТаблица.Свернуть("Номенклатура,Артикул,Код,Наименование");
	мТипСвойства = Новый Массив;
	мТипСвойства.Добавить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"));
	ОписаниеТиповСвойств = Новый ОписаниеТипов(мТипСвойства);
	Для каждого свойствоИзСписка Из мСписокСвойств Цикл    
		Если ЗначениеЗаполнено(свойствоИзСписка.ИдентификаторДляФормул) Тогда
			     ЗаполняемаяТаблица.Колонки.Добавить(свойствоИзСписка.ИдентификаторДляФормул,Новый ОписаниеТипов(ОписаниеТиповСвойств));
		КонецЕсли;
	КонецЦикла; 
	Для каждого строкаТаблицыЗ Из ЗаполняемаяТаблица Цикл
	Для каждого Товар Из ТаблицаСвойств Цикл
		Если строкаТаблицыЗ.Номенклатура = Товар.Номенклатура Тогда     
			Для каждого СтрТекущаяКолонка Из ЗаполняемаяТаблица.Колонки Цикл
			Если Товар.Свойство.ИдентификаторДляФормул = СтрТекущаяКолонка.Имя Тогда
				строкаТаблицыЗ[СтрТекущаяКолонка.Имя] =  Товар.Значение;
			КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	КонецЦикла;
    Возврат ЗаполняемаяТаблица;
КонецФункции

Показать
Для отправки сообщения требуется регистрация/авторизация