Новые возможности языка запросов в платформе 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

См. также

SALE! 20%

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

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

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

13000 10400 руб.

02.09.2020    121621    670    389    

711

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5740    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

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

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

Запрос 1С copilot

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

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6280    30    mkalimulin    25    

49

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

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

14.12.2023    1742    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

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

06.12.2023    5386    user1923546    26    

43

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

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

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

11.10.2023    16168    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1679 28.09.22 09:07 Сейчас в теме
Полезные и нужные функции. Время от времени такое надо. Большая часть их поддерживается SQL нативно (т.е. будет преобразовываться 1 в 1).
2. ixijixi 1775 28.09.22 09:13 Сейчас в теме
Оффтоп: как выделить текст таким образом?
Прикрепленные файлы:
3. zeltyr 566 28.09.22 09:55 Сейчас в теме
(2) примерно так, только убрать пробелы в тегах
< code >РазмерХранимыхДанных< /code >
4. ixijixi 1775 28.09.22 10:00 Сейчас в теме
(3) Чет не работает =\
Прикрепленные файлы:
5. zeltyr 566 28.09.22 10:06 Сейчас в теме
(4) ну, в редакторе статьи это надо вставлять в режиме редактирования исходного текста.
Прикрепленные файлы:
6. ixijixi 1775 28.09.22 10:10 Сейчас в теме
(5) Спасибо, получилось!
Прикрепленные файлы:
Arkadiy_B; +1 Ответить
7. kser87 2438 28.09.22 16:07 Сейчас в теме
8. Pira 144 28.09.22 17:52 Сейчас в теме
(7) Почему не прошло? Прошло уже!
mikukrnet; корум; EvilMilko; +3 Ответить
9. Dzenn 870 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 566 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 566 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 58 15.06.23 21:05 Сейчас в теме
1С:Предприятие 8.3 (8.3.20.2184)

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


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

ЧЯДНТ???
19. CepeLLlka 58 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", "") КАК НаименованиеФормат
ПОМЕСТИТЬ Результат
ИЗ
	ИсходДанные КАК ИсходДанные
Показать

выполнение второго запроса выдает ошибку(на скрине). Если во втором убрать
ПОМЕСТИТЬ Результат
то все нормально. С первым вариантом запроса проблем нет.
Прикрепленные файлы:
21. Anthon 230 14.12.23 10:05 Сейчас в теме
СтрЗаменить(СтрЗаменить(
не работает. То есть если надо заменить два значения, строка портится, так как заменяется текст в полученной строке, но в местоположении исходной. Возможно, будет работать нормально, если все подстроки второй замены будут находиться РАНЬШЕ ВСЕХ подстрок первой замены
Оставьте свое сообщение