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