gifts2017

Ликбез: транспонируем таблицу значений 7.7.

Опубликовал Александр Рытов (Арчибальд) в раздел Программирование - Практика программирования

Меняем "вдоль" на "поперек"

Нередко при проектировании формата отчета требуется выводить по строкам то, что вычислено по столбцам - или наоборот. Маленький отчетик (обработочка) в этом поможет.

//_____________________________________________________________________________
// //Обращаться к отчету надо так:
// ПараметрОтчета = СоздатьОбъект("СписокЗначений")
// ПараметрОтчета.Установить("ТабЗнач",ТранспонируемаяТаблица);
// ОткрытьФормуМодально("Отчет",ПараметрОтчета,ПутьКФайлуОтчета);
// РезТаблица = ПараметрОтчета.Получить.("Результат");

// // Было: Полусить результату, однако Smile А  - зануда Cool
// //Первая колонка результирующей ТЗ будет содержать имена колонок исходной ТЗ
//_____________________________________________________________________________

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

Наименование Файл Версия Размер
Transpon.ert 52
.ert 44,50Kb
28.01.10
52
.ert 44,50Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. script Мальчинко (script) 28.01.10 12:17
ПараметрОтчета.Полусить.("Результат");
Работать не будет, поточу что 1С китайский еще не понимает. :D
Арчибальд; +1 Ответить
2. Михаил Ражиков (tango) 28.01.10 12:21
Арчи, блин... :D
полусите минуса позалуста
Арчибальд; +1 Ответить 1
3. Александр Рытов (Арчибальд) 28.01.10 12:24
4. Владислав Чинючин (vcv) 28.01.10 15:15
Выполнять ПолучитьЗначение/УстановитьЗначение Ширина*Высота раз как-то не слишком быстро.
Может быть быстрее будет транспонировать где-то так:
КоличествоСтрок = ТЗ.КоличествоСтрок();
КоличествоКолонок = ТЗ.КоличествоКолонок();
РезТЗ = СоздатьОбъект("ТаблицаЗначений");
РезТЗ.КоличествоСтрок(КоличествоКолонок);
РезТЗ.КоличествоКолонок(КоличествоСтрок);
СЗ = СоздатьОбъект("СписокЗначений");
Для Колонка=1 По КоличествоКолонок Цикл
    ТЗ.Выгрузить(СЗ,1,КоличествоСтрок,Строка(Колонка));
    РезТЗ.Заполнить(СЗ,Колонка,Колонка);
КонецЦикла;
...Показать Скрыть
Арчибальд; JohnyDeath; +2 Ответить 1
5. Александр Рытов (Арчибальд) 29.01.10 08:30
(4) От того, что в Выгрузить и Заполнить нет слова "Цикл", они циклами быть не перестают. Впрочем, Выгрузить можно резко ускорить через внутреннее представление ТЗ и СЗ - это будет просто выделение подстроки...
6. Владислав Чинючин (vcv) 29.01.10 08:39
(5) Быстродействие признаться не мерил, поэтому и написал "может быть". Но обычно цикл на языке 1С отрабатывает медленнее, чем цикл где-то в потрохах "Выгрузить" или "Заполнить". Ну и большое количество обращений через "точку" к функциям ПолучитьЗначение/УстановитьЗначение требует времени, особенно в отсутствие функционала turbobl.
Но это все лирика, пока нет конкретных замеров производительности, пусть кому надо, тот и меряет.
А может быть это вообще неважно. Я как то слабо представляю, зачем может потребоваться транспонировать таблицу с сотней (и более) строк.
7. Александр Рытов (Арчибальд) 29.01.10 09:02
(6) На месте 1С я бы как раз выгрузку реализовывал ускоренно, через подстроку. А вот заполнение из-за многовариантности (заполнение тучи строк, тучи столбцов, из разнообразных источников), скорее всего, реализовано через те же циклы.
А насчет потребности в транспонировании - это реально бывает нужно для разнообразных отчетов с неизвестным количеством столбцов с "дырками". Метод ПрисоединитьСекцию не очень удобен.
8. Юрий Тимофеев (Tatitutu) 29.01.10 10:22
На заметку (в МS EXCEL) это реализовано:

можно скопировать таблицу, выбрать новую ячейку (куда поместить новую результирующую таблицу)
меню-правка-специальная вставка - ставим галочку "Транспортировать" и радуемся результату.
9. Александр Рытов (Арчибальд) 29.01.10 10:43
(8) Про Ексель я помню, хотелось все штатно. Я реально эту штучку использую, когда нужно найти конкретный косяк в базе, и приходится делать одноразовый отчетик по какому-либо "кудрявому" запросу.