Стандартного решения НЕТ
Если говорить о преобразовании типов данных (в данном случае строку в число), то в коде 1С сделать это очень просто. Разработчики большинства высокоуровневых языков предоставляют готовые функции для этих целей. В 1С для преобразования строки в число используется функция Число(). По аналогии что-то подобное должно быть и в запросах 1С, но нет… В языке запросов sql существуют функции CAST и CONVERT, но вот создатели языка запросов 1С обделили разработчиков такими возможностями. Из этого следует, что какого-то стандартного решения преобразования строки в число на момент написания статьи нет. Язык запросов 1С умеет, как я бы это назвал, уточнять типы данных. Сейчас поясню, что я имею ввиду. Есть такая функция – ВЫРАЗИТЬ(). С помощью нее мы можем явно указать в запросе тип данных значения поля. Например:
ВЫБРАТЬ
ВЫРАЗИТЬ(12.3 КАК Число(15,3)) КАК ДробноеЧисло
Казалось бы, так можно же тогда сделать вот так:
ВЫБРАТЬ
ВЫРАЗИТЬ(СтроковоеПоле КАК Число(15, 3)) КАК ДробноеЧисло
Но нет, так делать нельзя. На выходе вы получите ошибку о несовместимости типов. Если вам потребуется преобразовать строку в число в запросе, то придется придумывать решение исходя из сложившейся ситуации. Не существует какого-то единого решения, каждый случай можно рассмотреть индивидуально. Допустим, если вам нужно найти максимальное число, то в принципе, можно работать и со строками. Но стоит сказать, что при чисел, записанных строкой, строки должны быть одинаковой длины. Если вы будете сравнивать “3” и “11”, то функция МАКСИМУМ – выберет строку”3″. Все по тому, что строки сравниваются посимвольно. Чтобы функция отработала верно нужно добавить лидирующие нули – “03”, “11”. Вот тогда “03” < “11”. Именно поэтому решение каждой задачи индивидуально.
Решения из сети
На просторах интернета можно встретить попытки найти такие решения. Но они все равно или не универсальны, или несут с собой те или иные проблемы. Приведем пример одного из них. Статья взята с сайта ->>
Функция ТекстЗапросаИзСтрокиВЧисло(пИмяПоля, пДлинаСтроки, пСимволРазделителя=".")
лТекст="ВЫБОР ";
Для лДлинаЦелойЧасти=0 По пДлинаСтроки Цикл
Если лДлинаЦелойЧасти=пДлинаСтроки Тогда
лТекст=лТекст+"ИНАЧЕ"+Символы.ПС;
Иначе
лТекст=лТекст+"КОГДА ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""+пСимволРазделителя+""" ИЛИ ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""" ТОГДА "+Символы.ПС;
КонецЕсли;
Если лДлинаЦелойЧасти=0 Тогда лТекст=лТекст+" 0"+Символы.ПС; КонецЕсли;
Для лИнд=1 По лДлинаЦелойЧасти Цикл
лТекст=лТекст+" ВЫБОР "+Символы.ПС;
Для лЦифра=0 По 9 Цикл
лТекст=лТекст+" КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
КонецЦикла;
лТекст=лТекст+" ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "*"+Формат(Pow(10, лДлинаЦелойЧасти-лИнд), "ЧРД=.; ЧГ=0")+"+")+Символы.ПС;
КонецЦикла;
Для лИнд=лДлинаЦелойЧасти+2 По пДлинаСтроки Цикл
лТекст=лТекст+"+ ВЫБОР";
Для лЦифра=0 По 9 Цикл
лТекст=лТекст+" КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
КонецЦикла;
лТекст=лТекст+" ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "/"+Формат(Pow(10, лИнд-лДлинаЦелойЧасти-1), "ЧРД=.; ЧГ=0"))+Символы.ПС;
КонецЦикла;
КонецЦикла;
лТекст=лТекст+"КОНЕЦ";
Возврат лТекст;
КонецФункции
Данная функция преобразует запрос таким образом, чтобы сравнивать символы с числами в зависимости от разряда. Ниже приведено, как происходит преобразование. Исходный запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПОДСТРОКА(Сотрудники.Код, 10, 5) КАК Код
|ПОМЕСТИТЬ ВТ
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СРЕДНЕЕ("+ТекстЗапросаИзСтрокиВЧисло("ВТ.Код", 2)+") КАК МаксимальныйКод
|ИЗ
| ВТ КАК ВТ";
Запрос после вызова функции:
ВЫБРАТЬ
ПОДСТРОКА(Сотрудники.Код, 10, 5) КАК Код
ПОМЕСТИТЬ ВТ
ИЗ
Справочник.Сотрудники КАК Сотрудники
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СРЕДНЕЕ(ВЫБОР КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="." ИЛИ ПОДСТРОКА(ВТ.Код, 1, 1)="" ТОГДА
0
+ ВЫБОР КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="0" ТОГДА 0
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="1" ТОГДА 1
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="2" ТОГДА 2
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="3" ТОГДА 3
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="4" ТОГДА 4
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="5" ТОГДА 5
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="6" ТОГДА 6
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="7" ТОГДА 7
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="8" ТОГДА 8
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="9" ТОГДА 9
ИНАЧЕ 0 КОНЕЦ/10
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="." ИЛИ ПОДСТРОКА(ВТ.Код, 2, 1)="" ТОГДА
ВЫБОР
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="0" ТОГДА 0
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="1" ТОГДА 1
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="2" ТОГДА 2
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="3" ТОГДА 3
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="4" ТОГДА 4
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="5" ТОГДА 5
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="6" ТОГДА 6
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="7" ТОГДА 7
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="8" ТОГДА 8
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="9" ТОГДА 9
ИНАЧЕ 0 КОНЕЦ
ИНАЧЕ
ВЫБОР
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="0" ТОГДА 0
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="1" ТОГДА 1
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="2" ТОГДА 2
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="3" ТОГДА 3
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="4" ТОГДА 4
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="5" ТОГДА 5
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="6" ТОГДА 6
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="7" ТОГДА 7
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="8" ТОГДА 8
КОГДА ПОДСТРОКА(ВТ.Код, 1, 1)="9" ТОГДА 9
ИНАЧЕ 0 КОНЕЦ*10+
ВЫБОР
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="0" ТОГДА 0
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="1" ТОГДА 1
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="2" ТОГДА 2
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="3" ТОГДА 3
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="4" ТОГДА 4
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="5" ТОГДА 5
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="6" ТОГДА 6
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="7" ТОГДА 7
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="8" ТОГДА 8
КОГДА ПОДСТРОКА(ВТ.Код, 2, 1)="9" ТОГДА 9
ИНАЧЕ 0 КОНЕЦ
КОНЕЦ) КАК Код
ИЗ
ВТ КАК ВТ
Производительность такого запроса остается под вопросом, тем более когда в справочнике будет много записей. Плюс, нам нужно указывать количество символов строки. В общем, как одно из решение имеет право на жизнь, но к нему точно есть много вопросов.
Если вам нужна помощь в решении конкретной задачи, вы можете обратиться в нашу компанию. Телефон для связи вы найдете в шапке сайта. Со списком услуг вы можете ознакомиться на нашем сайте. Вы также можете приобрести у нас продукцию 1С, получив бесплатно установку ПО и первичную консультацию.