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