Внедрение 1C Блог О нас
 
1С:Франчайзинг На главную Написать нам

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


ВЫРАЗИТЬ КАК ЧИСЛО в запросе

Встроенная функция запроса ВЫРАЗИТЬ() используется не только для приведения, но и для округления чисел.

Для этого используется такой синтаксис:

ВЫРАЗИТЬ( КАК ЧИСЛО (.))

Общие особенности использования в запросе

Если в качестве параметра передано не числовое значение, это может не вызывать ошибки выполнения запроса, но значение корректно не обработается:

Например, если передан NULL или он сформировался при соединениях таблиц, значение на выходе останется NULL:

Передача же «Неопределено» вызывает ошибку «Несовместимые типы ВЫРАЗИТЬ»:

  • Ссылочные типы  или значения БУЛЕВО вызывают такую же ошибку (ИСТИНА не приводится к 1, а ЛОЖЬ к 0).
  • ВЫРАЗИТЬ строку как число  также нельзя, используя эту функцию.

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

Обработка значения производится по методам округления (0.5 округляется до 1.0), поэтому, если требуется получить целое значение, то следует перед округлением вычесть 0.5 (половину цены шага)

Для округления до десятых в меньшую сторону вычесть 0.5, до сотых 0.05.

Демонстрация использования ВЫРАЗИТЬ в запросе для округления

ВЫБРАТЬ     1.56 КАК ЧислоПример,     ВЫРАЗИТЬ(1.56 КАК ЧИСЛО(15, 0)) КАК ДоЦелого,     ВЫРАЗИТЬ(1.56 — 0.5 КАК ЧИСЛО(15, 0)) КАК ДоЦелогоВниз,     ВЫРАЗИТЬ(1.56 КАК ЧИСЛО(15, 1)) КАК ДоДесятых,     ВЫРАЗИТЬ(1.56 — 0.05 КАК ЧИСЛО(15, 1)) КАК ДоДесятыхВниз,     ВЫРАЗИТЬ(1.56 КАК ЧИСЛО(15, 2)) КАК ДоСотых

Половина денег, которые идут на рекламу, выбрасываются впустую; но как узнать, какая именно половина?

— Уильям Гескет Левер

capitally.ru

Выразить в запросе 1С 8.3

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

Функция Выразить() позволяет привести значение поля запроса 1С к определенному типу. Это может понадобиться в двух случаях:

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

Получите 267 видеоуроков по 1С бесплатно:

Например:

ВЫРАЗИТЬ(Номенклатура.Комментарий КАК СТРОКА(300)) ВЫРАЗИТЬ(Номенклатура.Цена КАК ЧИСЛО(15, 2)) КАК Сумма

2. Преобразовать поле составного типа в поле с одним типом. Это может понадобиться в целях оптимизации запросов. Если в типизированное поле попадёт значение другого типа, то система вернёт NULL, поэтому всегда необходимо дополнительно устанавливать условие в секции «ГДЕ», ограничивая его оператором ССЫЛКА.

Например:

ВЫБРАТЬ … ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Реализация) … ИЗ …

ГДЕ Продажи.Регистратор ССЫЛКА Документ.Реализация

programmist1s.ru

Функция ВЫРАЗИТЬ в языке запросов 1С 8

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

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

  • настройки примитивного типа;
  • поле составного типа в поле одиночного типа;

Рассмотрим эти ситуации более подробно...

Преобразование настроек примитивного типа

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

ВЫБРАТЬ    ВЫРАЗИТЬ(Приходная.Комментарий КАК СТРОКА(300)) КАК Комментарий,    КОЛИЧЕСТВО(Приходная.Ссылка) КАК СсылкаИЗ    Документ.Приходная КАК ПриходнаяСГРУППИРОВАТЬ ПО

    ВЫРАЗИТЬ(Приходная.Комментарий КАК СТРОКА(300))

Еще ситуация когда в запросе используются расчеты, на выходе мы можем получить число с большим количество знаков после запятой (1100,001568794) . Чтобы не обрабатывать это число полсе выполнения запроса его сразу можно обрезать до нужной длины, но важно понимать что число именно обрезается, а не округляется. Пример:

ВЫБРАТЬ    Продажи.Товар,    ВЫРАЗИТЬ(Продажи.Количество * Продажи.Цена КАК ЧИСЛО(15, 2)) КАК СуммаИЗ

    РегистрНакопления.Продажи КАК Продажи

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

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

Допустим, вы задались целью получить номер каждого регистратора у РН Продажи. пишем запрос:

ВЫБРАТЬ РАЗЛИЧНЫЕ    Продажи.Регистратор.НомерИЗ

    РегистрНакопления.Продажи КАК Продажи

Собственно, ничего не может быть проще. Вот только 1С на этапе выполнения преобразует этот запрос без каких либо соединений в запрос с таким количество левых соединений сколько у нас возможных регистраторов. Т.е. если пишут в этот регистр 20 документов, то получим SQL запрос с 20 левыми соединениями. Почему так происходит? Потому что встроенный 1С оптимизатор не совсем хорошо обрабатывает поля получаемые через точку, в данном случае это реквизит Номер. Вот такие пироги, если мы часто захотим получать номер документа, то разумнее всего включить его в реквизиты регистра или же использовать оператор ВЫРАЗИТЬ, но в ущерб краткости:

ВЫБРАТЬ РАЗЛИЧНЫЕ    Продажи.Регистратор.Номер,    ВЫБОР        КОГДА Продажи.Регистратор ССЫЛКА Документ.Расходная            ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Расходная)        ИНАЧЕ ВЫБОР                КОГДА Продажи.Регистратор ССЫЛКА Документ.Реализация                    ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Реализация)            КОНЕЦ        ...     КОНЕЦ КАК НомерИЗ

    РегистрНакопления.Продажи КАК Продажи

Теперь в левом соединении будет участвовать одна конкретная таблица.

В общем случае, стоит внимательно обращаться к данным через точку, т.к. 1С в этом случае использует левое соединение в запросе SQL, что может существенно отразиться на производительности. Это один из моментов оптимизации.

Читайте также

zapros-1c-8.ru

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

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

Синтаксис функции

ВЫРАЗИТЬ ( КАК СТРОКА()

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

Никаких пробелов в конце короткой строки не добавляется.

Другие особенности использования ВЫРАЗИТЬ КАК СТРОКА

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

Преобразовать число как строку в запросе или же ссылку как строку в данной функции (да и в любых других функциях запроса невозможно). Это отличает TSQL запрос select cast(‘321’ as numeric(10) от запроса в 1С.

Функция ПРЕДСТАВЛЕНИЕ(ЧИСЛО), может на выходе запроса выдать строку, но внутри запроса ее результат использовать невозможно даже в качестве параметра для ВЫРАЗИТЬ.

Конкантенация (сложение) строк допустима и с результатом ВЫРАЗИТЬ:

«321»+ ВЫРАЗИТЬ («Строка» КАК СТРОКА(100)) 

Идентификатор ссылочного объекта в запросе получить невозможно и ожидаемое многими начинающими программистами 1С в КАЧЕСТВЕ ВЫРАЗИТЬ(ССЫЛКА как СТРОКА()) не работает: ни наименования, ни кода, ни идентификатора не получится — будет ошибка несовместимости типов.

Вот такая простая функция без особых сюрпризов.

Возможно когда-нибудь в платформе 8.4 1С исправит ситуацию с преобразованиями типов в запрос, а может тут дело в поддержании совместимости всех баз данных.

Вся реклама — это хорошие новости.

— Маршалл Маклюэн

capitally.ru


Смотрите также