МАКСИМУМ(выразить(Номенклатура.Код как число(6,2))) - к сожалению вот так преобразовать строку в число не получится!

На помощь придут вот такие функции. Нашел их тут.

Функция ТекстЗапросаИзЧислаВСтроку(пИмяПоля, пДлинаЦел, пДлинаДробь, пЛидирующийСимвол="")
    лЗапрос=Новый Запрос("ВЫБРАТЬ ВЫРАЗИТЬ(0.5 КАК ЧИСЛО (15, 0)) КАК Проверка");
    лВыборка=лЗапрос.Выполнить().Выбрать();
    лВыборка.Следующий();
    лЗапросОкругляетПоАрифметическимПравилам=лВыборка.Проверка=1;
    
    лТекст="ВЫБОР КОГДА "+пИмяПоля+"<0 Тогда ""-"" ИНАЧЕ """" КОНЕЦ "+Символы.ПС;
    лИмяПоляАбс=" ВЫБОР КОГДА "+пИмяПоля+"<0 ТОГДА -"+пИмяПоля+" ИНАЧЕ "+пИмяПоля+" КОНЕЦ ";
    лПараметр=Pow(10, пДлинаЦел-1);
    Для лИнд=1 По пДлинаЦел+пДлинаДробь цикл
        лТекст=лТекст+?(лИнд=пДлинаЦел+1, "+"".""+", "+");
        лТекст=лТекст+" ВЫБОР "+Символы.ПС+
        ?(лИнд<пДлинаЦел, " КОГДА "+лИмяПоляАбс+" < "+Формат(лПараметр, "ЧРД=.; ЧГ=")+" ТОГДА """+пЛидирующийСимвол+""" "+Символы.ПС, "");
        Для лЦифра=0 По 9 Цикл
            лТекст=лТекст+" КОГДА "+лИмяПоляАбс+"-"+Формат(лПараметр*10, "ЧРД=.; ЧГ=")+"*ВЫРАЗИТЬ(("+лИмяПоляАбс+?(лЗапросОкругляетПоАрифметическимПравилам, "-"+Формат(лПараметр*5, "ЧРД=.; ЧГ="), "")+")/"+Формат(лПараметр*10, "ЧРД=.; ЧГ=")+" КАК ЧИСЛО(15, 0))"+" >= "+Формат((9-лЦифра)*лПараметр, "ЧН=0; ЧРД=.; ЧГ=")+" ТОГДА """+Формат(9-лЦифра, "ЧН=0; ЧРД=.; ЧГ=")+""" "+Символы.ПС;
        КонецЦикла;
        лТекст=лТекст+" ИНАЧЕ ""0"""+Символы.ПС+" Конец "+Символы.ПС;
        лПараметр=лПараметр/10;
    КонецЦикла;
    Сообщить(лТекст); 
    Возврат лТекст;
КонецФункции

Функция ТекстЗапросаИзСтрокиВЧисло(пИмяПоля, пДлинаСтроки, пСимволРазделителя=".")
    лТекст="ВЫБОР ";
    Для лДлинаЦелойЧасти=0 По пДлинаСтроки Цикл
        Если лДлинаЦелойЧасти=пДлинаСтроки Тогда 
            лТекст=лТекст+"ИНАЧЕ"+Символы.ПС;
        Иначе
            лТекст=лТекст+"КОГДА ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""+пСимволРазделителя+""" ИЛИ ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""" ТОГДА "+Символы.ПС;
        КонецЕсли; 
        Если лДлинаЦелойЧасти=0 Тогда лТекст=лТекст+"    0"+Символы.ПС; КонецЕсли; 
        Для лИнд=1 По лДлинаЦелойЧасти Цикл
            лТекст=лТекст+"    ВЫБОР "+Символы.ПС;
            Для лЦифра=0 По 9 Цикл
                лТекст=лТекст+"    КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
            КонецЦикла;
            лТекст=лТекст+"    ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "*"+Формат(Pow(10, лДлинаЦелойЧасти-лИнд), "ЧРД=.; ЧГ=0")+"+")+Символы.ПС;
        КонецЦикла;
        Для лИнд=лДлинаЦелойЧасти+2 По пДлинаСтроки Цикл
            лТекст=лТекст+"+ ВЫБОР";
            Для лЦифра=0 По 9 Цикл
                лТекст=лТекст+"    КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
            КонецЦикла;
            лТекст=лТекст+"    ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "/"+Формат(Pow(10, лИнд-лДлинаЦелойЧасти-1), "ЧРД=.; ЧГ=0"))+Символы.ПС;
        КонецЦикла;
    КонецЦикла;
    лТекст=лТекст+"КОНЕЦ";
    Возврат лТекст;
КонецФункции



Использовать их так:

Процедура КнопкаВыполнить1(Кнопка)
    лЗапрос=Новый Запрос;
    лЗапрос.Текст="ВЫБРАТЬ ""Полученная строка : ""+"+ТекстЗапросаИзЧислаВСтроку(12, 2, 0)+" КАК Строка";
    лТзЗапроса=лЗапрос.Выполнить().Выгрузить();
    лТзЗапроса.ВыбратьСтроку(); 
КонецПроцедуры

Процедура КнопкаВыполнить2(Кнопка)
    лЗапрос=Новый Запрос;
    лЗапрос.УстановитьПараметр("а", "1333.3");
    лЗапрос.Текст="ВЫБРАТЬ "+ТекстЗапросаИзСтрокиВЧисло("&а", 6)+" КАК Число";
    Сообщить(лЗапрос.Текст); 
    лТзЗапроса=лЗапрос.Выполнить().Выгрузить();
    лТзЗапроса.ВыбратьСтроку(); 
КонецПроцедуры



Мой пример.

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

&НаСервере
функция получитьИДТовараНаСервере()
		
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МАКСИМУМ("+ТекстЗапросаИзСтрокиВЧисло("Номенклатура.Код", 6)+") КАК Код
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.ЭтоГруппа = ЛОЖЬ";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		возврат (формат(ВыборкаДетальныеЗаписи.код+1,"ЧРГ=; ЧГ=0"));
	КонецЦикла;
	
	

КонецФункции

Добавить комментарий


Защитный код
Обновить