Округление в 1 с

Недавно в чужом программном столкнулся с тем, что не все программисты 1С знают, как в 1С 8.2 или 8.3 получить остаток от деления.

Периодически встречаются вот такие конструкции:

ОстатокОтДеления = Делимое — Цел(Делимое / Делитель) * Делитель;

Это конечно забавный и остроумный способ. Но есть более простой метод, встроенный в платформу:

ОстатокОтДеления = Делимое % Делитель;

Вот, собственно, и всё!

P.S. Кстати, результат 1%2 = 1, некоторые почему-то думают, что ноль

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

Оператор %
В этой статье я подробно разберу оператор %, который возвращает остаток от деления. Рассмотрим особенности его работы, и задачи, когда он может быть применим.

Работа оператора % описана в моей книге «Программировать в 1С за 9 шагов», но не приведены случаи, когда он может понадобиться, в этой статье я восполню пробел, и, возможно, она войдет в уже новую редакцию книги.
И так начнем. Оператор % получает остаток от деления одного числа на другое.
Е = A % B;
E – остаток от деления А на В.
Когда он может быть применим?
Рассмотрим самые . С его помощью можно определить четное число или нет. Если выражение А%2 равно 0, то число четное (остатка от деления нет), а если А%2 не равно 0, то число нечетное.
Так же с его помощью можно вычислять число определенной кратности. Например, есть цикл от 1 до 100, нам нужно вывести на экран числа кратные, к примеру, 7. В этом случае будет такой код:

И такой результат работы этого кода

Рассмотрим, еще один способ применения оператора %. Очень часто время получается в секундах, например при вычитании одной даты из другой. И бывает необходимость привести все это в какой-то нормальный вид. Поясню, какой будет в этом случае алгоритм
Пусть мы имеем число секунд: 56321.
Нам сейчас нужно получить точное количество минут в этом числе секунд, минута состоит из 60 секунд. Поэтому получив остаток 56321 % 60, мы получим «лишние» секунды (например. 142 = 60 + 60+ 22, 22 – и будет остаток от деления 142 %60). А после того, как вычтем из исходного числа остаток от деления, и поделим все это на 60, то узнаем ровное количество минут в этом числе. Точно так же узнаем ровное количество часов, дней, месяцев и т.д.
Сейчас я создам небольшую обработку, которая будет раскладывать число в секундах на минуты, часы и дни (на месяцы и года дальше будет раскладывать не совсем корректно).
Данная форма обработки будет иметь следующий вид:

Код, который раскладывает число секунд на составляющие:

Посмотрим результат работы этого кода, на некоторых примерах.

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

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

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

Изучите программирование в 1С с помощью моей книги «Программировать в 1С за 9 шагов»

  1. Без сложных технических терминов.
  2. Более 500 страниц практического материала.
  3. Каждое задание сопровождается рисунком (скриншот).
  4. Сборник задач для домашней проработки.
  5. Книга написана понятным и простым языком — для новичка.
  6. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 16%: vCph8bW3rE

Собственные наработки и набитые шишки в моей практике по программированию в 1С.

среда, 28 октября 2015 г.

Как найти целое число от числа в запросе

Иногда необходимо получить целое число в запросе. Аналог Цел() языка. Необходимо прибегнуть к мелким хитростям, поскольку такого метода в запросе не существет. Но не стоит огорчаться.

Вот собственно необходимо задействовать конструкцию ВЫРАЗИТЬ(). Для положительных чисел необходимо вычесть 0.5, а для отрицательных чисел прибавить 0.5. Вот пример:

ВЫБОР КОГДА ВашеЧисло > 0 ТОГДА
ВЫРАЗИТЬ(ВашеЧисло – 0.5 КАК Число(15, 0))
ИНАЧЕ
ВЫРАЗИТЬ(ВашеЧисло + 0.5 КАК Число(15, 0))

В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int. Подробно о явном и неявном преобразовании типов в MS SQL Server можно прочитать в BOL.

Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом «средняя цена = «.
Попытка выполнить запрос

SELECT ‘Средняя цена = ‘ + AVG(price) FROM laptop;

приведет к сообщению об ошибке
Implicit conversion from data type varchar to money is not allowed. Use the CONVERT function to run this query.
Это сообщение означает, что система не может выполнить неявное преобразование типа varchar к типу money. В подобных ситуациях может помочь явное преобразование типов. При этом, как указано в сообщении об ошибке, можно воспользоваться функцией CONVERT. Однако эта функция не стандартизована, поэтому в целях переносимости рекомендуется использовать стандартное выражение CAST. С него и начнем.
Если переписать наш запрос в виде

SELECT ‘Средняя цена = ‘ + CAST(AVG(price) AS CHAR(15)) FROM laptop;

в результате получим то, что требовалось:

Средняя цена = 1410.44

Мы использовали выражение явного преобразования типов CAST для приведения среднего значения цены к строковому представлению. Синтаксис выражения CAST очень простой:

CAST(<выражение> AS <тип данных>)

При этом следует иметь в виду, во-первых, что не любые преобразования типов возможны (стандарт содержит таблицу допустимых преобразований типов данных). Во-вторых, результат функции CAST для значения выражения, равного NULL, тоже будет NULL.
Рассмотрим еще один пример: определить средний год спуска на воду кораблей из таблицы Ships. Запрос

SELECT AVG(launched) FROM ships;

даст результат 1926. В принципе все правильно, т.к. мы получили в результате то, что просили — ГОД. Однако среднее арифметическое будет составлять примерно 1926,2381. Тут следует отметить, что агрегатные функции (за исключением функции COUNT, которая всегда возвращает целое число) наследуют тип данных обрабатываемых значений. Поскольку поле launched — целочисленное, мы и получили среднее значение с отброшенной дробной частью (заметьте — не округленное).
А если нас интересует результат с заданной точностью, скажем, до двух десятичных знаков? Применение выражения CAST к среднему значению ничего не даст по указанной выше причине. Действительно,

SELECT CAST(AVG(launched) AS NUMERIC(6,2)) FROM ships;

вернет значение 1926.00. Следовательно, CAST нужно применить к аргументу агрегатной функции:

SELECT AVG(CAST(launched AS NUMERIC(6,2))) FROM ships;

Результат — 1926.238095. Опять не то. Причина состоит в том, что при вычислении среднего значения было выполнено неявное преобразование типа. Сделаем еще один шаг:

SELECT CAST(AVG(CAST(launched AS NUMERIC(6,2))) AS NUMERIC(6,2)) FROM ships;

В результате получим то, что нужно — 1926.24. Однако это решение выглядит очень громоздко. Заставим неявное преобразование типа поработать на нас:

SELECT CAST(AVG(launched*1.0) AS NUMERIC(6,2)) FROM ships;

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

Аналогичные преобразования типа можно выполнить с помощью функции CONVERT:

SELECT CONVERT(NUMERIC(6,2),AVG(launched*1.0)) FROM ships;

Функция CONVERT имеет следующий синтаксис:

CONVERT (<тип данных>, <выражение> )

Основное отличие функции CONVERT от функции CAST состоит в том, что первая позволяет форматировать данные (например, темпоральные данные типа datetime) при преобразовании их к символьному типу и указывать формат при обратном преобразовании. Разные целочисленные значения необязательного аргумента стиль соответствуют определенным форматам. Рассмотрим следующий пример

SELECT CONVERT(char(25),CONVERT(datetime,’20030722′));

Здесь мы преобразуем строковое представление даты к типу datetime, после чего выполняем обратное преобразование, чтобы продемонстрировать результат форматирования. Поскольку значение аргумента стиль не задано, используется значение по умолчанию (0 или 100). В результате получим

Jul 22 2003 12:00AM

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

стиль формат
1 07/22/03
11 03/07/22
3 22/07/03
121 2003-07-22 00:00:00.000

Перечень всех возможных значений аргумента стиль можно посмотреть в BOL.

Оператор CASE

Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (нет в таблице РС), то вместо цены вывести текст: «Нет в наличии».
Список всех моделей ПК с ценами можно получить с помощью запроса:

SELECT DISTINCT product.model, price FROM product LEFT JOIN pc c
ON product.model=c.model
WHERE product.type=’pc’;

В результирующем наборе отсутствующая цена будет заменена NULL-значением:

model price
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 NULL
2112 NULL

Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:
Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE) возвращается значение цены. Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению. В результате получим

model price
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 Нет в наличии
2112 Нет в наличии

Оператор CASE может быть использован в одной из двух синтаксических форм записи:

1-я форма
CASE <проверяемое выражение>
WHEN <сравниваемое выражение 1>
THEN <возвращаемое значение 1>

WHEN <сравниваемое выражение N>
THEN <возвращаемое значение N>

END
2-я форма
CASE
WHEN <предикат 1>
THEN <возвращаемое значение 1>

WHEN <предикат N>
THEN <возвращаемое значение N>

END

Все предложения WHEN должны иметь одинаковую синтаксическую форму, т.е. нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них.
В приведенном выше примере была использована вторая форма оператора CASE.
Заметим, что для проверки на NULL стандарт предлагает более короткую форму оператора — COALESCE. Этот оператор имеет произвольное число параметров и возвращает значение первого, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:

CASE WHEN A IS NOT NULL THEN A ELSE B END

Решение рассмотренного выше примера при использовании оператора COALESCE можно переписать следующим образом:
Использование первой синтаксической формы оператора CASE можно продемонстрировать на следующем примере: Вывести все имеющиеся модели ПК с указанием цены. Отметить самые дорогие и самые дешевые модели.
В результате выполнения запроса получим

Функция 1С Окр(Число) производит округление чисел 1С нужным способом. По-умолчанию – до целого.

Например:

  • Для округления числе 1С выполняем функцию 1С Окр(22.55)
  • 1С возвращает 22

И наконец, третье. Как известно если остаток меньше 5 – то округляется до 0, а если больше 5, то округляется до 1.

Например:

  • 15.33 округляем как 15.3
  • 15.35 округляем как 15.4
  • 15.37 округляем как 15.4.

С помощью 1С ОКР можно изменить этот порядок:

  • 15.33 округляем как 15.3
  • 15.35 округляем как 15.3
  • 15.37 округляем как 15.4.

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Добавим в наш калькулятор новые кнопки «Окр».

Для операции нужен только один параметр, поэтому результат будет выводить сразу же по нажатию кнопки операции.

Чтобы узнать какую часть округлять и на сколько разрадов – запросим у пользователя число с помощью ВвестиЗначение().

В обработчик кнопки добавим новую ветку (как добавить новую ветку смотрите Сложение, вычитание, деление и умножение в 1С).

Пример программного кода:

Только зарегистрированные пользователи VIP группы могут видеть этот контент.

Формула ОКРУГЛВВЕРХ похожа на функцию классического округления, рассмотренную ранее, но в данном случае округление производится несколько иным способом. В связи с этим рассмотрим данную формулу, в том числе на примерах.

Для начала посмотрим на общее определение данной функции и её стандартный синтаксис.

Синтаксис функции ОКРУГЛВВЕРХ

Как и другие подобные формулы, ОКРУГЛВВЕРХ принимает два обязательных аргумента. Можно указывать адреса ячеек в таблице или просто числовые константы. С не-числовыми значениями функция не работает и выдаёт ошибку.

Обобщённый синтаксис функции записывается так:
ОКРУГЛВВЕРХ(число; число_разрядов)

В первым аргументом всё ясно — это округляемое числовое значение. Что касается второго аргумента, то это целое число, которое может быть как положительным, так и отрицательным. В связи с этим следует обратить внимание на следующие особенности, приведённые ниже.

  • Функция ОКРУГЛВВЕРХ подобна функции ОКРУГЛ с той разницей, что округление всегда производится с избытком.
  • Если число_разрядов больше 0, то число округляется с избытком до заданного количества десятичных разрядов после десятичной запятой.
  • Если число_разрядов равно 0, то число округляется до ближайшего целого.
  • Если число_разрядов меньше 0, то число округляется с избытком до заданного количества десятичных разрядов слева от запятой.

Для этой формулы есть противоположный аналог, рассмотренный .

Также стоит напомнить, что функция ОКРУГЛВВЕРХ воспринимает пустую ячейку как число ноль, как и все формулы, предназначенные для работы с числами в Excel. При попытке выполнить округление значения, не являющегося числом, возвращается ошибка «#ЗНАЧ!»

Примеры для ОКРУГЛВВЕРХ в Excel

Если у Вас на компьютере установлен Excel, то скачайте файл с примерами, прикреплённый после статьи. В нём рассмотрены некоторые варианты использования функции ОКРУГЛВВЕРХ на примере разных аргументов: чисел и точности округления. Эти же примеры разобраны на видео.

В качестве простого примера скопируйте в любую ячейку таблицы выражение «=ОКРУГЛВВЕРХ(2,459; 0)» (без кавычек). Поскольку мы указали точность округления равную нулю (второй аргумент), то в результате получим число 3.

Другой пример: «=ОКРУГЛВВЕРХ(2,459; 1)» даст нам на выходе число 2,5 (один знак после запятой). Прочие примеры разобраны на видео и в прикреплённом файле.

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