Свертка таблицы значений. С блэкджеком и всем остальным

Публикация № 723744

Программирование - Практика программирования

ТЗ свертка группировка ТаблицаЗначений таблица значений

5
Функция свертки таблицы значений. Умеет в отличие от стандартного метода все, что можно делать на языке запросов.

Не раз приходилось сворачивать таблицу значений нестандартным образом. 

И вот однажды, устав от разных методов и извращений написал свою функцию с блэкджеком и куртизанками.

Все остальное, думаю, понятно из текста функции.

// ТаблицаЗначений - тз, которую нужно свернуть
// СтолбцыГруппировки - Cтрока. Список имен столбцов для группировки результата. Разделитель ','
// СтолбцыСвертки - Cтрока. Список имен столбцов для свертки и расчета итогов. Разделитель ','
// ФункцияСвертки = Строка. Возможные значения в тексте функции. Для 'Количества различных' можно писать любой бред:)
Функция СвернутьТаблицуЗначений(ТаблицаЗначений, Знач СтолбцыГруппировки, Знач СтолбцыСвертки, ФункцияСвертки)
	
	Если нРег(ФункцияСвертки) = "сумма" Тогда
		ДействиеСвертки = "СУММА(";
	ИначеЕсли нРег(ФункцияСвертки) = "минимум" Тогда
		ДействиеСвертки = "МИНИМУМ(";
	ИначеЕсли нРег(ФункцияСвертки) = "максимум" Тогда
		ДействиеСвертки = "МАКСИМУМ(";
	ИначеЕсли нРег(ФункцияСвертки) = "количество" Тогда
		ДействиеСвертки = "КОЛИЧЕСТВО(";		
	ИначеЕсли нРег(ФункцияСвертки) = "среднее" Тогда
		ДействиеСвертки = "СРЕДНЕЕ(";
	Иначе 
		ДействиеСвертки = "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ";
	КонецЕсли;	
	мСвертки = Новый Массив;
	СтолбцыСвертки = СтрЗаменить(СтолбцыСвертки,",",Символы.ПС);
	Для сч = 1 По СтрЧислоСтрок(СтолбцыСвертки) Цикл
		мСвертки.Добавить(СокрЛП(СтрПолучитьСтроку(СтолбцыСвертки,сч)));	
	КонецЦикла;
	
	мГруппировки = Новый Массив;
	СтолбцыГруппировки = СтрЗаменить(СтолбцыГруппировки,",",Символы.ПС);
	Для сч = 1 По СтрЧислоСтрок(СтолбцыГруппировки) Цикл
		мГруппировки.Добавить(СокрЛП(СтрПолучитьСтроку(СтолбцыГруппировки,сч)));	
	КонецЦикла;	
		
	Запрос = Новый Запрос;
	
	ТекстЗапроса = "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ Из &ВТ КАК ВТаб ; ВЫБРАТЬ "; 
	
	ТекстГруппировки = "";
	
	Для Каждого Элемент Из мГруппировки Цикл
		ТекстГруппировки = ТекстГруппировки + ?(мГруппировки.Найти(Элемент) = 0,"",",") + "ВТ." + Элемент + " ";
	КонецЦикла;
	
	ТекстЗапроса = ТекстЗапроса + ТекстГруппировки;
	
	Для Каждого Элемент Из мСвертки Цикл
		ТекстЗапроса = ТекстЗапроса + "," + ДействиеСвертки +  "ВТ." + Элемент + ") ";
	КонецЦикла;
	
	ТекстЗапроса = ТекстЗапроса + " ИЗ ВТ КАК ВТ СГРУППИРОВАТЬ ПО " + ТекстГруппировки;
	
	Запрос.Текст = ТекстЗапроса;
	Запрос.Параметры.Вставить("ВТ",ТаблицаЗначений);
	
	Возврат  Запрос.Выполнить().Выгрузить();
	
КонецФункции

Так как правилами запрещено выкладывать только код с комментариями, создал маленькую демку для УФ и приложил. Качать, как Вы понимаете, совершенно не обязательно. Но если кто-то хочет разобраться и иметь шаблон для произвольной свертки произвольных таблиц значений - качайте на здоровье:)

Обработка тестировалось на платформе 8.3.8.1681 в режиме совместимости с 8.3.7.

Все. Всем хороших разработок.

5

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

Наименование Файл Версия Размер
ДемоОбработка
.epf 11,28Kb
22.01.18
2
.epf 1.1 11,28Kb 2 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Armando 1388 22.01.18 22:52 Сейчас в теме
ВЫБРАТЬ * ПОМЕСТИТЬ ВТ Из &ВТ

Дороговатый метод
5. dusha0020 879 23.01.18 10:39 Сейчас в теме
(1) Согласен. В (3) выборка усечена. И так лучше.
(2) Не знаю. Нужно сделать вариант через СКД и сравнить. Может и попробую.
2. Armando 1388 22.01.18 23:50 Сейчас в теме
Через СКД не лучше будет?
3. mszsuz 79 23.01.18 09:16 Сейчас в теме
Извините, не удержался )
Функция СвернутьЗапросом(ТаблицаЗначений, Знач КолонкиГруппировок, Знач КолонкиСуммирования, Ф="СУММА") Экспорт
	
	Ф = ВРег(Ф) + "(";
	Если СтрНайти("СУММА(,МИНИМУМ(,МАКСИМУМ(,КОЛИЧЕСТВО(,СРЕДНЕЕ(", Ф) = 0 Тогда
		Ф = "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ";
	КонецЕсли;
	
	Запрос = Новый Запрос(СтрШаблон("
	|ВЫБРАТЬ
	|	%1
	|ПОМЕСТИТЬ ВТ Из &ТЗ КАК ТЗ
	|;
	|ВЫБРАТЬ
	|	%2
	|ИЗ ВТ КАК ВТ 
	|СГРУППИРОВАТЬ ПО 
	|	%3",
	КолонкиГруппировок + "," + КолонкиСуммирования, // %1
	КолонкиГруппировок + "," + Ф + СтрЗаменить(КолонкиСуммирования, ",", "), " + Ф) + ")", // %2
	КолонкиГруппировок)); // %3
	
	Запрос.Параметры.Вставить("ТЗ", ТаблицаЗначений);
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции
Показать
amatoravg; DarkUser; dusha0020; +3 Ответить
4. dusha0020 879 23.01.18 10:31 Сейчас в теме
(3) Извиняю и снимаю шляпу:) Компактно получилось. Так намного круче!
6. VmvLer 23.01.18 10:47 Сейчас в теме
%1, %2 уже есть в 8.3. метод глобального контекста вроде СтрШаблон(...)

который поддерживает 9 параметров замены, т.е. код замены шаблонов строк подобно...

СтрЗаменить(КолонкиСуммирования, ",", "), " + Ф) + ")", // %2

уже не актуален
8. dusha0020 879 23.01.18 11:02 Сейчас в теме
(6) Я вообще-то считаю, что универсальные функции должны иметь глубокую совместимость. Например те же СтрШаблон и СтрНайти с 8.3.6 кажется работают.
Но все равно очень понравилось решение в (3). А, кстати, что за
есть в 8.3. метод глобального контекста вроде СтрШаблон(...)
?
Я далеко не всезнайка. И стало любопытно.
9. mszsuz 79 23.01.18 12:20 Сейчас в теме
(6) Так там и так СтрШаблон(), посмотрите внимательнее
7. МихаилМ 23.01.18 10:58 Сейчас в теме
(0)
использовать в продакшене вычисления на субд - моветон. тк уложняется управление производительностью.

в 1с есть класс анализ данных

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

либо можно скд. но скд медленно выводит данные в тз.
Оставьте свое сообщение