Где можно прочитать про новые функции языка запросов? Какие есть нюансы?

В частности, запрос не выполняется

```1c
    выбрать первые 1
    ЛЕВ(Наименование, 1)
    Из
    Справочник.Номенклатура
    Где
    ЛЕВ(Наименование, 1) = "м"
```

Пишет ошибку: Нельзя сравнивать поля неограниченной длины и поля несовместимых типов

Следующий запрос отрабатывает (ТипЗначения = Строка и ДлинаСтроки = 1)

```1c
    выбрать первые 1
    ТИПЗНАЧЕНИЯ(ЛЕВ(Наименование, 1)),
    ДЛИНАСТРОКИ(ЛЕВ(Наименование, 1))
    Из
    Справочник.Номенклатура
    Где
    ЛЕВ(Наименование, 1) Подобно "м"
```
---
я так понимаю, что подробностей про работу новых функции нет на просторах интернета, кроме как самому анализировать опытным путем
---
в данном случае тут и так понятно, что результатом функции ЛЕВ получается строка неограниченной длины.
---
так я и хочу узнать про где это написано

В моем случае: длина наименования в конфигураторе = 100

Следующий запрос отрабатывает без ошибки

```1c
    выбрать первые 1
    наименование
    из
    справочник.Номенклатура
    где
    Наименование = "м"
```

Получается функция ЛЕВ меняет строку длиной 100 на строку неограниченной длины?
В таком случае бесполезный функционал какой-то
---
Сообщение было скрыто модератором.
---
Запрос не знает - какой длины получится строка в результате ЛЕВ(). Поэтому он не допускает такую строку к сравнению.
Вот такая логика.
Второй параметр функции однозначно указывает максимально возможную длину получаемой строки.

Подстрока тоже может получить строку неограниченной длины. Однако это не мешает пропускать до самого sql сервера, где уже и идет проверка.
---
Сообщение было скрыто модератором.
---
и в чем отличие от Подстрока (ИсхСтрока,1,10) ? Так же можно получить 3.
---
то есть не учитывается второй параметр? Хотя может просто ещё не доработали функционал
тогда пока лучше использовать ВЫРАЗИТЬ КАК СТРОКА(1) чем функцию ЛЕВ, имхо самая ненужная получается
---
Да, именно сама функция возвращает строку неограниченной длины.
эта проверка происходит еще на стадии разбора запроса в 1С, а не в sql сервере. Так что могут еще переиграть. Было бы логично использовать похожий функционал на Подстрока.
Обычно такие нюансы нигде не прописаны, чтобы можно было менять по ходу.

В таком случае бесполезный функционал какой-то
Если не использовать в сравнениях (и там где невозможно использовать строку неограниченной длины), то вполне работает как синтаксический сахар.
---
да, скорее всего ещё доработают в таком случае, иначе не очень то и нужна функция ЛЕВ
---
я так понимаю, что подробностей про работу новых функции нет на просторах интернета, кроме как самому анализировать опытным путем
---
https://infostart.ru/1c/articles/1760453/
---
саму статью то открывали?

я писалГде можно прочитать про новые функции языка запросов? Какие есть нюансы?Ну и какие там подробности про новые функции? Зачем мне эти практические примеры?
---
А тебе нужно расписать техническую часть движка каждого релиза платформы?)
---
не понял при чем тут все релизы, я спрашиваю про конкретные функции, которые были добавлены недавно
И не про то как их использовать, а про то какие есть подводные камни и ограничения.

И в частности, столкнулся с ограничением функции ЛЕВ

Вместо статьи лучше прочитать встроенную справку, по крайней мере в версии 8.3.22.1704 они уже есть
Хотя по тому же ЛЕВ не написано, что она возвращает строку неограниченной длины, но написано о типах параметров и есть некоторое описание
---
https://habr.com/ru/post/705800/
---
на самом деле бесполезная какая-то статья. Просто примеры

В том числе там написано
При строгой типизации - ошибок в применении не будет.
Ну вот с тем же ЛЕВ у наименования в моем примере,
вроде строка, длина 100 сравниваем со строкой "м", ан нет, оказывается функция ЛЕВ превращает нашу строку(100) в строку(0)
---
выбрать первые 1
    ЛЕВ(Наименование, 1)
   Из
    Справочник.сотрудники
Где
   выразить(ЛЕВ(Наименование, 1) как строка(1)) = "м"

так ошибка не выходит
---
выразить(ЛЕВ(Наименование, 1) как строка(1)) = "м"
вот это равнозначно
выразить(Наименование как строка(1)) = "м"
так что весь смысл от ЛЕВ теряется в данном случае.
---
Только лишнее действие выполняется
---
ну это какой-костыль

можно ещё так, тоже работает

```1c
    выбрать первые 1
    ЛЕВ(Ссылка.Ссылка.Ссылка.Наименование, 1)
    Из
    Справочник.Номенклатура
    Где
    ВЫРАЗИТЬ(ПОДСТРОКА(ЛЕВ(Ссылка.Ссылка.Ссылка.Наименование,1),1,1) КАК Строка(1)) = "м"
```
---
Похоже исправлять не будут. Используется не встроенная функция LEFT из t-sql.
Вот что выдал план выполнения запроса:

```1c
    SEL ECT
    GET_LEFT(T1._Description,1),
    SUBSTRING(T1._Description,1,1)
    FR OM _Reference54 T
```

SUBSTRING это подстрока и использует встроенную функцию. А вот GET_LEFT ... этим все и сказано.
---
Странно, что не использовали LEFT. Во всех СУБД для 1С вроде есть такая функция
---
И все ведут себя по разному. Начиная с интерпретации отрицательного второго параметра, например.
---
тогда более менее понятно,
хотя можно же ограничить на ввод только положительных в самой платформе
---
ограничить на ввод только положительныАга. И запретить конструкции типа ЛЕВ(Таблица1.Поле1, Таблица2.Поле2). А то ишь, размечтались программисты.
---
Если SQL допускает такое, то тогда почему и не использовать
Отрицательные же MS SQL не допускает, поэтому я и написал
Конечно это всё тонкости, но чем это хуже того, что они написали отдельную функцию для ЛЕВ
---
Отрицательные же MS SQL не допускаетА вот постгре вполне допускает.
Представь себе, что в вышеприведенном примере в Таблица2.Поле2 как раз стоит отрицательное число. Но не всегда, а в зависимости от неких параметров.
И как должна повести себя система на постре, мсскл, оракле, дб2 и файловом варианте?
---
да не, я написал про то, допускается ли в СУБД вторым параметром указывать поле?
Или вообще к чему было это?ЛЕВ(Таблица1.Поле1, Таблица2.Поле2)
И как должна повести себя система на постре, мсскл, оракле, дб2 и файловом варианте?
Так разве платформа не обрабатывает запросы перед тем как отправить в СУБД?
Ну вот перед отправкой в СУБД делали бы проверку на значение параметра

Вообще я вел к тому, почему нельзя использовать функцию LEFT (пусть и с платформенной проверкой)?
Вместо этого они создали свою функцию
---
перед отправкой в СУБД делали бы проверку на значение параметра Алёгараж!
Значение второго параметра может зависеть от данных в базе данных. Платформа не может проверить его знак не выполнив запрос.

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

Кстати на мсскл оно вполне себе транслирутся в конструкцию
LEFT(T1.Q_001_F_000_,CASE WHEN T1.Q_001_F_001_ < 0 THEN 0 ELSE T1.Q_001_F_001_ END)

Видимо там в постгре еще проблемы с кодировкой какие-то есть, надо будет внутрь заглянуть
---
Значение второго параметра может зависеть от данных в базе данных. Платформа не может проверить его знак не выполнив запрос. ну да, правильно
на мсскл оно вполне себе транслирутся в конструкцию
LEFT(T1.Q_001_F_000_,CASE WHEN T1.Q_001_F_001_ < 0 THEN 0 ELSE T1.Q_001_F_001_ END) это уже интересно, то есть функция вернет пустой результат без ошибки. Вот про такие нюансы бы знать, собственно тему я создавал, чтобы узнать, где можно прочитать подробности

видимо в (17) СУБД не MSSQL
---
А на каком релизе ты добился такого?

```1c
    ВЫБРАТЬ
    ЛЕВ(Источник.Наименование, 1)
    ИЗ
    Справочник.Сотрудники КАК Источник
```
Превращается во вменяемые

```1c
    SEL ECT
    LEFT(T1._Description,1)
    FR OM dbo._Reference1 T1
```
---
1С:Предприятие 8.3 (8.3.22.1709)
---
Хе. Я только что проверял на 8.3.22.1704.
---
правда режим совместимости 8.3.20 стоит.
---
Не, нифига. 8.3.22.1704 в режиме совместимости 8.3.20 дает такое же честное LEFT(T1._Description,1). А сервера 8.3.22.1709 под руками нет.

Завтра посмотрю на новых релизах, если вспомню...
---
нет необходимости. Сейчас проверил на ms sql. Да, там используется LEFT.
---
```1c
    ГДЕ ВЫРАЗИТЬ(ЛЕВ(Х, 1) КАК СТРОКА(1)) = "з"
```
---
чем это отличается от

```1c
    ВЫРАЗИТЬ(Х КАК СТРОКА(1)) = "з"
```
---
Вообще ничем, походу. Тоже мысль была, но не стал писать, бо топикастер, т.е. вот прям Вы, спрашивал о другом.
---
одним точно отличается,
ВЫРАЗИТЬ(ЛЕВ()) это функция в функции, скорее всего незначительная, но лишняя нагрузка на СУБД идет

Какой-то костыль получается, чтобы использовать функцию ЛЕВ (ну не зря же разработчики добавили функционал) и чтобы пользователи переходили на новую платформу

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