Под конец года, я решил разместить еще одну небольшую статейку у вас на ресурсе, где рассмотрю некоторые относительно новые возможности языка запросов 1с. Надеюсь, что данная статья воспримется положительно.

Введение

Всем привет! В данном материале, я решил, что немного отойду от своего основного профиля - практической разработке и изучения возможностей библиотеке стандартных подсистем (БСП) и затрону работу программиста с языком запросов 1с.

Думаю, что материал данной статьи будет полезен всем разработчикам и программистам, а также все желающим, кто хочет разобраться в элементарных запросах платформы и приобщиться к касте 1с-ников). Так же данный материал подойдет как обычная "напоминалка" для программиста

Статья содержит только практические примеры использования вот этих функций языка запросов 1С - вот они:

    Строка(String) – преобразует в строку.
    Sin, Cos, Tan, ASin, ACos, ATan - тригонометрические функции (в радианах)
    Exp - вычисляет результат возведения основания натурального логарифма (числа e) в степень
    Log - натуральный логарифм числа.
    Log10 - десятичный логарифм числа.
    Pow -  возведение в степень.
    Sqrt – квадратный корень.
    Окр(Round) - округляет число до нужной разрядности
    Цел(Int) - вычисляет целую часть числа, полностью отсекая дробную часть.
    ДлинаСтроки(StringLength) – длина строки.
    СокрЛ(TrimL) – отбрасывает пробелы слева.
    СокрП(TrimR) – отбрасывает пробелы справа.
    СокрЛП(TrimAll) – отбрасывает пробелы слева и справа.
    Лев(Left) – получает первые слева символы строки.
    Прав(Right) – получает первые справа символы строки.
    СтрНайти(StrFind) – находит первую позицию подстроки в строке (без учета регистра).
    ВРег(Upper) – преобразует символы строки в верхний регистр.
    НРег(Lower) – преобразует символы строки в нижний регистр.
    СтрЗаменить(StrReplace) – заменяет все вхождения подстроки на другую подстроку (без учета регистра).
    РазмерХранимыхДанных(StoredDataSize) – размер данных в байтах, которые занимают данные параметра.

Для реализации данных примеров можно использовать типовой конструктор запросов или типовую консоль (из предприятия), 1С: Платформу 8.3.20 и мою любимую конфигурацию "Библиотека стандартных подсистем 3.1" (3.1.7.137), режим совместимости которой я поднял до 8.3.20 (без использования). Условно, я разбил эти функции на 11 групп (по одной или несколько функций близких по смыслу).

Примеры

1.Строка(String):

// с ссылками работать не умеет.
// только с примитивными типами
// ошибки не будет только если применить "Выразить"

ВЫБРАТЬ
	Строка(ВЫРАЗИТЬ(_ДемоНоменклатура.Ссылка.Наименование КАК СТРОКА(100))),
	Строка(_ДемоНоменклатура.Цена) КАК Цена,   // преобразовал число в строку
	Строка(ИСТИНА) КАК АА, // преобразовал булево в строку
	Строка(ДАТАВРЕМЯ(1,1,1)) Как ТекДата // пробразовал дату
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

2. Sin, Cos, Tan, ASin, ACos, ATan:

// тригонометрические функции работают исключительно с примитивным типом "число"

ВЫБРАТЬ
	SIN(1) КАК Син1,
	COS(1) КАК Кос2,
	TAN(1) КАК Тан3,
	ASIN(1) КАК АСин1,
	ACOS(0) КАК АКос2,
	ATAN(1) КАК АТан3,
	_ДемоНоменклатура.Ссылка КАК Ссылка
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

3. Exp, Log, Log10, Pow и Sqrt:

// данные математические функции в запросе работают только с типом "число"

 ВЫБРАТЬ
	Exp(1) КАК Exp1,   //2.7
	Log(2.718) КАК Log1,   //0.9999
	Log10(10) КАК Log101, // 1
	Pow(3,2) КАК Pow1, // 9
	Sqrt(9) КАК Sqrt1, // 3
	_ДемоНоменклатура.Ссылка КАК Ссылка
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

4.Окр(Round) и Цел(Int):

// округление или целое число

ВЫБРАТЬ
	ОКР(13240.345235, -2) КАК Округление,  // 13200 
	ЦЕЛ(13240.345) КАК Цел1,  // 13240

	_ДемоНоменклатура.Ссылка КАК Ссылка
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

5. ДлинаСтроки(StringLength):

// здесь определим длину стоки - длина наименования

ВЫБРАТЬ
	ДЛИНАСТРОКИ(_ДемоНоменклатура.Ссылка.Наименование) КАК ДлинаНаименования		
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

6. СокрЛ(TrimL), СокрП(TrimR) и СокрЛП(TrimAll):

// запрос убирает пробелы слева, справа, с обеих сторон строки

ВЫБРАТЬ
	СокрЛ(" "+_ДемоНоменклатура.Ссылка.Наименование+" ") КАК УбратьПробелыСлева,
	СокрП(" "+_ДемоНоменклатура.Ссылка.Наименование+" ") КАК УбратьПробелыСправа,
	СокрЛП(" "+_ДемоНоменклатура.Ссылка.Наименование+" ") КАК УбратьПробелы
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

7. Прав(Right) и Лев(Left):

// обрезаем строку и выводим результат

ВЫБРАТЬ
	Лев(_ДемоНоменклатура.Ссылка.Наименование,5) КАК Слева5,
	Прав(_ДемоНоменклатура.Ссылка.Наименование,10) КАК Справа10	
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

8. СтрНайти(StrFind):

ВЫБРАТЬ
	СтрНайти(_ДемоНоменклатура.Ссылка.Наименование, "коллекция") КАК Нашли1  // номер символа вхождения
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

9. ВРег(Upper) и НРег(Lower):

// переводим в заглавные или строчные буквы

ВЫБРАТЬ
	Врег(_ДемоНоменклатура.Ссылка.Наименование) КАК Заглавными,
	Нрег(_ДемоНоменклатура.Ссылка.Наименование) КАК Прописными
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

10. СтрЗаменить(StrReplace):

ВЫБРАТЬ
	СтрЗаменить(_ДемоНоменклатура.Ссылка.Наименование, "журнал","газета") КАК Нашли1  // меняем подстроку "журнал" на "газета"
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура

11. РазмерХранимыхДанных(StoredDataSize):

ВЫБРАТЬ
	РазмерХранимыхДанных(_ДемоНоменклатураПрисоединенныеФайлы.ФайлХранилище) КАК ФайлХранилище // применяю к реквизиту с типом ХранилищеЗначений, хотя можно применить к любому реквизиту (размер в байтах)
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатураПрисоединенныеФайлы КАК _ДемоНоменклатураПрисоединенныеФайлы
		ПО _ДемоНоменклатура.ФайлКартинки = _ДемоНоменклатураПрисоединенныеФайлы.Ссылка

Так, ну вроде, все проверено - все работает. При строгой типизации - ошибок в применении не будет.

Выводы статьи

Спасибо за прочтение. В материале представлены практические примеры применения новых функций языка запросов 1с. Эти функции характерны для платформы 1с предприятия версии от 8.3.20. Надеюсь, что вам понравилась данная статья и вы на один шаг приблизились к миру 1С.

Комментарии (8)


  1. Naf2000
    15.12.2022 19:31

    Грустно это всё. По сути эти функции есть в практически любом диалекте SQL. И вот наконец 1с сподвиглась их добавить.

    В то время как есть linq to sql запросы в 1с создаются строками.


    1. Pastor_01
      16.12.2022 09:12

      Чуть-чуть не так. Этим новшествам уже как год. Хотя, да, согласен, хотелось бы пораньше.


  1. fedorro
    15.12.2022 19:33
    -2

    SIN COS ATAN Pow Sqrt

    Интересно когда доработают: СИН, КОС, АТАН, СТЕП, КОР.


  1. R72
    15.12.2022 19:51
    -2

    О, смотрю карму минуснули за статью. Хабр так жесток бывает....


  1. echo10
    15.12.2022 21:03

    Когда уже многопоточность будет по типу анонимных методов с захватом параметров или просто отдельных методов, поддержка функций типа Future/Promise, всякие мьютексы, критические секции, когда уже будет правильный DELAY или SLEEP вызовом метода с параметром вместо горожения регламентных заданий или (о чудо) созданием грелки процессора с циклом WHILE, проверяющим текущее время.

    *Где в 1С Бухгалтерии, автосалоне, магазинчике, etc итд нужен SIN/COS?


    1. Pastor_01
      16.12.2022 09:14

      1С это далеко не только одна Бухгалтерия. Я тригонометрию использовал при расчете расстояния между точками. Теорема Пифагора там уже не прокатывала.


    1. vis_inet
      16.12.2022 10:15

      Подскажите, как именно можно было бы применять в 1С ваши пожелания?


  1. aixx
    16.12.2022 07:38

    Ну раз добавили арктангенс в 1С, то теперь заживем! Они шли к этому последние 10 лет.