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

22.01.18

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
ДемоОбработка
.epf 11,28Kb ver:1.1
2 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4589    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8527    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    56266    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7935    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    70706    atdonya    31    

72

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

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9928    ke.92@mail.ru    17    

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

Дороговатый метод
5. dusha0020 1125 23.01.18 10:39 Сейчас в теме
(1) Согласен. В (3) выборка усечена. И так лучше.
(2) Не знаю. Нужно сделать вариант через СКД и сравнить. Может и попробую.
2. Armando 1402 22.01.18 23:50 Сейчас в теме
Через СКД не лучше будет?
3. mszsuz 346 23.01.18 09:16 Сейчас в теме
Извините, не удержался )
Функция СвернутьЗапросом(ТаблицаЗначений, Знач КолонкиГруппировок, Знач КолонкиСуммирования, Ф="СУММА") Экспорт
	
	Ф = ВРег(Ф) + "(";
	Если СтрНайти("СУММА(,МИНИМУМ(,МАКСИМУМ(,КОЛИЧЕСТВО(,СРЕДНЕЕ(", Ф) = 0 Тогда
		Ф = "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ";
	КонецЕсли;
	
	Запрос = Новый Запрос(СтрШаблон("
	|ВЫБРАТЬ
	|	%1
	|ПОМЕСТИТЬ ВТ Из &ТЗ КАК ТЗ
	|;
	|ВЫБРАТЬ
	|	%2
	|ИЗ ВТ КАК ВТ 
	|СГРУППИРОВАТЬ ПО 
	|	%3",
	КолонкиГруппировок + "," + КолонкиСуммирования, // %1
	КолонкиГруппировок + "," + Ф + СтрЗаменить(КолонкиСуммирования, ",", "), " + Ф) + ")", // %2
	КолонкиГруппировок)); // %3
	
	Запрос.Параметры.Вставить("ТЗ", ТаблицаЗначений);
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции
Показать
user635629_exter; Светлый ум; Andrey_Timofeev; Somebody1; 7OH; wolfsoft; michmich; amatoravg; DarkUser; dusha0020; +10 Ответить
4. dusha0020 1125 23.01.18 10:31 Сейчас в теме
(3) Извиняю и снимаю шляпу:) Компактно получилось. Так намного круче!
11. 7OH 70 04.11.20 17:53 Сейчас в теме
(3) Спасибо, именно так где-то и ожидал от платформы (по аналогии с Сортировать("Поле Возр")).
Себе сделал так, чтобы можно было каждую колонку по своему:

Функция СвернутьЗапросом(ТаблицаЗначений, Знач КолонкиГруппировок, Знач КолонкиСуммирования) Экспорт
    
    ВсеКолонки = "";
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		ВсеКолонки = ВсеКолонки + ?(ВсеКолонки = "", "", ",") + Колонка.Имя;
	КонецЦикла;
    
    Запрос = Новый Запрос(СтрШаблон("
		    |ВЫБРАТЬ
		    |    %1
		    |ПОМЕСТИТЬ ВТ Из &ТЗ КАК ТЗ
		    |;
		    |ВЫБРАТЬ
		    |    %2
		    |ИЗ ВТ КАК ВТ 
		    |СГРУППИРОВАТЬ ПО 
		    |    %3",
		ВсеКолонки, //%1
    	КолонкиГруппировок + "," + КолонкиСуммирования, // %2
    	КолонкиГруппировок)
	); // %3
    
    Запрос.Параметры.Вставить("ТЗ", ТаблицаЗначений);
    
    Возврат Запрос.Выполнить().Выгрузить();
    
КонецФункции

СвернутьЗапросом(НашаТаблица	, "Сотрудник", "Минимум(ДатаГод) КАК ДатаГодМин, Максимум(ДатаГод) КАК ДатаГодМакс");
Показать
user635629_exter; +1 Ответить
6. VmvLer 23.01.18 10:47 Сейчас в теме
%1, %2 уже есть в 8.3. метод глобального контекста вроде СтрШаблон(...)

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

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

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

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

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

либо можно скд. но скд медленно выводит данные в тз.
Для отправки сообщения требуется регистрация/авторизация