Имя: Пароль:
1C
 
Ошибка в запросе (баг в платформе со строковыми функции в запросе)
0 Студент23232
 
17.07.25
12:02
пытаюсь разобраться в запросах, не понимаю почему выдает ошибку 'Неверные параметры "+" '
в этой секции
Фальсификат.Торговое ПОДОБНО ВЫБОР
    КОГДА ДЛИНАСТРОКИ(СОКРЛП(ЛЕВ(СОКРЛП(Остатки.Номенклатура.Наименование), СТРНАЙТИ(СОКРЛП(Остатки.Номенклатура.Наименование), " ") - 1))) < 2
        ТОГДА СОКРЛП(ЛЕВ(СОКРЛП(Остатки.Номенклатура.Наименование), СТРНАЙТИ(СОКРЛП(Остатки.Номенклатура.Наименование), " ") - 1)) + "%"
    ИНАЧЕ СОКРЛП(Остатки.Номенклатура.Наименование) + "%"
КОНЕЦ

хотя если в части "Тогда" убрать +"%" то работает
1 Волшебник
 
17.07.25
12:33
говнокод
2 youalex
 
17.07.25
13:04
Любопытно, реально ошибки если:

ВЫБРАТЬ ЛЕВ("100", 1) + "1"
(ЛЕВ от литерала рассчитывается на уровне платформы видимо

ВЫБРАТЬ ЛЕВ(Спр.Наименование, 1) + "1"
ИЗ Справочник.Номенклатура Спр
(ЛЕВ трансформируется в LEFT на mssql)
3 Мультук
 
гуру
17.07.25
22:30
(2)

В этом треде (можно читать только последнее сообщение).
Я проводил "бесчеловечные" эксперименты с ПОДСТРОКА.
Я результатов достиг (чисто из любопытства)

Ошибка в соединении строк в запросе
4 Волшебник
 
17.07.25
13:14
(2) Да, какие-то баги платформы.
5 Студент23232
 
17.07.25
13:20
(3) спасибо, большое
6 Волшебник
 
17.07.25
13:26
// так работает
ВЫБРАТЬ "абв"+"гд" 

// так не работает, хотя должно
ВЫБРАТЬ ЛЕВ("абв", 3) + "гд"
//
// ошибка:  Неверные параметры "+"

//а так снова работает
ВЫБРАТЬ ПОДСТРОКА(ЛЕВ("абв", 3),1,1000) + "гд"
7 Волшебник
 
17.07.25
13:22
(6)+ Закиньте на партнёрский, у кого есть доступ. Проверял на 8.5.1.397
8 maxab72
 
17.07.25
22:09
(6)+ а вот так работает
ВЫРАЗИТЬ (ЛЕВ("абв" + "еее", 3) КАК СТРОКА (3)) + "ввв"

То есть ЛЕВ возвращает не строку или не совсем строку.
9 Волшебник
 
17.07.25
22:13
(8) Кстати, редкий случай, когда студенческий говнокод потряс сообщество профессионалов 1С и разработчиков платформы 1С.
(0)👍Хороший говнокод!
10 Волшебник
 
18.07.25
00:23
(7)+ Я вам приготовил обращение:
Тема: Необходимо исправить ошибку в обработке строковых операций в SQL-запросах 1С: `ЛЕВ(...) + "строка"`  

Уважаемые разработчики платформы 1С,  

Мы, команда разработчиков 1С сообщества Mista.ru с многолетним стажем, столкнулись с проблемой, которая вызывает глубокое недоумение и сомнение в корректности формальной грамматики языка запросов 1С. Примитивный запрос со строковыми функциями работает некорректно (см код ниже):

ВЫБРАТЬ "абв" + "гд" // Работает без ошибок   

ВЫБРАТЬ ЛЕВ("абв", 3) + "гд" // Не работает! Ошибка: "Неверные параметры '+'"   

// А так работает... (хак)
ВЫБРАТЬ ПОДСТРОКА(ЛЕВ("абв", 3), 1, 1000) + "гд" 


Проблема:
Функция `ЛЕВ()` и другие строковые функции должна возвращать строковое значение, что чётко указано в документации. Оператор `+` в SQL 1С заявлен как операция конкатенации строк. Однако при попытке сложить результат `ЛЕВ()` с другой строкой платформа выбрасывает ошибку на этапе синтаксического контроля. Это противоречит логике, ожиданиям и документации, а также нарушает принцип "не заставлять разработчиков писать бессмысленный код".  

Что делать:
1. Исправьте обработку строковых функций.  
   Убедитесь, что результат `ЛЕВ()`, `ПРАВ()`, `ПОДСТРОКА()` и других функций, возвращающих строки, корректно совместимы с оператором `+` в контексте строк.  

2. Уберите необходимость "магических обёрток".  
   Не заставляйте нас писать `ПОДСТРОКА(..., 1, 1000)` или `СТРОКА(...)` только для того, чтобы платформа "поняла", что мы имеем дело со строкой.  

3. Следуйте своей же документации.
   Если в справке написано, что функция возвращает строку — пусть она ведёт себя как строка во всех контекстах.  

Мы, как разработчики, заслуживаем стабильной и логичной платформы. Исправьте это, пожалуйста.  

С уважением,  
Станислав Митичкин (Волшебник)
МИСТА ФОРУМ