1с выразить как число в запросе
Перейти к содержимому

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

  • автор:

 

ВЫРАЗИТЬ в запросах 1С 8.3 — применение на примерах

Оператор «ВЫРАЗИТЬ» в языке запросов 1С 8.3 используют в двух случаях:

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

Рассмотрим на примерах работу такого оператора.

ВЫРАЗИТЬ КАК Строка

Для работы со строковым типом данных такой оператор может пригодиться, когда необходимо жёстко задать размерность строки.

Синтаксис:

ВЫРАЗИТЬ(<Выражение> КАК Строка(<ДлинаСтроки>))

Пример:

ВЫБРАТЬ

ВЫРАЗИТЬ(Номенклатура.Наименование КАК Строка(1)) КАК НаименованиеДлина_1

ИЗ

Справочник.Номенклатура КАК Номенклатура

В таком примере выбираем все наименования из справочника «Номенклатура», затем с помощью конструкции «ВЫРАЗИТЬ» совместно с оператором «Строка», ограничиваем размер строки поля выборки до одного символа.

ВЫРАЗИТЬ КАК Число

В полях выборки запроса имеющих числовой тип данных, с помощью оператора «ВЫРАЗИТЬ» возможно, контролировать длину целой и дробной части числа. В случаях, когда в результате такого контроля будет уменьшено количество знаков в числе, произойдёт округление по математическим правилам.

Синтаксис:

Получите понятные самоучители по 1С бесплатно:

ВЫРАЗИТЬ(<Выражение> КАК Число(<ДлинаЦелойЧасти>.<ДлинаДробнойЧасти>))

Пример№1:

ВЫБРАТЬ

3.55 КАК НашеЧисло,

ВЫРАЗИТЬ(3.55 КАК Число(15,1)) КАК РезультатОкругления

Результат:

Пример№2:

ВЫБРАТЬ

10/3 КАК Результат,

ВЫРАЗИТЬ(10/3 КАК Число(15,2)) КАК РезультатОкругления

Результат:

Глядя на результаты примеров понятно, что оператор «ВЫРАЗИТЬ» округляет числа по правилу «до ближайшего целого».

«ВЫРАЗИТЬ» для составного типа данных и оптимизация запросов

С помощью оператора «ВЫРАЗИТЬ», для в полей имеющих составной тип данных, возможно ограничить попадание значений которые не соответствуют определённому типу данных. Причём такие ограничения можно сделать ещё на этапе выборки данных. Такие действия приводят к неявной оптимизации запросов. Рассмотрим подробно на примере.

Есть запрос, который выбирает всех покупателей, из существующих в базе документов «ПродажаТоваров». У документов такого вида реквизит «Покупатель» имеет составной тип данных:

  • <СправочникСсылка.Контрагенты>
  • <СправочникСсылка.Сотрудники>.

Запрос:

ВЫБРАТЬ

ПродажаТоваров.Ссылка КАК СсылкаНаДокументПродажи,

ПродажаТоваров.Покупатель КАК СсылкаНаПокупателя

ИЗ

Документ.ПродажаТоваров КАК ПродажаТоваров

Результат:

Следует понимать, что данные в поле «СсылкаНаПокупателя» формируются путём неявного левого соединения с таблицами «Контрагенты.Ссылка» из справочника «Контраенты» и «Сотрудники.Ссылка» из справочника «Сотрудники». Такие соединения в запросах 1С происходят, когда мы обращаемся к подчинённому полю через точку (разыменовываем поле). В нашем случае мы обращаемся к полю «Покупатель».

Визуальное представление работы такого запроса:

Если бы стояла задача отобрать только те документы, в которых покупателем был сотрудник. То наиболее оптимальным решением с точки зрения скорости выполнения запроса было бы вовсе запретить обращаться к справочнику «Контрагенты» так как данные из этого справочника для нас излишни. С такой задачей легко справится оператор «ВЫРАЗИТЬ» и запрос мог бы выглядеть так:

Запрос:

ВЫБРАТЬ

ПродажаТоваров.Ссылка КАК СсылкаНаДокументПродажи,

ВЫРАЗИТЬ(ПродажаТоваров.Покупатель КАК Справочник.Сотрудники) КАК СсылкаНаПокупателя

ИЗ

Документ.ПродажаТоваров КАК ПродажаТоваров

Результат:

Однако, как мы можем видеть из результата запроса, поля выборки, которые не удовлетворяют условиям нашего отбора, получили значения «NULL». По этому реализуя отборы с помощью конструкции «ВЫРАЗИТЬ» во избежание дальнейших ошибок правильно накладывать дополнительное условие, например с помощью оператора «Где». Тогда запрос мог бы выглядеть так:

Запрос:

ВЫБРАТЬ

 

ПродажаТоваров.Ссылка КАК СсылкаНаДокументПродажи,

ВЫРАЗИТЬ(ПродажаТоваров.Покупатель КАК Справочник.Сотрудники) КАК СсылкаНаПокупателя

ИЗ

Документ.ПродажаТоваров КАК ПродажаТоваров

Где

ПродажаТоваров.Покупатель ССЫЛКА Справочник.Сотрудники

Результат:

Возможные ошибки

С помощью оператора «ВЫРАЗИТЬ» не представляется возможным преобразование типов данных. Например, строку в число:

ВЫРАЗИТЬ в запросе 1с

ВЫРАЗИТЬ как строку в запросе 1с используется для уменьшения длины строки.

Данная конструкция в 1С используется в запросе для усечения длины строки, а также для приведения строки неограниченной длины к переменной строке с фиксированным ограничением.

Строка-источник- тестовая величина, длину которой планируем уменьшать.

  • Если на входе строка больше указанной длины — она усекается.
  • Если меньше — остается неизменной.
  • При передаче строки неограниченной длины происходит тоже самое.

ДлинаРезультата- числовое значение равное длине строки результата.

Сложение строк в запросе 1с

Конкатенация (сложение) строк

Сложение или конкатенация строк возможна с использованием функции ВЫРАЗИТЬ.

Особенности применения функции ВЫРАЗИТЬ

Передача NULL в качестве параметра не вызывает ошибки, но на выходе будет NULL (не строкой).
Передача для преобразования других типов вызывает ошибку «Несовместимые типы ВЫРАЗИТЬ».

Преобразовать число как строку в запросе или же ссылку как строку в данной функции (да и в любых других функциях запроса невозможно).

Для поиска или сравнения строки в запросе 1с можно применять ключевое слово ПОДОБНО.

Приведение типов в языке запросов 1С.

В этой статье разберем возможности приведения типов в языке запросов 1С, которые предоставляет функция «Выразить».
Рассмотрим несколько вариантов применения этой функции.
И первый вариант – округление чисел.

Для этого необходимо использовать функцию Выразить в следующем формате:

Выразить(<Число> как Число(<ДлинаЧисла>,<Точность>))

Где:
Число — поле, параметр которое нужно округлить
ДлинаЧисла — максимальная длина числа
Точность — точность округления числа

Параметры и длинна и точность должны быть целыми положительными числами.
Посмотрите, как работает эта функция на рисунке ниже.

Второй вариант применения – приведение строк. Очень часто в конфигурациях используются строки неограниченной длинны, что накладывает некоторые ограничения. Например, мы не можем сравнивать строки неограниченной длины.
В запросе, который приведен ниже, поле ПолноеНаименование имеет тип строка неограниченной длины, и этот запрос не будет работать.

Для того что бы он работал, необходим поле неограниченной длины привести в строку с определенной длинной, делается это при помощи функции Выразить в следующем формате:

Выразить(<Строка> как Строка(<ДлинаСтроки>)

Где
ДлинаСтроки – максимальная длина, к которой будет приведена строка.
Переделаем запрос: будем в условии приводить неограниченную строку к строке с определенной длинной. Тогда ни каких ошибок не будет.

Рассмотрим последний и, я бы сказал, самый главный вариант её применения: при работе с полями составного типа.
Ниже приведены два запроса, в которых используются поля составного типа. Первый неправильный, а второй правильный.

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

Выразить(<Документ> как Документ.<ИмяТаблицы>)
Выразить(<Справочник> как Справочник.< ИмяТаблицы > )
.

Где
ИмяТаблицы — название объекта в конфигураторе 1С.

Всегда используйте функцию выразить, когда работаете с составными типами, это существенно оптимизирует запрос.

Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.

В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком

Для моих читателей, купон на скидку 25%: hrW0rl9Nnx

Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:

Можете перечислить любую сумму напрямую:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

One Reply to “Приведение типов в языке запросов 1С.”

Добрый день, в 1С нельзя кастовать типы в запросе. Функция выразить используется для полей составного типа, что бы оставить один из них.

Округление результатов арифметических операций в запросах

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

2. При выполнении арифметических операций в запросах к базе данных платформа1С:Предприятия поддерживает точность вычислений до 8 разрядов дробной части. Однако, из-за особенностей работы различных СУБД в некоторых ситуациях точность результатов может отличаться от 8. Более подробно о вычислении разрядности результатов можно почитать в статье ИТС Разрядность результатов выражений и агрегатных функций в языке запросов .

Если точность результата выполнения запроса к базе данных, содержащего

  • арифметические операции деления,
  • агрегатные функции СРЕДНЕЕ,
  • арифметические операции умножения, если каждый из множителей может иметь дробную часть,

различается на различных СУБД, то рекомендуется к операндам и/ или результатам этих операций применять оператор явного приведения разрядности и точности числовых данных:

Оператор ВЫРАЗИТЬ следует применять к операндам, если на какой-нибудь СУБД точность получаемого результата недостаточна. Например, требуется 10 разрядов после запятой, а получается 6.

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

Важно иметь в виду, что на разных СУБД имеются различные ограничения на максимальную разрядность десятичных чисел. Самое жесткое ограничение — это 31 разряд в целой и дробной частях. Чем меньшее значение разрядности будет указано для операндов, тем выше сможет быть точность результата. Например, если в результате требуется не менее 10 разрядов дробной части, первый операнд заведомо помещается в 15 разрядов целой части, а второй операнд заведомо помещается в 5 знаков целой части, то выражение может быть записано так:

Опрератор ВЫРАЗИТЬ следует применять к результату, если точность вычислений на всех СУБД достаточна, но на некоторых она больше, а на других меньше. При этом указанная общая разрядность результата должна быть минимальной, но не меньше той, которая достаточна для представления значений результата. Если в приведенном примере известно, что Знаменатель не может быть меньше 0.00001, то для представления результата достаточно 20 разрядов целой части. В этом случае выражение может быть записано так:

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

 

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

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