Возврат к списку

Фирма «1С» анонсировала группирующие наборы в языке запросов

05.07.2019     

Фирма «1С» анонсировала обновление в языке запросов, реализовав поддержку GROUPING SETS. Новая возможность появится в платформе «1С:Предприятие», начиная с версии 8.3.16.

Чем хорош GROUPING SETS

Конструкция GROUPING SETS предназначена для группировки по нескольким группам за одно сканирование таблицы, другими словами она эквивалентна конструкции ОБЪЕДИНИТЬ ВСЕ с запросами с СГРУППИРОВАТЬ ПО для указанных групп. Поля списка выборки, не попадающие в текущую группу, заменяются на NULL.

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

Как это будет работать

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

 

Содержимое регистра и результат запроса

 

«С использованием GROUPING SETS этот запрос можно написать гораздо изящнее», – поясняют разработчики.

 

ВЫБРАТЬ

 РегистрСведенийШтатноеРасписание.Отдел КАК Отдел,

 РегистрСведенийШтатноеРасписание.Должность КАК Должность,

 РегистрСведенийШтатноеРасписание.Руководитель КАК Руководитель,

 СУММА(РегистрСведенийШтатноеРасписание.Зарплата) КАК Зарплата

ИЗ

 РегистрСведений.ШтатноеРасписание КАК РегистрСведенийШтатноеРасписание СГРУППИРОВАТЬ ПО ГРУППИРУЮЩИМ НАБОРАМ

( 

( РегистрСведенийШтатноеРасписание.Отдел,

 РегистрСведенийШтатноеРасписание.Должность,

 РегистрСведенийШтатноеРасписание.Руководитель),

( РегистрСведенийШтатноеРасписание.Отдел,

 РегистрСведенийШтатноеРасписание.Должность), 

( РегистрСведенийШтатноеРасписание.Должность,

 РегистрСведенийШтатноеРасписание.Руководитель)

)

 

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

Подробное описание новой функциональности


Автор:
Елена Черепнева Обозреватель


Комментарии
Избранное Подписка Сортировка: Древо
1. w.r. 317 05.07.19 11:24 Сейчас в теме
Ждем. Запрос конечно сократится в разы и это не может не радовать. Учитывая какие они монструозные в 1С
2. s_vidyakin 60 05.07.19 11:25 Сейчас в теме
Зачем тут копипаста с зазеркалья? Лучше бы статью написали где пригодится. А то мы всем отделом пытались придумать кейсы использования, ничего не получилось. Догадываюсь что в ЗУПе пригодится, но это не точно, я с ним не работал
Можно было много других нужных фич добавить в язык, но почему-то добавили эту
Jeka44; AlexK_2012; Brawler; RomaM; mark_oilbass; omut; PowerBoy; nytlenc; yku; TMV; igo1; CyberCerber; A_Max; Sonick; frkbvfnjh; newdigger; boln; dimisa; +18 Ответить
3. s22 20 05.07.19 11:28 Сейчас в теме
Вообще не ясен смысл данного.
PowerBoy; rozer; CyberCerber; +3 Ответить
26. zhichkin 487 05.07.19 17:20 Сейчас в теме
(3)
(23)
А в ДБ2, Постгре 8.0, Оракле 10 и т д это будет работать нормально?

Согласен, у большой компании, взявшей на себя обязательства поддерживать большое количество СУБД, есть свои ограничения.
Уверен во всех этих СУБД есть свои аналоги оконных функций. Они были утверждены стандартом ANSI SQL 2003.
И да, Вы ещё забыли файловую СУБД 1С упомянуть - это, наверное, самая большая проблема.
4. zhichkin 487 05.07.19 11:45 Сейчас в теме
Если я не ошибаюсь эта возможность появилась в SQL Server 2008 ... 11 лет прошло.
Интересно когда 1С реализует, например, оконные функции в запросах ?
Ну или обобщённые табличные выражения для выполнения рекурсивных запросов для работы с иерархическими структурами ?
Эти две возможности также появились ещё в SQL Server 2008 и были развиты в SQL Server 2012 ...
И вообще почему не сообщество решает какие функции нужно реализовывать в платформе в первую очередь ?
memb3r; SerVer1C; nnn123; nytlenc; +4 Ответить
13. sergathome 05.07.19 13:23 Сейчас в теме
(4) Главное - платформа не является отдельным продуктом.
23. s22 20 05.07.19 15:41 Сейчас в теме
(4)
Интересно когда 1С реализует, например, оконные функции в запросах ?

А в ДБ2, Постгре 8.0, Оракле 10 и т д это будет работать нормально?
Дмитрий74Чел; +1 Ответить
27. nytlenc 273 05.07.19 18:20 Сейчас в теме
(4) потому что 1С плевать хотела на сообщество.
5. rusmil 148 05.07.19 11:51 Сейчас в теме
Что-то я не понял, а какой тогда будет запрос без использования группирующих наборов?
6. palsergeich 05.07.19 11:52 Сейчас в теме
(5)
появилась в SQL Server 2008 ... 11 лет прошло.
Интересно когда 1С реализует, например, оконные функции в запросах ?
Ну или обобщённые табличные выражения для выполнения рекурсивных запросов для работы с иерархическими структурами ?
Эти две возможности также появились ещё в SQL Server 2008 и были развиты в SQL Server 2012 ...
И вообще почему не сообщество решает какие функции нужно реализовывать в платформе в первую очередь ?
+ – Ответить
5. rusmil 147 05.07.19 11:51
Что-то я не понял, а какой тогда будет запрос

https://wonderland.v8.1c.ru/blog/podderzhka-grouping-sets-v-yazyke-zaprosov/ Смотри тут
31. AntonNV 06.07.19 12:50 Сейчас в теме
(6) Смысл понятен, но в статье у старого запроса один порядок вывода у нового - другой. Надо поменять.
Прикрепленные файлы:
32. s22 20 06.07.19 13:57 Сейчас в теме
(6) c# не быстрее Явы. Раньше точно, сейчас не знаю разбор C# в студии был написан чуть ли не на с++ с вставками ассемблера
(31)
(6) Смысл понятен, но в статье у старого запроса один порядок вывода у нового - другой. Надо поменять.

возможно он не предопределен
39. Darklight 18 08.07.19 11:59 Сейчас в теме
(32)Сортировки в запросе нет - так что порядок не определён, правда интересно как отработает сортировка - но думаю ожидаемо - ведь эта операция будет выполнена после группировки
38. Darklight 18 08.07.19 11:53 Сейчас в теме
(5)В новости ссылка есть на оригинальную статью, там запрос указан - а тоут вырезали самое важное. Но даже в оригинальной статье не указано какой реальный запрос будет направлен к СУБД, чтобы оценить его эффективность, и не приведены оценочные замеры.
А так, для скорости, чтобы не читать одну и ту же таблицу по несколько раз (коли она большая) - можно было бы сначала во временную таблицу сагргировать а из неё уже делать выборки для нужных групп - но да, строк кода будет много - но стои ли фича данного синтаксического сахара, их сократившая, расширения языка запроса? На мой взгляд - совершенно не стоит - тем более, что язык запросов гораздо более нуждается в других конструкция для расширения. Да взять хотя бы гораздо более востребованную задачу получения дублей итогового значения по хронологии на даты, где в источнике нет рассчитанных ни остатков ни движений (пример: получение цен из регистра сведений на каждую дату периода с заданной периодичностью: день, месяц, квартал) - без формирования итогов - т.е. с возможностью применять в подзапросах и временных таблицах.

Ну или минимализироанный расчёт агрегатов истчника для поля с нужными группировками:

ВЫБРАТЬ
 
Ссылка КАК ДоговорКонтрагента,
Владелец КАК Контрагент,
 
СУММА(СуммаОстаток, РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОстатков, Счет  В ИЕРАРХИИ(&Счет1)) ПО Контрагент, ДоговорКонтрагента=Ссылка) КАК СуммаПоСчету1, //детальный итог для каждой строки справочника ДоговораКонтрагентов, для поля ДоговорКонтрагента указано условие сопоставления - иначе автоматически на "="
СУММА(СуммаОстаток, РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОстатков, Счет  В ИЕРАРХИИ(&Счет1)) ПО Контрагент) КАК СуммаПоСчету1К, //Группировано по контрагентам - по строкам договоров одного контрагента значение дублируется
СУММА(СуммаОстаток, РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОстатков, Счет  В ИЕРАРХИИ(&Счет2)) ПО АВТО) КАК СуммаПоСчету2, //Автогруппировка по группировкам справочника ДоговораКонтрагентов (сопоставление по псевдонимам)
СУММА(СуммаОстаток, РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОстатков, Счет  В ИЕРАРХИИ(&Счет2)) ПО Контрагент) КАК СуммаПоСчету2К


ИЗ
Справочник.ДоговораКонтрагентов

СГРУППИРОВАТЬ ПО
ДоговорКонтрагента, //да, по псевдонимам было бы здорово тоже группировать
Контрагент //если бы не коснтрукция "ПО АВТО" то от этой секции группировка можно было бы отказаться а так - она нужна как источник данных о группировки для расчета поля "СуммаПоСчету2"
Показать


Ну а если можно было бы создавать свои макро источники - так вообще было бы здорово

Например аналогичный скалярный макро источник:

ФУНКЦИЯ БухИтог
	(
	&Поле КАК Поле, 
	&ДатаОстатков КАК Дата,
	&Счет КАК СчетАрг
	) 

СУММА(Поле)

ИЗ

РегистрБухгалтерии.Хозрасчетный.Остатки(Дата, Счет  В ИЕРАРХИИ(СчетАрг) 

СГРУППИРОВАТЬ
АВТО

;

ВЫБРАТЬ
 
Ссылка КАК ДоговорКонтрагента,
Владелец КАК Контрагент,
 
БухИтог(СуммаОстаток,&ДатаОстатков,&Счет1) ПО (Контрагент, ДоговорКонтрагента=ДоговорКонтрагента) КАК СуммаПоСчету1,
БухИтог(СуммаОстаток,&ДатаОстатков,&Счет1) ПО Контрагент КАК СуммаПоСчету1К,
БухИтог(СуммаОстаток,&ДатаОстатков,&Счет2) ПО АВТО КАК СуммаПоСчету2, 
БухИтог(СуммаОстаток,&ДатаОстатков,&Счет2) ПО Контрагент КАК СуммаПоСчету2,
 

ИЗ
Справочник.ДоговораКонтрагентов

СГРУППИРОВАТЬ ПО
ДоговорКонтрагента, 
Контрагент
Показать



Ну а если такие функции можно было бы ещё и в конфигурации сохранять - для использования во всех запросах - вообще лепота была бы
40. s22 20 08.07.19 12:24 Сейчас в теме
(38)
Ну а если такие функции можно было бы ещё и в конфигурации сохранять - для использования во всех запросах - вообще лепота была бы


Давняя идея. Виртуальные таблицы. Добавляем новый оъект в метаданные - запрос, далее его можно использовать везде. на крайняк можно сделать материализуемым
7. Поручик 4277 05.07.19 12:19 Сейчас в теме
Лучше бы INSERT и DELETE сделали
Darklight; rusmil; KazanKokos; zhichkin; Summer_13; acanta; kser87; JIEX@; sansys; wowik; +10 2 Ответить
8. Fox-trot 99 05.07.19 12:28 Сейчас в теме
(7) trancate забыл :-)
Дмитрий74Чел; KazanKokos; CyberCerber; +3 1 Ответить
28. nytlenc 273 05.07.19 18:21 Сейчас в теме
9. JIEX@ 05.07.19 12:37 Сейчас в теме
Что то ЗП у программистов маленькая или это для провинциалов?
CyberCerber; +1 Ответить
20. AlX0id 05.07.19 14:29 Сейчас в теме
10. DanilaDru 246 05.07.19 13:05 Сейчас в теме
Картинка то что надо :)
user915379; nikita0832; +2 Ответить
11. AllexSoft 05.07.19 13:14 Сейчас в теме
Мне кажется актуальнее было бы реализация в запросах: trim для обрезки пустых символов в строках, convert для конвертации значений и получение уникального идентификатора объекта в запросе.
Tolpinski; sergbsv; karpik666; Darklight; memb3r; SerVer1C; alalsl; OksDallas; PowerBoy; TMV; igo1; CyberCerber; zhichkin; frkbvfnjh; +14 Ответить
24. s22 20 05.07.19 15:44 Сейчас в теме
12. s_vidyakin 60 05.07.19 13:15 Сейчас в теме
Короче я почитал по ораклу материалы и понял, эта фича нужна только для оптимизации производительности на больших объемах, когда надо построить несколько отчетов в разных разрезах или сформировать подобие куба - если пользоваться объединением или отдельными запросами под каждый набор, происходит сканирование таблицы для каждого набора группировок. А с этой фичей все итоги считаются за 1 проход и результат можно сохранить во вр.таблицу или в таблицу значений как кэш, а потом быстро выбирать из нее только нужные группировки.
Например можно ночью запускать такой запрос по всем данным и потом днем строить отчеты по "закэшированным" итогам в любых разрезах
AllexSoft; acanta; +2 Ответить
15. json 2192 05.07.19 13:36 Сейчас в теме
Намного полезнее было бы, если б добавили Common table expressions и OUTER APPLY.
Darklight; +1 Ответить
16. asirius 106 05.07.19 13:39 Сейчас в теме
когда уже реализуют ROW_NUMBER и RANK, а то сквозь слезы квадратичные JOIN-ы приходится делать...
18. s_vidyakin 60 05.07.19 13:51 Сейчас в теме
(16) ROW_NUMBER уже ведь реализовали, правда только во временных таблицах
Brawler; SerVer1C; asirius; lmnlmn; +4 Ответить
22. asirius 106 05.07.19 14:55 Сейчас в теме
(18) Wow! Есть повод перейти на 8.3.13
25. s_vidyakin 60 05.07.19 16:33 Сейчас в теме
(22) У нас давно уже в проде, все живы
17. zhichkin 487 05.07.19 13:49 Сейчас в теме
Это совпадение, а не реклама =)
В своём докладе на Infostart Event 2019 я как раз планирую говорить о расширении языка запросов =)
Правда не средствами 1С ... устал ждать - решил сделать платформу над платформой =)
Darklight; +1 Ответить
19. herres 05.07.19 14:22 Сейчас в теме
а я страдаю по Мин(число1, число2) или Макс(число1,Число2)
s22; maxis33; AllexSoft; +3 Ответить
30. AntonNV 06.07.19 12:46 Сейчас в теме
21. KazanKokos 7 05.07.19 14:47 Сейчас в теме
А CAST и CONVERT? CAST вроде есть. Но CONVERT бы не помешал для простейших типов :)
SerVer1C; rozer; acanta; +3 Ответить
29. nytlenc 273 05.07.19 18:24 Сейчас в теме
Ну наконец то!!!! 1С на шаг ближе к тому, чтобы наконец реализовать кнопку "Сделать все хорошо"!!! А конфигуратор??? А и ладно, как был убожеством так им пусть и остаётся. Зачем программистам удобный инструмент? Пусть работают как получится... 1С далеки от "народа" это факт...
Mrgnstrn; +1 Ответить
33. PerlAmutor 35 06.07.19 18:14 Сейчас в теме
Т.е. придумали замену этому?

ВЫБРАТЬ
    Т.Сотрудник,
    СУММА(Т.Зарплата) КАК ОбщийДоход
ИЗ (
ВЫБРАТЬ
    Т1.Сотрудник КАК Сотрудник,
    СУММА(Т1.Зарплата) КАК Зарплата
ИЗ ДоходыСистемнымАдминистратором КАК Т1
СГРУППИРОВАТЬ ПО
    Т1.Сотрудник

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Т1.Сотрудник,
    СУММА(Т1.Зарплата) КАК Зарплата
ИЗ ДоходыПсихотерапевтом КАК Т1
СГРУППИРОВАТЬ ПО
    Т1.Зарплата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Т1.Сотрудник,
    СУММА(Т1.Зарплата) КАК Зарплата
ИЗ ДоходыАналитиком КАК Т1
СГРУППИРОВАТЬ ПО
    Т1.Зарплата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Т1.Сотрудник,
    СУММА(Т1.Зарплата) КАК Зарплата
ИЗ ДоходыКонсультантом КАК Т1
СГРУППИРОВАТЬ ПО
    Т1.Зарплата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Т1.Сотрудник,
    СУММА(Т1.Зарплата) КАК Зарплата
ИЗ ДоходыПрограммистом1С КАК Т1
СГРУППИРОВАТЬ ПО
    Т1.Зарплата

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Т1.Сотрудник,
    СУММА(Т1.Зарплата) КАК Зарплата
ИЗ ДоходыСотрудникомТехПоддержки КАК Т1
СГРУППИРОВАТЬ ПО
    Т1.Зарплата

) КАК Т

СГРУППИРОВАТЬ ПО
    Т.Сотрудник
Показать


Лучше бы действительно разрешили в запросе преобразовывать строки в числа, числа в строки, сравнивать текстовые поля с учетом регистра, преобразовывать даты в секунды, секунды в даты, отбирать по удаленным объектам в запросе, выводить GUIDы ссылок прямо из запроса в текстовом виде, правильно создавать временные таблицы для внешних источников данных через конструктор запросов, ввести функцию ТекущаяДатаСеанса() в язык запросов, функцию определения длинны строки в запросе, функцию получения остатка от деления по модулю, функцию СтрЗаменить в запросе и функцию полнотекстового поиска в запросе (CONTAINS()) для справочников номенклатуры промышленных объемов.
Дмитрий74Чел; SerVer1C; AllexSoft; nytlenc; RSConsulting; +5 Ответить
34. Isakov_Artem 06.07.19 21:08 Сейчас в теме
Почему на превьюшке картинка с кодом HTML + CSS. Как это связано с запросами?
Почему такой ажиотаж вокруг не самой топовой функции. Она не так и часто нужна.
35. Lancelot-2M 100 07.07.19 00:38 Сейчас в теме
Да понятно всё - на своём монструозном ерп уперлись в производительность на каком-нибудь госпроекте и допилили язык запросов под это дело. А " сообщество" сразу сопли пускать))
s_vidyakin; Дмитрий74Чел; memb3r; AllexSoft; zqzq; nytlenc; kuzyara; boln; CXY; +9 Ответить
36. aximo 704 07.07.19 10:11 Сейчас в теме
Маркетосы отлично работают) раньше это было бы по меньшей мере странно, например «1с анонсировала функцию выделения целого числа «цел()»»
memb3r; nytlenc; acanta; +3 Ответить
37. user1249164 08.07.19 10:10 Сейчас в теме
Знать бы ещё для чего всё это
41. s_vidyakin 60 08.07.19 14:17 Сейчас в теме
(37) если кратко - можно получать все группировки за один проход.
Когда один запрос выполняется час, экономится несколько часов, можно быстрее строить аналитические кубы на больших базах
42. user774630 08.07.19 15:21 Сейчас в теме
Предлагаю ознакомиться с выдержками обсуждения этой темы на партнерском форуме 1С :)
Прикрепленные файлы:
Оставьте свое сообщение