Каталог решений - ТаблицаЗначений в виде сводной таблицы

ТаблицаЗначений в виде сводной таблицы

ТаблицаЗначений в виде сводной таблицы

В наличии

Зарегистрирован: 15 апр 2009, 07:58
Сообщений: 26  

Очень часто приходилось преобразовывать ТаблицуЗначений в вид, наподобие Сводной таблицы в Excel (типа шахматки).
Для себя написал функцию, которая этим как раз и занимается. Возможно кому-то и пригодится.

Категория:

Описание

///////////////////////////////////////////////////////////////////////
// ТЗ — обрабатываемая таблица                                       //
// Строки — Колонка для представления ее значений в виде строк       //
// Колонки — Колонка для представления ее значений в виде столбцов   //
// Значения — Колонка, вычисляемая на пересечении строк и столбцов   //
///////////////////////////////////////////////////////////////////////
//Функция преобразует таблицу значений подобно функции в Экселе      //
///////////////////////////////////////////////////////////////////////

Функция СводнаяТаблицаЗначений(ТЗ,Строки,Колонки,Значения);
   
   Колонки=СокрЛП(Колонки);
   
   //формируем таблицу с колонкой "строк" и "значений"
   ТЗ_Строк=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Строк.Загрузить(ТЗ);
   ТЗ_Строк.Свернуть(Строки,Значения);
   
   //формируем таблицу с колонкой "столбцов" и "значений"
   ТЗ_Колонок=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Колонок.Загрузить(ТЗ);
   ТЗ_Колонок.Свернуть(Колонки,Значения);
   ТЗ_Колонок.Сортировать(Колонки);
   
   //создаем каркас сводной таблицы
   ТЗ_Результ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Результ.Загрузить(ТЗ_Строк);
   ЗначенияГруппировки="";
   Для Стр=1 по ТЗ_Колонок.КоличествоСтрок() Цикл     
      ТЗ_Результ.НоваяКолонка(СокрЛП(Строка(ТЗ_Колонок.ПолучитьЗначение(Стр,Колонки))),"Число");
      ЗначенияГруппировки=ЗначенияГруппировки+СокрЛП(Строка(ТЗ_Колонок.ПолучитьЗначение(Стр,Колонки)))+",";
   КонецЦикла;
   ТЗ_Результ.УдалитьСтроки();

   //заполняем данными          
   ТЗ_Данные=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Данные.Загрузить(ТЗ);
   Для Н=1 по ТЗ_Данные.КоличествоСтрок() Цикл
      ТЗ_Результ.НоваяСтрока();
      ТЗ_Результ.УстановитьЗначение(Н,Строки,ТЗ_Данные.ПолучитьЗначение(Н,Строки));
      ТЗ_Результ.УстановитьЗначение(Н,СокрЛП(ТЗ_Данные.ПолучитьЗначение(Н,Колонки)),ТЗ_Данные.ПолучитьЗначение(Н,Значения));
   КонецЦикла;
   
   //Формируем итоговую колонку с суммами по строке
   ТЗ_Результ.НоваяКолонка("Всего","Число");
   Для Стр=1 по ТЗ_Результ.КоличествоСтрок() Цикл
      Для Н=2 по ТЗ_Результ.КоличествоКолонок() Цикл
         Всего=Всего+ТЗ_Результ.ПолучитьЗначение(Стр,Н);
      КонецЦикла; 
      ТЗ_Результ.УстановитьЗначение(Стр,"Всего",Всего);
      Всего=0;
   КонецЦикла;         
   ТЗ_Результ.Свернуть(Строки,ЗначенияГруппировки+"Всего");
   
   Возврат ТЗ_Результ;
КонецФункции
///////////////////////////////////////////////////////////////////////

 

has been added to your cart:
Оформление заказа