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

09.06.10

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




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

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

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

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

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

 

См. также

Универсальные функции Программист Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    1371    14    user706545_kseg1971    0    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    2339    zhenyat    7    

8

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

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    5138    Zoltan_Black    11    

2

Универсальные функции Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13933    4    alsen    3    

5

Универсальные функции Программист Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10766    malovandrey    7    

19

Универсальные функции Работа с интерфейсом Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18887    2    HAMMER_59    6    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Denizzz 08.06.10 06:19 Сейчас в теме
Нюанс - значения колонки, указаные в параметре "Колонки" должны соответствовать требованиям для именования колонок (изв. за тавталогию). :D
2. brr 184 08.06.10 15:11 Сейчас в теме
   //создаем каркас сводной таблицы
   ТЗ_Результ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ_Результ.Загрузить(ТЗ_Строк);
   ТЗ_Колонок.ВыбратьСтроки();


здесь

ТЗ_Колонок.ВыбратьСтроки();
что делает?
Denizzz; 79044970523; +2 Ответить
3. 79044970523 934 09.06.10 05:51 Сейчас в теме
Спасибо за внимательность brr(2). Строка ТЗ_Колонок.ВыбратьСтроки(); оказалась лишней и была удалена.
4. Ёпрст 1065 09.06.10 08:34 Сейчас в теме
Не надо пользоваться Загрузить.. это гораздо медленнее, чем Выгрузить.
5. Ёпрст 1065 09.06.10 08:36 Сейчас в теме
+4 Не надо присоединять колонки к НЕ пустой ТЗ и потом удалять строки, нужно наоборот.

ЗЫ: ну и мини-пример работы функции просто необходим, а то влом смотреть сам код, чтоб понять, что нужно передать в параметры Строки/Колонки/Значения..
6. arithmometr 152 10.06.10 00:41 Сейчас в теме
После изучения алгоритма, делаем вывод: Строки,Колонки,Значения - идентификаторы 3-х колонок таблицы ТЗ.
Далее: сомнительная конструкция СокрЛП(Строка(ТЗ_Колонок.ПолучитьЗначение(Стр,Колонки)))
В общем случае получим строку с пробелами (недопустимо для идентификаторов колонок)
В идеальном случае, на выходе получим шахматку, если на входе ТЗ с тремя колонками.
Где приближение к Ексель?
Резюме: алгоритм несовершенен.
7. wing 28 28.09.10 05:20 Сейчас в теме
Попробовал адаптировать для работы с перечислением колонок и строк через:
списКолонокПараметр = СоздатьОбъект("СписокЗначений");
списКолонокПараметр.ИзСтрокиСРазделителями("""" + СтрЗаменить(Колонки, ",", """,""") + """");

Пришел к выводу, что логику формирования итоговой таблицы надо реализовывать с нуля, т.е. согласен с (6).
Оставьте свое сообщение