1с скд округлить число
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
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С 8.2 или 8.3 необходимо округлить значение «на лету», непосредственно в запросе. Сделать это очень просто. Для этого используется конструкция «Выразить()». Округление проходит по арифметическим правилам (в большую или меньшую сторону, в зависимости от последнего символа).
(0 голосов, в среднем: 0 из 5)
Поддержите нас, расскажите друзьям!
СПРОСИТЕ в комментариях!
ВЫРАЗИТЬ( 10/3 КАК (Число(10,2)) КАК РезультатДеления // система разве возвратит значение 3.3?
А не 3.33?
Да, вы правы, это опечатка
А если нужно целую часть «Обрезать»?
Число = Число — Окр(Число);
Если в запросе:
10/3 — ВЫРАЗИТЬ( 10/3 КАК (Число(10,0))
ВЫРАЗИТЬ( КАК Число( ,
При использовании данного сайта, вы подтверждаете свое согласие на использование файлов cookie в соответствии с настоящим уведомлением в отношении данного типа файлов. Если вы не согласны с тем, чтобы мы использовали данный тип файлов, то вы должны соответствующим образом установить настройки вашего браузера или не использовать сайт.
Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.
Встроенная функция запроса ВЫРАЗИТЬ() используется не только для приведения, но и для округления чисел.
Для этого используется такой синтаксис:
ВЫРАЗИТЬ( КАК ЧИСЛО ( . ))
Общие особенности использования в запросе
Если в качестве параметра передано не числовое значение, это может не вызывать ошибки выполнения запроса, но значение корректно не обработается:
Например, если передан NULL или он сформировался при соединениях таблиц, значение на выходе останется NULL:
Передача же «Неопределено» вызывает ошибку «Несовместимые типы ВЫРАЗИТЬ»:
- Ссылочные типы или значения БУЛЕВО вызывают такую же ошибку (ИСТИНА не приводится к 1, а ЛОЖЬ к 0).
- ВЫРАЗИТЬ строку как число также нельзя, используя эту функцию.
Поэтому следует обрабатывать/проверять значение до его передачи в качестве параметра функции.
Обработка значения производится по методам округления (0.5 округляется до 1.0), поэтому, если требуется получить целое значение, то следует перед округлением вычесть 0.5 (половину цены шага)
Для округления до десятых в меньшую сторону вычесть 0.5, до сотых 0.05.
Демонстрация использования ВЫРАЗИТЬ в запросе для округления
Никакая реклама не поможет продать то, что продать невозможно.
Формат не предлагать, он влияет только на отображение, но не округление.
Просто число у меня получается
, которое необходимо сократить до 12,75.
Сама формула для этого поля следующая:
Пытался сделать так:
Ругается на неопознаный оператор ВЫБОР > КОГДА.
Написал как то не так?
(12) 12.732 округлить можно до 13, или до 12.7 или 12.73 или 12.74, но никак не в 12.75 :-) попробуйте просто ОКР()
(26) Ну так там ТС решил проблему, ТС молодец =)
А то что там в комментах кто-то что-то подсказал, это мелочи)))
(26) хочешь стартманю - напиши статью. Но это слишком дешевый труд, поэтому лучше закрой пару часов за это время у заказчика )))
(28) Я просил у вас совета? Что-то не припоминаю.
Как раз на такой случай Жванецкий сказал: "Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти"
Поскольку вы пренебрегли первой частью этого афоризма, то считайте, что я отказался от второй. Счастливого пути! :-P
(15)
Если на вкладке ресурсы - нужно тип брать в кавычки и через запятую ВЫРАЗИТЬ(ВыражениеВозвращабщееЧисло, "ЧИСЛО(15, 2)")
Решение очень простое
Никаких "Выбор .. Когда .. Тогда" не нужно
В вопросе не уточнен принцип округления
Поэтому привожу универсальное решение для разных вариантов
Вот универсальное решение:
Где
[ВашеЧисло] = 12,7320513433843053416917466128131335 (или любое другое)
А [ДопЧисло] зависит от способа округления
1) Если
12.70 => 12.70
12.71 => 12.75
12.72 => 12.75
12.73 => 12.75
12.74 => 12.75
12.75 => 12.75
12.76 => 12.80
12.77 => 12.80
12.78 => 12.80, и т.д.
то
[ДопЧисло] = 0.0499999
2) Если
12.70 => 12.70
12.71 => 12.70
12.72 => 12.70
12.73 => 12.75
12.74 => 12.75
12.75 => 12.75
12.76 => 12.75
12.77 => 12.75
12.78 => 12.80, и т.д.
то
[ДопЧисло] = 0
P.S. В решении учитывается то, что оператор "Выразить" производит округление по математическим правилам
Кстати, ругается на оператор, т.к. есть выбор когда, а вот иначе нет перед концом.
И я надеюсь вы не пытаетесь посчитать изначально строковые данные?
Для выполнения этой задачи проще всего воспользоваться инструментом «Оформление». Делается это в конструкторе СКД на вкладке «Наборы данных». Для каждого поля отчёта можно настроить «Оформление». Нужно выбрать пункт «Формат» и задать точность числа. Для вычисляемых полей эта операция проделывается на вкладке «Вычисляемые поля».
Источником для запроса является виртуальная таблица РегистрНакопления.Продажи.Обороты, построенная по данным регистра в интервале между ДатаНач и ДатаКон.
В качестве выходных полей берем Номенклатура и результат деления значения полей источника СтоимостьОборот и КоличествоОборот. Причем оператором ВЫРАЗИТЬ() тип последнего поля приводится к примитивному типу Число с определенным форматом (длина – 15, точность – 2).
Грамотное использование схемы компоновки данных (СКД) позволяет:
- значительно снизить время, необходимое на разработку отчета;
- избавиться от необходимости создания управляемой формы обработчика;
- получить на выходе красивый результат с возможностью дополнительной настройки пользователем.
Но далеко не все разработчики по максимуму используют возможности схемы, так как не все её настройки очевидны и интуитивно понятны. В частности многие знают, что в 1С в СКД есть вычисляемые поля, однако, не до конца представляют область их использования и методы работы с ними.
Что такое вычисляемое поле
В большинстве случаев в качестве источника данных в схеме компоновки выступает запрос. В принципе, внутри самого запроса уже можно использовать различные формулы, конструкции и выражения. Возникает закономерный вопрос, зачем же нужен дублирующий функционал?
Дело в том, что СКД – это нечто большее, нежели просто отображение результата выполнения запроса и это прекрасно видно из формы создания схемы (Рис.1).
Вычисляемые поля позволяют выполнять определенные действия со сформированным набором данных:
- Выводить в определенную ячейку массив данных, полученных запросом, соединив несколько строк в одну;
- Обращаться к экспортным функциям общего модуля;
- Выполнять различные выражения, доступные для языка компоновки и использование специальных функций ВычислитьВыражение.
Давайте по этому списку и пойдем.
Массив значений в одной ячейке
Смоделируем ситуацию, когда необходимо получить в отдельную ячейку все номера документов поступления по контрагенту:
- С помощью конструктора реализуем простейший запрос (Рис. 2) Рис. 2
- На закладке «Вычисляемые поля» мы создадим новое поле и назовем его МассивИдентификаторов, подставив в колонку «Выражение» фразу Массив(Номер) (Рис. 3) Рис. 3
таким образом, мы в нашей схеме создали дополнительное расчетное поле;
- Перейдем на закладку «Ресурсы» и установим выражение для расчета итога по контрагенту (Рис. 4), заменив выражение по умолчанию «Сумма» на «СоединитьСтроки»; Рис. 4
- На закладке «Настройки» определим внешний вид нашего отчета, добавим новую группировку «Контрагент» и укажем её выбранные поля (Рис. 4); Рис. 4
- Результат выполнения обработки можно увидеть на Рис. 5. Рис.5
Как видно из приведенного примера, никаких сложностей в добавлении и обработке вычисляемых полей нет. Мы использовали две функции: Массив() и СоединитьСтроки().
Несколько слов о последней. Помимо первого параметра, указывающего на идентификатор массива, таблицы значений или значения, в ней могут быть установлены еще два:
- РазделительЭлементов – указывает, какой символ будет отделять один элемент массива или одну строку таблицы значений от другого (в нашем случае мы опустили этот параметр и по умолчанию был назначен перенос строки);
- РазделительКолонок – символ, используемый для разделения колонок таблицы значений (по умолчанию используется точка с запятой).
Обращение к экспортным функциям общего модуля
В качестве источника данных для заполнения вычисляемого поля могут выступать функции общего модуля.
Несколько важных моментов:
- Функция обязательно должна быть экспортной;
- Если функция расположена в общем модуле с установленным признаком «Глобальный», её вызов осуществляется непосредственно по имени, в противном случае вызов функции должен происходить по схеме «Имя общего модуля». «Имя вызываемой функции».
В качестве примера использования мы возьмем тот же самый запрос к документам поступления и выведем «Сумму документа» прописью в отдельную колонку. Сам запрос мы описывать не будем, перейдем непосредственно к вычисляемым полям:
Таким образом, мы видим, что практически любой обработчик данных может быть инициализирован из СКД, что значительно расширяет возможности использования схемы.
Выражения языка компоновки
Достаточно часто в работе разработчика возникает ситуация, когда в поле СКД необходимо вывести результат деления:
- Рассчитать среднюю стоимость номенклатуры;
- Всевозможные проценты;
- Расчеты среднего заработка и т.д.
Во избежание проблем, в этих случаях желательно в вычисляемое поле ввести проверку на деление на 0.
Сделать это можно с помощью конструкции «Выбор Когда ….Тогда… Иначе… Конец».
В конце несколько слов о достаточно новой функции ВычислитьВыражение(). С её помощью, в частности можно вычислять отклонения в стоимости между текущей и предыдущей строкой, накопительный остаток и т.д.
Допустим, получить СуммуДокумента из предыдущей строки нашего запроса можно указав в поле «Выражение» значение ВычислитьВыражение(«СуммаДокумента». «ПредыдущаяСумма»).
Для выполнения этой задачи проще всего воспользоваться инструментом "Оформление". Делается это в конструкторе СКД на вкладке "Наборы данных". Для каждого поля отчёта можно настроить "Оформление". Нужно выбрать пункт "Формат" и задать точность числа. Для вычисляемых полей эта операция проделывается на вкладке "Вычисляемые поля".
Выразить (Cast) – данная функция предназначена для выделения типа из выражения, которое может содержать составной тип. В случае, если выражение будет содержать тип, отличный от требуемого типа, будет возвращено значение NULL.
Синтаксис:
Выразить(Выражение, УказаниеТипа)
- Выражение – преобразуемое выражение;
- УказаниеТипа (Строка). Содержит строку типа. Например, “Число”, “Строка” и т.п. Кроме примитивных типов данная строка может содержать имя таблицы. В этом случае будет осуществлена попытка выразить к ссылке на указанную таблицу.
Пример:
Выразить(Данные.Реквизит1, "Число(10,3)")
ЕстьNull (IsNull) – данная функция возвращает значение второго параметра в случае, если значение первого параметра NULL. В противном случае будет возвращено значение первого параметра.
Синтаксис:
ЕстьNull(Выражение1, Выражение2)
- Выражение1 – проверяемое значение;
- Выражение2 – возвращаемое значение, если значение Выражение1 есть NULL.
Пример:
ЕстьNULL(Сумма(Продажи.СуммаОборот), 0)
ACos – вычисляет арккосинус в радианах.
- Выражение (Число). Значение косинуса (в диапазоне -1 … 1), по которому определяется угол.
ASin – вычисляет арксинус в радианах.
- Выражение (Число). Значение синуса (в диапазоне -1 … 1), по которому определяется угол.
ATan – вычисляет арктангенс в радианах.
- Выражение (Число). Значение тангенса, по которому определяется угол.
Cos – вычисляет косинус.
- Выражение (Число). Задается в радианах.
Exp – возведение числа e в степень.
- Выражение (Число). Значение степени.
Log – вычисляет натуральный логарифм.
- Выражение (Число). Исходное число, больше 0.
Log10 – вычисляет логарифм X по основанию 10.
- Выражение (Число). Исходное число, больше 0.
Pow – возведение в степень.
Синтаксис:
Pow(Основание, Показатель)
- Основание (Число). Основание операции возведения в степень.
- Показатель (Число). Показатель степени.
Sin – вычисляет синус.
- Выражение (Число). Задается в радианах.
Sqrt – вычисляет квадратный корень.
- Выражение (Число). Неотрицательное число.
Tan – вычисляет тангенс.
- Выражение (Число). Значение синуса, по которому определяется угол.
Окр (Round) – округляет исходное число до нужной разрядности. Режим округления стандартный (1,5 как 2).
Синтаксис:
Окр(Выражение, Разрядность)
- Выражение (Число). Исходное число;
- Разрядность (Число). Число знаков дробной части, до которых производится округление.
Цел (Int) – отсекает дробную часть числа.
- Выражение (Число). Дробное число.
Функции общих модулей
Выражение механизма компоновки данных может содержать вызовы функций глобальных общих модулей конфигурации. Никакого дополнительно синтаксиса для вызова таких функций не требуется.
Пример:
СокращенноеНаименование(Документы.Ссылка, Документы.Дата, Документы.Номер)
В данном примере будет осуществлен вызов функции “СокращенноеНаименование” из общего модуля конфигурации.
Отметим, что использование функций общих модулей разрешено только при указании соответствующего параметра процессора компоновки данных.
Кроме того, функции общих модулей не могут быть использованы в выражениях пользовательских полей.
Представление (Resentation) – данная функция возвращает строковое представление переданного значения не примитивного типа. Для значений примитивного типа возвращает само значение.
Если в качестве параметра используется массив или таблица значений, то функция возвращает строку, содержащую строковые представление всех элементов массива, разделенных символами “; “. Если у какого либо элемента строковое представление пустое, то вместо его представления выводится строка “ ”.
Строка (String) – данная функция преобразует переданное значение в строку.
Если в качестве параметра используется массив или таблица значений, то функция возвращает строку, содержащую строковые представление всех элементов массива, разделенных символами “; “. Если у какого либо элемента строковое представление пустое, то вместо его представления выводится строка “ ”.
ЗначениеЗаполнено (ValueIsFilled)
Для значений NULL, Неопределено всегда возвращает Ложь.
Для значений Булево всегда возвращает Истину.
Для остальных типов возвращает Истину, если значение отличается от значения по умолчанию для данного типа.
УровеньВГруппировке (LevelInGroup) – данная функция получает текущий уровень записи относительно группировки.
Может быть использована для получения уровня вложенности записи в иерархической группировке.
ТипЗначения(ValueType)
- Выражение (Строка). Строковое значение типа.
Возвращает значение типа Тип, содержащее тип значения параметра функции.
Источником для запроса является виртуальная таблица РегистрНакопления.Продажи.Обороты, построенная по данным регистра в интервале между ДатаНач и ДатаКон.
В качестве выходных полей берем Номенклатура и результат деления значения полей источника СтоимостьОборот и КоличествоОборот. Причем оператором ВЫРАЗИТЬ() тип последнего поля приводится к примитивному типу Число с определенным форматом (длина – 15, точность – 2).
В скд на первой закладке где запрос есть твои поля . У каждого поля можно настроить формат. В формате ставь своё округление.
Евгений, я ставлю точность до 2 цифр. Но, если последняя цифра не целого числа больше 5, он сразу округляет в большую сторону.
Евгений, тут походу в другом проблема. В самом начислении итого получается 252,26 без тысячных (значит не округление), а в отчете выводится число с разницей в одну копейку. Посмотрел некоторые начисления у других контрагентов, обнаружил разницу в несколько копеек. Что это и откуда они?
Читайте также: