Новые возможности языка запросов в платформе 8.3.20

27.09.22

Разработка - Запросы

С платформы 8.3.20 анонсировали ряд изменений в языке запросов, с которыми интересно было повозиться на практике, что и было проделано. Результатом этих изысканий решил поделиться с вами.

Анонсированные возможности (кратко)

Анонс новых возможностей можно посмотреть по ссылке, если кратко, можно выделить три больших блока добавлений:

  1. Добавлены новые арифметические операции: округление, логарифмы, квадратные корни и т.д.
  2. Добавлена возможность преобразования в строку и расширение работы со строками: обрезка строк, удаление пробелов и т.д.
  3. Добавлена возможность получать размер хранимых данных через метод РазмерХранимыхДанных.

Вот со всем этим и хотелось познакомится поподробнее. Все эксперименты проводились на платформе 8.3.20.1613.

 

Арифметические возможности

В платформе анонсировали следующие возможности:

  • Тригонометрические функции Sin, Cos, Tan, ASin, ACos, ATan (все вычисления производятся в радианах)
  • Exp - вычисляет результат возведения основания натурального логарифма (числа e) в степень
  • Log - вычисляет натуральный логарифм числа.
  • Log10 - вычисляет десятичный логарифм числа.
  • Pow - вычисляет возведение в степень.
  • Sqrt – вычисляет квадратный корень.
  • Окр(Round) - округляет исходное число до нужной разрядности
  • Цел(Int) - вычисляет целую часть переданного числа, полностью отсекая дробную часть.
 
 Код проверки

Выявлены следующие особенности:

  1. Данные операторы работают строго с числами. При попадании туда любого другого значения, включая  NULL или Неопределено - платформа выдаст ошибку.

 

 

  1. Данные операторы не могут работать с полями составного типа без явного приведения к числу (оператор ВЫРАЗИТЬ ).

 

 

  1. В арифметических операциях можно влететь в невозможность вычислить выражение из-за слишком большого числа. Ошибка ниже возникла при попытке посчитать exp от 500. Попытки вставить "ВЫРАЗИТЬ" и т.д. ни к чему не привели.

 

В целом с арифметическим операциями всё - переходим к работе со строками.

 

Работа со строками.

В платформе анонсировали следующие возможности:

  • Строка(String) – преобразует значение примитивного типа в строку с учетом национальных установок.
  • ДлинаСтроки(StringLength) – вычисляет длину строки.
  • СокрЛ(TrimL) – отбрасывает незначащие пробелы слева.
  • СокрП(TrimR) – отбрасывает незначащие пробелы справа.
  • СокрЛП(TrimAll) – отбрасывает незначащие пробелы слева и справа.
  • Лев(Left) – получает первые слева символы строки.
  • Прав(Right) – получает первые справа символы строки.
  • СтрНайти(StrFind) – находит первую позицию подстроки в строке (без учета регистра).
  • ВРег(Upper) – преобразует все символы строки в верхний регистр.
  • НРег(Lower) – преобразует все символы строки в нижний регистр.
  • СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).

В данном случае будет 2 эксперимента, т.к. функцию Строка хотелось погонять "в хвост и в гриву".

Работа функции Строка

 
 Код проверки

Выявлены следующие особенности:

  1. Умеет преобразовывать любые примитивные типы, включая NULL или Неопределено (см. пример).
  2. Не умеет преобразовывать ссылки на объекты, в том числе предопределённые элементы.

 

 

  1. Если использовать функцию Строка на строку неограниченной длинны - запрос спокойно отработает. Ради интереса вставил в реквизит текст первого тома "Война и мир" - запрос выполнился без вопросов и в результате получил весь текст из реквизита.

 

Прочие функции работы со строками

 
 Код проверки

Выявлены следующие особенности:

  1. Остальные функции отказываются работать с любыми типами, кроме Строка
  2. Все эти функции умеют работать со строками неограниченной длинны.
  3. Конструктор ловить лишь часть ошибок по типизации, а часть вылезет только на клиенте.
 
Интересная особенность (баг или фича)

 

Функция РазмерХранимыхДанных

В платформе анонсировали следующие возможности:

> РазмерХранимыхДанных(StoredDataSize) – возвращает размер данных в байтах, которые занимают данные параметра.

Данная функция будет применима не только к хранилищу значений (как почему-то подумалось мне изначально), а к любому существующему в базе реквизиту (ну, почти к любому).

 
 Код проверки

Выявлены следующие особенности:

  1. Любая ошибка с размером хранимых данных приводит к вылету платформы.

 

 

  1. Надо чётко понимать, что является реквизитом ИБ, а что нет, т.к. подсказка в конструкторе работает далеко не всегда. (Н-р: попытка обращения к полям Представление , Предопределённый - приведут к ошибке (см. пример проверки)).   
  2. Получить общий размер табличной части таким образом не получится, что собственно следует из определения, но проверить нужно было.

 

 

Заключение.

Доклад окончен. Целью статьи было попробовать для себя и показать другим как работают новые возможности языка запросов, какие есть при этом ограничения и нюансы, о которых можно изначально не подумать. Спасибо за внимание.

Если вдруг кому нужна обработка, в которой я накидывал данные примеры кода - см. мой github

Запросы 8.3.20

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 руб.

02.09.2020    101659    563    385    

608

1C:Предприятие для программистов: Запросы и отчеты. Онлайн-интенсив с 27 ноября по 27 декабря 2023г.

1С-программирование Запросы СКД Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения. Курс является вторым курсом траектории развития 1С-Разработчика, с углубленным изучением тем "Язык запросов" и "Отчеты", которые были рассмотрены в рамках “Базового курса для начинающих 1С-программистов”.

7500 руб.

04.10.2023    2576    49    0    

48

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    13554    skovpin_sa    14    

82

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

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Решение задачи нахождения уникальных наборов строк таблицы запросом

23.07.2023    5075    tormozit    79    

39

Структура запроса

Инструментарий разработчика Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

21.06.2023    4719    53    obmailok    35    

53

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    10821    Филин    37    

101

Как собрать отладчиком отдельные части запроса в один

Запросы Платформа 1С v8.3 Запросы Россия Бесплатно (free)

Подробное описание функционала загрузки данных запроса из отладчика в консоли "Анализатор сложных запросов".

21.03.2023    3863    manuel    2    

20
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1609 28.09.22 09:07 Сейчас в теме
Полезные и нужные функции. Время от времени такое надо. Большая часть их поддерживается SQL нативно (т.е. будет преобразовываться 1 в 1).
2. ixijixi 1688 28.09.22 09:13 Сейчас в теме
Оффтоп: как выделить текст таким образом?
Прикрепленные файлы:
3. zeltyr 540 28.09.22 09:55 Сейчас в теме
(2) примерно так, только убрать пробелы в тегах
< code >РазмерХранимыхДанных< /code >
4. ixijixi 1688 28.09.22 10:00 Сейчас в теме
(3) Чет не работает =\
Прикрепленные файлы:
5. zeltyr 540 28.09.22 10:06 Сейчас в теме
(4) ну, в редакторе статьи это надо вставлять в режиме редактирования исходного текста.
Прикрепленные файлы:
6. ixijixi 1688 28.09.22 10:10 Сейчас в теме
(5) Спасибо, получилось!
Прикрепленные файлы:
Arkadiy_B; +1 Ответить
7. kser87 2403 28.09.22 16:07 Сейчас в теме
Не прошло и 20 лет
8. Pira 134 28.09.22 17:52 Сейчас в теме
(7) Почему не прошло? Прошло уже!
mikukrnet; корум; EvilMilko; +3 Ответить
9. Dzenn 845 29.09.22 11:26 Сейчас в теме
(7) критиковать легко, делать сложно ) думаю, у них было полно более приоритетных задач, а ресурсы конечно ограничены
pbahushevich; Brawler; ledywinter; +3 Ответить
10. Jimbo 9 29.09.22 13:36 Сейчас в теме
Интересно и зачем вам ВЫБРАТЬ EXP(500)?
1c 8.3.21.1508 удалось только ВЫБРАТЬ EXP(66), хотя в MS SQL 2019 легко выдаст Select EXP(500). Видать не так уж и проста трансляция языка запросов 1с в язык SQL.
11. VVi3ard 52 29.09.22 16:27 Сейчас в теме
(10) Возможно потому что одна из других СУБД которые поддерживает платформа (включая файловую) не умеет EXP(500).

Как то постоянно все забывают что главный якорь платформы в плане работы с СУБД это файловый вариант, второй по влиянию это IBM DB2.
13. zeltyr 540 30.09.22 06:47 Сейчас в теме
(10)
Интересно и зачем вам ВЫБРАТЬ EXP(500)?

Исключительно в целях эксперимента "а сможет ли". Одной из задач, которые я себе ставил - добиться НЕ выполнения данных функций, чтобы найти их ограничения. Что я и постарался воплотить...
dock; pbahushevich; +2 Ответить
12. Darklight 32 29.09.22 16:54 Сейчас в теме
А что там с дополнительными параметрами некоторых функций - например можно вызвать Лев(ПолеСтрока, ПолеЧисло)?
И с вложением функций СокрЛП(СтрЗаменить(ПолеСтрока, Лев(ПолеСтрока,СтрНайти(ПолеСтрока,"-")-1)+, Прав(ПолеСтрока,СтрНайти(ПолеСтрока,"-"),ДлинаСтроки(ПолеСтрока)-Лев(ПолеСтрока,СтрНайти(ПолеСтрока,"-"))))
И как нынче всё это сочетается со старой функцией ПОДСТРОКА?
И индексация символов по-прежнему с 1?
А функции перевода строки в число, булево, в дату, в неопределено - так и не появилось?
И нет ли функции как ЕСТЬNULL и как оператора ЕСТЬ NULL - только в более широком смысле - как операция условия "Не заполнено" из СКД (т.е. проверяющая не только на NULL, но и на неопределено и пустые ссылки)?
mikukrnet; +1 Ответить
14. zeltyr 540 30.09.22 07:08 Сейчас в теме
(12) Ух как много вопросов и как мало у меня ответов... Но попробуем.

А что там с дополнительными параметрами некоторых функций - например можно вызвать Лев(ПолеСтрока, ПолеЧисло)?


Можно. Причём если число будет отрицательное, то выведет просто 0 символов.

И с вложением функций СокрЛП(СтрЗаменить(ПолеСтрока, Лев(ПолеСтрока,СтрНайти(ПолеСтрока,"-")-1)+, Прав(ПолеСтрока,СтрНайти(ПолеСтрока,"-"),ДлинаСтроки(ПолеСтрока)-Лев(ПолеСтрока,СтрНайти(ПолеСтрока,"-"))))


СОКРЛП(СТРЗАМЕНИТЬ(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце, ЛЕВ(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце, СТРНАЙТИ(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце, ""5"") - 1), ""привет""))

вот такой пример точно отработал, так что думаю тут тоже всё хорошо.

И как нынче всё это сочетается со старой функцией ПОДСТРОКА?


1. Подстрока и СокрЛП / СОКРЛ / СОКРП - работают вместе вполне нормально.
ПОДСТРОКА(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце, 3, 2) + СОКРЛП(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце)


2. Подстрока и ЛЕВ / ПРАВ и т.д. не работают вместе. Стока ниже выдаёт ошибку (см. скрин к комментарию)
ПОДСТРОКА(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце, 3, 2) + ЛЕВ(РаботаСоСтроками.СтрокаСПробеламиВНачалеИКонце, 4)



И индексация символов по-прежнему с 1?

Да.

А функции перевода строки в число, булево, в дату, в неопределено - так и не появилось?

Да, так и не появилось.

И нет ли функции как ЕСТЬNULL и как оператора ЕСТЬ NULL - только в более широком смысле - как операция условия "Не заполнено" из СКД (т.е. проверяющая не только на NULL, но и на неопределено и пустые ссылки)?

Из анонса не следовало, так что похоже нет. Но очень глубоко не копал.

P.S. Если кто захочет посмотреть на код, которым я это проверял - сделал доработку в обработке для экспериментов, ссылка на которую приложена к статье.
Прикрепленные файлы:
15. Darklight 32 30.09.22 13:38 Сейчас в теме
(14)Очень странно что с ПОДСТРОКА 1. работает, а 2. уже нет - но больше интересовало, конечно как-то так так
СокрП(ПОДСТРОКА(СокрЛП(ПолеСтрока), 1, СтрНайти(СокрЛП(ПолеСтрока),".")-1))+СокрЛ(ПОДСТРОКА(СокрЛП(ПолеСтрока), СтрНайти(СокрЛП(ПолеСтрока),".")+1, ДлинаСтроки(СокрЛП(ПолеСтрока))))
16. Abduvali 2 30.09.22 20:21 Сейчас в теме
Полезная статья, спасибо!
17. naf2000 03.10.22 19:10 Сейчас в теме
IQueryable но встроенный в платформу
18. CepeLLlka 57 15.06.23 21:05 Сейчас в теме
1С:Предприятие 8.3 (8.3.20.2184)

"ВЫБРАТЬ
ОКР(20212.77, 2) КАК Зарплата"


В результате получаю - 20 212,77

ЧЯДНТ???
19. CepeLLlka 57 15.06.23 22:08 Сейчас в теме
(18)Всё норм, я прост затупил дичайше :)
20. Bovori 2 25.07.23 09:15 Сейчас в теме
Любопытное поведение СТРНАЙТИ() совместно С ПОМЕСТИТЬ.
два варианта запроса:
1.
ВЫБРАТЬ
	"SL_Cloud_Support_Lead" КАК Наименование
ПОМЕСТИТЬ ИсходДанные

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	"SL_Cloud_Support_Lead_FY23"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИсходДанные.Наименование КАК Наименование,
	ВЫБОР
		КОГДА НЕ СТРНАЙТИ(ИсходДанные.Наименование, "_FY23") = 0
			ТОГДА 
			СТРЗАМЕНИТЬ(ИсходДанные.Наименование, "_FY23", "")
		ИНАЧЕ ИсходДанные.Наименование
	КОНЕЦ 
	КАК НаименованиеФормат
ПОМЕСТИТЬ Результат
ИЗ
	ИсходДанные КАК ИсходДанные
Показать


2.
ВЫБРАТЬ
	"SL_Cloud_Support_Lead" КАК Наименование
ПОМЕСТИТЬ ИсходДанные

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	"SL_Cloud_Support_Lead_FY23"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИсходДанные.Наименование КАК Наименование,
	СТРЗАМЕНИТЬ(ИсходДанные.Наименование, "_FY23", "") КАК НаименованиеФормат
ПОМЕСТИТЬ Результат
ИЗ
	ИсходДанные КАК ИсходДанные
Показать

выполнение второго запроса выдает ошибку(на скрине). Если во втором убрать
ПОМЕСТИТЬ Результат
то все нормально. С первым вариантом запроса проблем нет.
Прикрепленные файлы:
Оставьте свое сообщение