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

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;	
КонецФункции  

См. также

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

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

21.05.2024    20129    dimanich70    81    

144

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

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

1 стартмани

18.03.2024    4091    3    John_d    11    

57

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

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

12.02.2024    18065    atdonya    24    

56

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

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

30.11.2023    5502    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    14734    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3581    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. v.l. 435 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 2852 21.04.11 12:47 Сейчас в теме
(2) поворот таблицы на 90 градусов и есть транспонирование. Транспонирование матрицы - частный случай.
4. cool.vlad4 2 21.04.11 12:52 Сейчас в теме
(3) да, я знаю, просто намекнул, что переворот как-то не звучит, а транспонирование сразу ясно.
5. OldthiefXXX 154 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 154 21.04.11 13:47 Сейчас в теме
cool.vlad4 пишет:
(5) В смысле строки надо сначала готовить?
Зы Ну и посмотрел отладчиком и что?

Если в ТЗ строк нету , то у меня почему то не может загрузить данные в колонку в новой ТЗ2
8. OldthiefXXX 154 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 2852 21.04.11 14:16 Сейчас в теме
Транспонирование, а не транспортировка.
11. Ish_2 1112 21.04.11 17:31 Сейчас в теме
Скучновато.
Для разнообразия можно было привести
- вариант с запросом, преобразующим ТЗ как внешний источник.
- вариант с СКД , на вход которой подается объект ТЗ
orfos; asved.ru; +2 Ответить
12. OldthiefXXX 154 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 54 31.05.13 05:15 Сейчас в теме
Если закомментить строчку
ЗН=ВРег(СокрЛП(Значения));
- функционал не изменится
17. asved.ru 36 31.05.13 05:38 Сейчас в теме
А слабо сделать то же самое запросом, при этом отсортировать значения в строках?

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

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

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

Номенклатура1 Длина Количество Ширина
Номенклатура2 Длина Количество Ширина
Номенклатура3 Длина Количество
Номенклатура4 Количество Объем
18. OldthiefXXX 154 31.05.13 15:11 Сейчас в теме
нет не далеко не слабо!!! хыхых
19. kraynev-navi 681 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;
	
КонецФункции
Показать
klaus38; Maxanamoon; +2 Ответить
21. bprogs 277 16.09.23 11:29 Сейчас в теме
Переворот таблицы свойств в горизонтальный после запроса из базы
&НаСервере
Функция ПеревернутьТаблицуСвойств(ТаблицаСвойств)

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

Показать
Оставьте свое сообщение