1с выразить null как число
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
1. Если в операции деления заранее известны порядки числителя и знаменателя, то следует по возможности избегать выполнения деления числа заведомого маленького порядка на число заведомо большого порядка. Например, вместо:
0.02 / 28346 * 9287492
0.02 * 9287492 / 28346
2. При выполнении арифметических операций в запросах к базе данных платформа 1С:Предприятия поддерживает точность вычислений до 8 разрядов дробной части. Однако, из-за особенностей работы различных СУБД в некоторых ситуациях точность результатов может отличаться от 8. Более подробно о вычислении разрядности результатов можно почитать в статье ИТС Разрядность результатов выражений и агрегатных функций в языке запросов.
Если точность результата выполнения запроса к базе данных, содержащего
- арифметические операции деления,
- агрегатные функции СРЕДНЕЕ ,
- арифметические операции умножения, если каждый из множителей может иметь дробную часть,
различается на различных СУБД, то рекомендуется к операндам и/ или результатам этих операций применять оператор явного приведения разрядности и точности числовых данных:
ВЫРАЗИТЬ(. КАК Число(m, n))
Оператор ВЫРАЗИТЬ следует применять к операндам, если на какой-нибудь СУБД точность получаемого результата недостаточна. Например, требуется 10 разрядов после запятой, а получается 6.
При этом указанная общая разрядность операндов должна быть минимальной, но не меньше той, которая достаточна для представления значений каждого из операндов. Неоправданное завышение разрядности может привести к потере точности последующих вычислений и несколько снизить скорость выполнения запроса.
Важно иметь в виду, что на разных СУБД имеются различные ограничения на максимальную разрядность десятичных чисел. Самое жесткое ограничение — это 31 разряд в целой и дробной частях. Чем меньшее значение разрядности будет указано для операндов, тем выше сможет быть точность результата. Например, если в результате требуется не менее 10 разрядов дробной части, первый операнд заведомо помещается в 15 разрядов целой части, а второй операнд заведомо помещается в 5 знаков целой части, то выражение может быть записано так:
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10)) / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Результат
ИЗ Таблица КАК Таблица
Оператор ВЫРАЗИТЬ следует применять к результату, если точность вычислений на всех СУБД достаточна, но на некоторых она больше, а на других меньше. При этом указанная общая разрядность результата должна быть минимальной, но не меньше той, которая достаточна для представления значений результата. Если в приведенном примере известно, что Знаменатель не может быть меньше 0.00001, то для представления результата достаточно 20 разрядов целой части. В этом случае выражение может быть записано так:
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель / Таблица.Знаменатель КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица
Иногда может быть целесообразно выполнить приведения к требуемой точности как операндов, так и результата. Например:
ВЫБРАТЬ
ВЫРАЗИТЬ(ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10)) / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица
В языке определены следующие виды арифметических операций.
- Сложение (Оп1 + Оп2)
- Вычитание (Оп1 — Оп2)
- Умножение (Оп1 * Оп2)
- Деление (Оп1 / Оп2)
- Остаток от деления (Оп1 % Оп2)
- Унарный минус (-Оп1)
Арифметические операции имеют один или два операнда, в зависимости от типа которых операция имеет ту или иную семантику. Тот или иной семантический вариант операции определяется по первому операнду. В случае несовпадения типа второго операнда с требуемым значение преобразуется к требуемому типу в соответствии с правилами преобразования типов. Если тип первого операнда не соответствует ни одному из допустимых типов, то в зависимости от ситуации может производиться преобразование типов или возбуждаться состояние ошибки выполнения.
Сложение определено для следующих типов операндов:
Дата + Число (к дате прибавляется число секунд)
Вычитание определено для следующих типов операндов:
Дата — Число (от даты отнимается число секунд)
Дата — Дата (результатом является разница между двумя датами, измеренная в секундах)
Математические выражения – выражения, содержащие знаки арифметических операций и подчиняющиеся при вычислении арифметическим правилам. Результатом вычисления таких выражений является значение одного из простых (базовых) типов языка.
Математические выражения используются в правой части оператора присваивания, а также в качестве параметров процедур и функций
Во встроенном языке определены арифметические операции двух видов:
Унарные арифметические операции
Унарный минус
Данная арифметическая операция выполняет получение отрицательного (противоположного) значения.
Унарный минус определен только для типа Число . Во всех остальных случаях будет выдано исключение « Операция получения отрицательного значения не определена для строковой величины »
Бинарные арифметические операции
Операция сложения
Данная арифметическая операция выполняет добавление значения второго операнда к значению первого. При этом тип значения получаемого результата определяется типом первого операнда. Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Применимость операции сложения:
ОперандА | ОперандБ | Результат | Комментарий |
---|---|---|---|
Число | Число, Строка, Дата | Число | |
Дата | Число | Дата | К исходной дате добавляется количество дней, заданное вторым оператором |
Строка | Строка, Число, Дата | Строка | К исходной строке добавляются все символы второй. Длина конечной строки определяется суммой длин обеих строк. Такую операцию называют еще конкатенацией строк |
Операция вычитания
Данная арифметическая операция выполняет вычитание значения второго операнда из значения первого. При этом тип значения получаемого результата определяется типом первого операнда. Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Применимость операции вычитания:
ОперандА | ОперандБ | Результат | Комментарий |
---|---|---|---|
Число | Число, Строка, Дата | Число | |
Дата | Число | Дата | От исходной даты отнимается количество дней, заданное вторым оператором |
Дата | Дата | Число | Вычисляется количество дней на которое первая дата больше второй |
Операция умножения
Данная арифметическая операция выполняет умножение значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Операция деления
Данная арифметическая операция выполняет деление значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.
Остаток от деления
Данная арифметическая операция вычисляет остаток от деления значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов. Следует учитывать, что оба операнда операции округляются до целого значения.
Приоритет выполнения арифметических операций
При вычислении результата математических выражений, программа руководствуется приоритетом арифметических операций (в порядке убывания):
- Унарный минус;
- Умножение, деление, остаток от деления;
- Сложение и вычитание;
Для того, чтобы повлиять на порядок вычислений можно использовать круглые скобки.
(0)
У меня есть российский паспорт, но его номер никто не знает, поэтому его номер NULL, а вот те кто родился в 2010 году, еще паспорта не имеют поэтому их номер - пустое значение.
А вот маньяк, гражданин Украины, непонятно есть ли у него гражданство и Российски паспорт, поэтому его номер - неопределенно
те кто родился в 2010 году, еще паспорта не имеют поэтому их номер - NULL
(12) ты всё напутал твой паспорт - Неопределено, у тех, кто родился в 2010 - NULL, у Маньяка - тоже Неопределено
(16) Это не пустое значение, а значение по умолчанию. Хотя обычно, если не ясно, есть что-то или нет, то считается, что нет, а тут наоборот, считается что есть
+ так же нет пустой даты, есть Дата("00010101"), что и является пустой датой.
И т.д. другие грабли.
NULL в Системах управления базами данных (СУБД) — специальное значение (псевдозначение), которое может быть записано в поле таблицы базы данных (БД). NULL соответствует понятию «пустое поле», то есть «поле, не содержащее никакого значения». Введено для того, чтобы различать в полях БД пустые (визуально не отображаемые) значения (например, строку нулевой длины) и отсутствующие значения (когда в поле не записано вообще никакого значения, даже пустого).
Мнение 1: NULL является необходимым и обязательным для любой БД, претендующей на реляционность. В частности без него невозможно корректно построить внешнее соединение (OUTER JOIN) строк из двух таблиц. Именно этой точки зрения придерживался Э. Кодд, явно включив его в качестве третьего из 12 правил для реляционных СУБД. Именно этот принцип закреплен в последних стандартах на язык SQL .
Мнение 2: Значение NULL не требуется, а его использование — следствие ошибки проектирования БД. В базе данных, разработанной в полном соответствии с критериями нормализации, не может быть полей без значений, а значит, не нужно и специальное псевдозначение для таких полей. На практике, однако, из соображений эффективности, нередко оказывается удобным пренебречь некоторыми из правил нормализации, но одним из видов платы за такое пренебрежение является появление пустых полей, для которых и предназначен NULL.
Замечание: нет такого типа - "пустое значение", но есть функция ПустоеЗначение(), которая определяет заполненоность и возвращаеть Истина/Ложь
(0) Пустое значение: "В этот гараж можно поставить что угодно, но ожидается, что в нем должна стоять машина марки Тойота, хотя ее там сейчас нет"
Встроенная функция запроса ВЫРАЗИТЬ() используется не только для приведения, но и для округления чисел.
Для этого используется такой синтаксис:
Общие особенности использования в запросе
Если в качестве параметра передано не числовое значение, это может не вызывать ошибки выполнения запроса, но значение корректно не обработается:
Например, если передан 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 ) ) КАК ДоСотых
Реклама должна объяснить нам, без каких излишеств мы не можем прожить.
— Э.Макензи , 14 фраз
Кроме преобразования строк и числа функция применяется для выделения одного типа в составных реквизитах.
Зачем использовать ВЫРАЗИТЬ для полей составного типа?
Поля составного типа — реквизиты, в которых допустимо указание значения различных типов.
В случае, когда такое поле не заполнено в нём хранится НЕОПРЕДЕЛЕНО, с которым не совсем удобно работать на выходе:
- необходимо постоянно проверять на заполнено
- если используется обращение к реквизитам через точку, при обращении возможно появление ошибки.
Пример №1:
Есть реквизит составного типа: Число+Перечисление
Если выполнить ВЫРАЗИТЬ(Реквизит как ЧИСЛО(15,0)) тогда на выходе получится NULL, что ничем не лучше.
Если вызвать ВЫРАЗИТЬ(Реквизит КАК Перечисление.ВидыЗаявок), в результате получится значение Перечисления.ВидыЗаявок.Пустая(), что вполне удобно.
Вышестоящий пример я привел для ситуации, когда удобство не так заметно.
Пример №2:
Реквизит составного типа: Справочник.ФизическиеЛица+Справочник.Сотрудники
Если вы сделаете отбор в запросе:
ГДЕ
Сотрудник ССЫЛКА Справочник.Сотрудник
У вас на выходе получатся только записи, где реквизит Сотрудник типа сотрудники, но если это поле пустое, там будет Неопределено.
В случае использования конструкции
ВЫРАЗИТЬ (Сотрудник как Справочник.Сотрудники) как ПолеСотрудник
В данном поле всегда будет значение ссылки и допустимо обращение к нему: в момент обработки результата запроса «ПолеСотрудник.Наименование», ПолеСотрудник.Пустая(), не вызывая ошибки.
Дополнительное преимущество такого использования:
В случае если составное поле имеет тип Справочник.Ссылка или Документ.Ссылка (любой справочник и любой документ, совместно) при выполнении запроса 1С присоединит все связанные таблицы:
- В лучшем случае это замедлит выполнение запроса.
- В больших конфигурациях типа УПП или ERP, такие запросы могут вызвать ошибку превышения количества таблиц в запросе — он попросту не выполнится.
Если же вы знаете, что там будет и ограничите значения функцией ВЫРАЗИТЬ, такого не происходит — и вы помогаете оптимизатору запросов, а для файловой версии это может оказаться критичным.
В типовых конфигурациях реквизит «ДокументОснование»,»ДокументОприходования», «Партия» или «Сделка», торговых документов чаще всего нуждается в таком преобразовании, т.к. составные поля используются редко: чаще разносят по различным реквизитам, которые видимы в зависимости от вида операции/ситуации.
Другие статьи про работу с ВЫРАЗИТЬ:
Всякая реклама есть средство отделить человека от его денег.
— Джон Пристли
Данная конструкция в 1С используется в запросе для усечения длины строки,а также для приведения строки неограниченной длины к переменной строке с фиксированным ограничением.
Синтаксис функции
- Если на входе строка больше указанной длины — она усекается.
- Если меньше — остается неизменной.
- При передаче строки неограниченной длины происходит тоже самое.
Никаких пробелов в конце короткой строки не добавляется.
Другие особенности использования ВЫРАЗИТЬ КАК СТРОКА
Передача NULL в качестве параметра не вызывает ошибки, но на выходе будет NULL (не строкой).
Передача для преобразования других типов вызывает ошибку «Несовместимые типы ВЫРАЗИТЬ».
Преобразовать число как строку в запросе или же ссылку как строку в данной функции (да и в любых других функциях запроса невозможно). Это отличает TSQL запрос select cast(‘321’ as numeric(10) от запроса в 1С.
Функция ПРЕДСТАВЛЕНИЕ(ЧИСЛО), может на выходе запроса выдать строку, но внутри запроса ее результат использовать невозможно даже в качестве параметра для ВЫРАЗИТЬ.
Конкантенация (сложение) строк допустима и с результатом ВЫРАЗИТЬ:
«321»+ ВЫРАЗИТЬ («Строка» КАК СТРОКА(100))
Идентификатор ссылочного объекта в запросе получить невозможно и ожидаемое многими начинающими программистами 1С в КАЧЕСТВЕ ВЫРАЗИТЬ(ССЫЛКА как СТРОКА()) не работает: ни наименования, ни кода, ни идентификатора не получится — будет ошибка несовместимости типов.
Вот такая простая функция без особых сюрпризов.
Возможно когда-нибудь в платформе 8.4 1С исправит ситуацию с преобразованиями типов в запрос, а может тут дело в поддержании совместимости всех баз данных.
Клиент получает ту рекламу, которую он заслуживает!
— Дэвид Огилви
Читайте также: