1с округлить в запросе
Надеюсь, Вы знакомы с функцией Окр(), которая позволяет округлить дробное число до ближайшего целого. Все когда-нибудь ею пользовались. Но всё меняется, когда Вам требуется округлить числовое значение строго в большую сторону.Бывалый программист сразу же бросится за изобретение колеса. Через пару минут родится новая функция, например, такая:
НовоеЗначение = Цел(ИсходноеЗначение) + 1;
Проверочное выражение Цел(1.1) + 1 = 2, введенное в табло, убеждает в правильности выбранного пути, и новоиспеченное колесо начинает молотить ошибки, т.к. на проверку функции на всем диапазоне значений чего-то не хватило (надеюсь, что времени ;D). В итоге получается, что функция даже целые значения округляет вверх Цел(1) + 1 = 2
Найденное решение может быть более изощренным, например, таким:
НовоеЗначение = Окр(ИсходноеЗначение + 0.5, 0, 0);
Давайте разберем его подробнее: второй параметр функции Окр() указывает на необходимость округления до целого числа, а третий параметр заставляет воспринимать промежуточное значение 0.5 как 0 (ноль). И для того, чтобы спровоцировать округление в большую сторону, программист сознательно прибавляет к исходному значению число 0.5. Теперь, если исходное значение будет больше целого хотя бы на сотую, тысячную или миллионную долю, оно всегда будет округляться вверх.
Теперь ложка дегтя: округляться вверх будут и отрицательные значения. С математической точки зрения -2 меньше -1, но оригинальная функция Окр() выполняет округление по модулю, а не по математическим правилам. Поэтому программист должен подумать и над тем, как ему нужно округлять отрицательные значения.
Таким образом, если Вам нужен пример функции, выполняющей округление в большую сторону по аналогии с функцией Окр(), Вы попали куда нужно:
Функция ОкрВверх(ИсходноеЗначение) Перем НовоеЗначение; Если ИсходноеЗначение >= 0 Тогда НовоеЗначение = Окр(ИсходноеЗначение + 0.5, 0, 0); Иначе НовоеЗначение = Окр(ИсходноеЗначение — 0.5, 0, 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)) КАК ДоСотых
Реклама — фантазирование об обычном предмете в извращенной форме.
Данная конструкция в 1С используется в запросе для усечения длины строки,а также для приведения строки неограниченной длины к переменной строке с фиксированным ограничением.
Синтаксис функции
- Если на входе строка больше указанной длины — она усекается.
- Если меньше — остается неизменной.
- При передаче строки неограниченной длины происходит тоже самое.
Никаких пробелов в конце короткой строки не добавляется.
Другие особенности использования ВЫРАЗИТЬ КАК СТРОКА
Передача NULL в качестве параметра не вызывает ошибки, но на выходе будет NULL (не строкой).
Передача для преобразования других типов вызывает ошибку «Несовместимые типы ВЫРАЗИТЬ».
Преобразовать число как строку в запросе или же ссылку как строку в данной функции (да и в любых других функциях запроса невозможно). Это отличает TSQL запрос select cast(‘321’ as numeric(10) от запроса в 1С.
Функция ПРЕДСТАВЛЕНИЕ(ЧИСЛО), может на выходе запроса выдать строку, но внутри запроса ее результат использовать невозможно даже в качестве параметра для ВЫРАЗИТЬ.
Конкантенация (сложение) строк допустима и с результатом ВЫРАЗИТЬ:
«321»+ ВЫРАЗИТЬ («Строка» КАК СТРОКА(100))
Идентификатор ссылочного объекта в запросе получить невозможно и ожидаемое многими начинающими программистами 1С в КАЧЕСТВЕ ВЫРАЗИТЬ(ССЫЛКА как СТРОКА()) не работает: ни наименования, ни кода, ни идентификатора не получится — будет ошибка несовместимости типов.
Вот такая простая функция без особых сюрпризов.
Возможно когда-нибудь в платформе 8.4 1С исправит ситуацию с преобразованиями типов в запрос, а может тут дело в поддержании совместимости всех баз данных.
Вы обязательно истратите слишком много, если захотите сэкономить на хорошей рекламе. Это подобно покупке билета на три четверти пути в Европу: вы потратили деньги, но туда не доехали.
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению 2
При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: . по причине: Ошибка компоновки данных по причине: Ошибка получени В чем разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С 10
Цитата из справки 1С: " По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной . Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое Посмотреть все результаты поиска похожих
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению 2
При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: . по причине: Ошибка компоновки данных по причине: Ошибка получени В чем разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С 10
Цитата из справки 1С: " По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной . Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр Посмотреть все результаты поиска похожих
Еще в этой же категории
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Оператор ВЫРАЗИТЬ, аналог методов Лев, Прав, СокрЛП в Запросе? 11
Использовать конструкцию « ВЫРАЗИТЬ »: Запрос.Текст = " … |ГДЕ | (ВЫРАЗИТЬ(ЕдиницыХранения.Владелец.Наименование КАК СТРОКА(4))) Груз" ; Запрос.УстановитьПараметр(" Груз" ," Тонн" ); С целью приведения строк неограниченной длины к строкам Посмотреть все в категории Запросы
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
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.
Демонстрация использования ВЫРАЗИТЬ в запросе для округления
Никакая реклама не поможет продать то, что продать невозможно.
Рассмотрим задачу, когда необходимо в запросе разделить число на целую и дробную часть.
Пример запроса:
Запрос = Новый Запрос;
| КОГДА (ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0))) > &ДробноеЧисло
| ТОГДА (ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0))) — 1
| ИНАЧЕ ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0))
| КОНЕЦ КАК ЦелаяЧасть,
| КОГДА (ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0))) = &ДробноеЧисло
| КОГДА (ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0))) > &ДробноеЧисло
| ТОГДА 1 — ((ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0))) — &ДробноеЧисло)
| ИНАЧЕ &ДробноеЧисло — (ВЫРАЗИТЬ(&ДробноеЧисло КАК ЧИСЛО(4, 0)))
Собственные наработки и набитые шишки в моей практике по программированию в 1С.
среда, 28 октября 2015 г.
Как найти целое число от числа в запросе
Иногда необходимо получить целое число в запросе. Аналог Цел() языка. Необходимо прибегнуть к мелким хитростям, поскольку такого метода в запросе не существет. Но не стоит огорчаться.
Вот собственно необходимо задействовать конструкцию ВЫРАЗИТЬ(). Для положительных чисел необходимо вычесть 0.5, а для отрицательных чисел прибавить 0.5. Вот пример:
ВЫБОР КОГДА ВашеЧисло > 0 ТОГДА
ВЫРАЗИТЬ(ВашеЧисло — 0.5 КАК Число(15, 0))
ИНАЧЕ
ВЫРАЗИТЬ(ВашеЧисло + 0.5 КАК Число(15, 0))
Проконсультироваться
со специалистом 1С
Код 1C v 8.х
Код 1C v 8.х
Получение целой части числа в запросе?
Код 1C v 8.х
Код 1C v 8.х
Как округлить в запросе в меньшую сторону?
Код 1C v 8.х
или
Код 1C v 8.х
© 2015 - 2022 ComputerMaker.info - Все права защищены. При копирование материала с нашего сайта обязательно приложить ссылку на статью.
Privacy Overview
Читайте также: