Еще один (:-)) простейший алгоритм определения итогов по группировкам для произвольных таблиц значений.

16.01.09

Разработка - Математика и алгоритмы

Простой и быстрый алгоритм получения итогов по произвольному числу группировок таблицы значений.
Еще один (:-)) простейший алгоритм определения итогов по группировкам для произвольных таблиц значений.

Обозначенная выше задача, увы, не блещет оригинальностью – с подобной задачей рано или поздно сталкивается любой 1С-ник, более того даже на данном сайте можно найти не менее десятка вариантов решения указанной проблемы. Тем не менее какого-либо общего, всеми признанного по красоте и скорости решения данной задачи нет до сих пор (если, конечно, не говорить об использовании внешних компонент). Поэтому автор не считает зазорным оказаться в длинной очереди изобретателей жаждущих зарегистрировать свое рацпредложение :-).
Приведу суть алгоритма на простейшем примере. Допустим, что мы имеем таблицу значений с нечисловыми колонками "А", "Б", "В" и "Г" и некоторым количеством числовых колонок, пусть это будут колонки "Сумма1", "Сумма2", "Сумма3" (считаем, что порядок колонок в ТЗ соответствует порядку их перечисления, для рассматриваемого алгоритма этот порядок важен. Кроме того крайне желательно, чтобы колонки были типизированы). Будем считать, что перед нами стоит задача определения итоговых сумм числовых колонок по группировкам "А" и "Б" соответственно.
Добавим в уже существующую таблицу колонку "Уровень":

ТЗ.НоваяКолонка("Уровень","Число",9,0);

Будем считать, что данные необработанной таблицы соответствуют третьему уровню, тогда как данные группировок – уровням 1 и 2.

ТЗ.Заполнить(3,,, "Уровень");

Создадим копию имеющейся таблицы:
ТЗДоп = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗДоп);

Если скорость выполнения задачи критична, можно скопировать ТЗ с помощью команды Заполнить.
Определим дополнительные строки ТЗ, которые соответствуют второму уровню, для этого свернем ТЗДоп:

ТЗДоп.Свернуть("А,Б","Сумма1,Сумма2,Сумма3");
Поскольку при свертке ТЗДоп колонка "Уровень" была уничтожена добавим ее:

ТЗДоп.НоваяКолонка("Уровень", "Число", 9,0);
Получили результаты второго уровня:

ТЗДоп.Заполнить(2,,, "Уровень");

Добавим полученные результаты к первоначальной ТЗ следующим образом:
ВсегоСтрокВТЗ = ТЗ.КоличествоСтрок();
ВсегоСтрокВТЗДоп = ТЗДоп.КоличествоСтрок();

ТЗ.КоличествоСтрок(ВсегоСтрокВТЗ + ВсегоСтрокВТЗДоп);
ТЗ.Заполнить(ТЗДоп,(ВсегоСтрокВТЗ + 1), (ВсегоСтрокВТЗ + ВсегоСтрокВТЗДоп), "А,Б,Сумма1,Сумма2,Сумма3,Уровень");

Здесь необходимо заметить, что порядок колонок в операторе Заполнить должен совпадать с порядком колонок в ТЗДоп, в противном случае результат окажется некорректен.

То же самое проделаем для определения группировок первого уровня:
ТЗДоп.Свернуть("А", "Сумма1,Сумма2,Сумма3");
ТЗДоп.НоваяКолонка("Уровень", "Число", 9, 0);
ТЗДоп.Заполнить(1,,,"Уровень");

ВсегоСтрокВТЗ = ТЗ.КоличествоСтрок();
ВсегоСтрокВТЗДоп = ТЗДоп.КоличествоСтрок();

ТЗ.КоличествоСтрок(ВсегоСтрокВТЗ + ВсегоСтрокВТЗДоп);
ТЗ.Заполнить(ТЗДоп,(ВсегоСтрокВТЗ + 1), (ВсегоСтрокВТЗ + ВсегоСтрокВТЗДоп), "А,Сумма1,Сумма2,Сумма3,Уровень")

Наконец, для определения окончательного результата достаточно отсортировать полученную ТЗ:
ТЗ.Сортировать("*А,*Б,Уровень");

Замечу, что сортировка по внутренним представлениям включена для того, чтобы система не путала различные элементы с одинаковыми наименованиями. В этом и заключается самый главный недостаток предложенного метода – для сортировки по наименованиям сформированную ТЗ надо будет еще обрабатывать, если же сортировка ТЗ не является критичной или же можно отсортировать сразу по наименованию без вероятности перепутывания элементов то результат, полученный на этом шаге готов к дальнейшему использованию.

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1886    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4687    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7683    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7951    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

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

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4560    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8956    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7992    dusha0020    8    

70
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vcv 89 14.06.07 06:30 Сейчас в теме
Сортировать можно по спец. колонкам для сортировки, которые в цикле заполнить значениями:
- для документа - позицией
- для справочника - полным наименованием или полным кодом
- для всего прочего - строковым представлением.
+
2. JohnyDeath 301 14.06.07 10:17 Сейчас в теме
Такие вот разработки - это, конечно, хорошо с одной стороны: мол, автор не поленился и т.п. НО! Зачем? Боязнь ВК? В 1с++ это реализуется в одну строку: http://www.1cpp.ru/docum/html/IndexedTable.html#group
support; +1
3. Strange Device 307 14.06.07 11:00 Сейчас в теме
Все просто, описанный алгоритм был придуман года три назад, когда в 1С++ не было возможности работать без регистрации dll в системе, а регистрация этих самых dll на нашем серваке по какой-то неясной причине постоянно сбивалась :-(. Поэтому стоял вопрос либо сидеть и ежедневно руками регистрить dll на сотню пользователей либо написать самому, при этом написать так чтобы работало по возможности быстро. Эта задача и была решена. При этом была написана маленькая процедура (около сотни строк), производящая описанные действия в общем виде. Учитывая же тот факт, что для вызова описанной процедуры было достаточно написать одну единственную строку это не слишком отличалось от вызова внешних компонент.
Что касается сортировок - я не сказал, что это очень трудно, сказанное мной означало лишь то, что для построения сортировки, скажем, по алфавиту необходим, как минимум еще один проход по ТЗ, что несколько замедляет достаточно быстрый алгоритм.
support; +1
4. zalst 224 14.06.07 17:08 Сейчас в теме
1c++ не всегда приемлема!
автору респект за идею, очень интересно почитать :)
+
5. Вадимко 214 23.06.07 02:02 Сейчас в теме
Время позднее, с трудом осиливаю... кажецо идея не нова? :)
В любом случае интересно, плюсанул
JohnyDeath, не ворчи :)
+
6. support 4485 12.07.07 10:26 Сейчас в теме
за аватар пять с плюсом :)
+
7. karat60 01.10.07 12:32 Сейчас в теме
Оставьте свое сообщение