строка в число в запросе

Как преобразовать строку в число в запросе 1С

Стандартного решения НЕТ

Если говорить о преобразовании типов данных (в данном случае строку в число), то в коде 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С, получив бесплатно установку ПО и первичную консультацию.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *