1с получить остаток от деления в запросе

Обновлено: 06.07.2024

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Методическая рекомендация (полезный совет)

1. Если в операции деления заранее известны порядки числителя и знаменателя, то следует по возможности избегать выполнения деления числа заведомого маленького порядка на число заведомо большого порядка. Например, вместо:

0.02 / 28346 * 9287492

0.02 * 9287492 / 28346

2. При выполнении арифметических операций в запросах к базе данных платформа 1С:Предприятия поддерживает точность вычислений до 8 разрядов дробной части. Однако, из-за особенностей работы различных СУБД в некоторых ситуациях точность результатов может отличаться от 8. Более подробно о вычислении разрядности результатов можно почитать в статье ИТС Разрядность результатов выражений и агрегатных функций в языке запросов.

Если точность результата выполнения запроса к базе данных, содержащего

различается на различных СУБД, то рекомендуется к операндам и/ или результатам этих операций применять оператор явного приведения разрядности и точности числовых данных:

ВЫРАЗИТЬ(. КАК Число(m, n))

Оператор ВЫРАЗИТЬ следует применять к операндам, если на какой-нибудь СУБД точность получаемого результата недостаточна. Например, требуется 10 разрядов после запятой, а получается 6.

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

ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(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)

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

Сложение определено для следующих типов операндов:

Дата + Число (к дате прибавляется число секунд)

Вычитание определено для следующих типов операндов:

Дата — Число (от даты отнимается число секунд)

Дата — Дата (результатом является разница между двумя датами, измеренная в секундах)

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

Математические выражения используются в правой части оператора присваивания, а также в качестве параметров процедур и функций

Во встроенном языке определены арифметические операции двух видов:

Унарные арифметические операции

Унарный минус
Данная арифметическая операция выполняет получение отрицательного (противоположного) значения.

Унарный минус определен только для типа Число . Во всех остальных случаях будет выдано исключение « Операция получения отрицательного значения не определена для строковой величины »

Бинарные арифметические операции

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

Применимость операции сложения:

ОперандА ОперандБ Результат Комментарий
Число Число, Строка, Дата Число
Дата Число Дата К исходной дате добавляется количество дней, заданное вторым оператором
Строка Строка, Число, Дата Строка К исходной строке добавляются все символы второй. Длина конечной строки определяется суммой длин обеих строк. Такую операцию называют еще конкатенацией строк

Операция вычитания

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

Применимость операции вычитания:

ОперандА ОперандБ Результат Комментарий
Число Число, Строка, Дата Число
Дата Число Дата От исходной даты отнимается количество дней, заданное вторым оператором
Дата Дата Число Вычисляется количество дней на которое первая дата больше второй

Операция умножения

Данная арифметическая операция выполняет умножение значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.

Операция деления

Данная арифметическая операция выполняет деление значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.

Остаток от деления

Данная арифметическая операция вычисляет остаток от деления значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов. Следует учитывать, что оба операнда операции округляются до целого значения.

Приоритет выполнения арифметических операций

При вычислении результата математических выражений, программа руководствуется приоритетом арифметических операций (в порядке убывания):

  1. Унарный минус;
  2. Умножение, деление, остаток от деления;
  3. Сложение и вычитание;

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

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Методическая рекомендация (полезный совет)

1. Если в операции деления заранее известны порядки числителя и знаменателя, то следует по возможности избегать выполнения деления числа заведомого маленького порядка на число заведомо большого порядка. Например, вместо:

0.02 / 28346 * 9287492

0.02 * 9287492 / 28346

2. При выполнении арифметических операций в запросах к базе данных платформа 1С:Предприятия поддерживает точность вычислений до 8 разрядов дробной части. Однако, из-за особенностей работы различных СУБД в некоторых ситуациях точность результатов может отличаться от 8. Более подробно о вычислении разрядности результатов можно почитать в статье ИТС Разрядность результатов выражений и агрегатных функций в языке запросов.

Если точность результата выполнения запроса к базе данных, содержащего

  • арифметические операции деления,
  • агрегатные функции СРЕДНЕЕ ,
  • арифметические операции умножения, если каждый из множителей может иметь дробную часть,

различается на различных СУБД, то рекомендуется к операндам и/ или результатам этих операций применять оператор явного приведения разрядности и точности числовых данных:

ВЫРАЗИТЬ(. КАК Число(m, n))

Оператор ВЫРАЗИТЬ следует применять к операндам, если на какой-нибудь СУБД точность получаемого результата недостаточна. Например, требуется 10 разрядов после запятой, а получается 6.

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

ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(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)

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

Сложение определено для следующих типов операндов:

Дата + Число (к дате прибавляется число секунд)

Вычитание определено для следующих типов операндов:

Дата — Число (от даты отнимается число секунд)

Дата — Дата (результатом является разница между двумя датами, измеренная в секундах)

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

Математические выражения используются в правой части оператора присваивания, а также в качестве параметров процедур и функций

Во встроенном языке определены арифметические операции двух видов:

Унарные арифметические операции

Унарный минус
Данная арифметическая операция выполняет получение отрицательного (противоположного) значения.

Унарный минус определен только для типа Число . Во всех остальных случаях будет выдано исключение « Операция получения отрицательного значения не определена для строковой величины »

Бинарные арифметические операции

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

Применимость операции сложения:

ОперандА ОперандБ Результат Комментарий
Число Число, Строка, Дата Число
Дата Число Дата К исходной дате добавляется количество дней, заданное вторым оператором
Строка Строка, Число, Дата Строка К исходной строке добавляются все символы второй. Длина конечной строки определяется суммой длин обеих строк. Такую операцию называют еще конкатенацией строк

Операция вычитания

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

Применимость операции вычитания:

ОперандА ОперандБ Результат Комментарий
Число Число, Строка, Дата Число
Дата Число Дата От исходной даты отнимается количество дней, заданное вторым оператором
Дата Дата Число Вычисляется количество дней на которое первая дата больше второй

Операция умножения

Данная арифметическая операция выполняет умножение значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.

Операция деления

Данная арифметическая операция выполняет деление значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов.

Остаток от деления

Данная арифметическая операция вычисляет остаток от деления значения первого операнда на значение второго. Операция применима только для типа Число . Если тип второго операнда не совпадает с типом первого, выполняется неявное преобразование типов. Следует учитывать, что оба операнда операции округляются до целого значения.

Приоритет выполнения арифметических операций

При вычислении результата математических выражений, программа руководствуется приоритетом арифметических операций (в порядке убывания):

  1. Унарный минус;
  2. Умножение, деление, остаток от деления;
  3. Сложение и вычитание;

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

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

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

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

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

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

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

Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Комментариев: 6 на “ Остаток от деления в 1С 8.3 и 8.2 ”

Добрый вечер.А вы уже пробовали заполнять матрицу змейкой числами от 1 до 100 на 1с?

Змейкой уже не актуально. Правильнее Бустадефон (ходом быка).

По обычной такой математической логике. Остаток от деления единицы на два равен единице.

ps: а вообще процессор компьютера, выполняя целочисленное деление командой div или idiv, получает целочисленный результат от деления и остаток одним действием.
целочисленный результат помещается в регистр RAX (если рассматриваем 64-битный вариант), а остаток помещается в регистр RDX.

Услуги 1С

Наш канал на Youtube


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

Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.

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

В полях выборки запроса можно использовать вложенную таблицу источника запроса. Например, у документа «Оказание услуг», есть табличная часть Услуги, так вот, эту табличную часть тоже можно вывести в поле выборки. Сейчас Вы увидите, как это можно реализовать.

В своей учебной базе я запущу консоль запросов, открою конструктор запросов и выберу таблицу «Оказание Услуг».


Раскроем эту таблицу


И в ней мы видим табличную часть «Услуги».

Вот всю эту табличную часть и выберем.


Как видите, вся табличная часть услуги полностью выбралась в поля.

Оставим три поля вложенной таблицы и добавим некоторые поля из шапки документа.


Нажмем кнопку ОК в конструкторе, и посмотрим как будет выглядеть наш запрос.


Ещё интересный момент, у вложенной таблицы можно вместо полей поставить звездочку, тогда выйдут все поля табличной части. Это нельзя сделать в конструкторе, только вручную в запросе. Запрос приобретет следующий вид:


Посмотрим, как выполнится такой запрос.


Единственно, что эта звездочка у нас не сохранится, если открыть конструктор запроса.

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

Ниже приведу небольшой пример кода, в котором осуществляется работа с вложенной таблицей:

Разъясню вышеприведенный код.

Первым делом мы получили линейную выборку, и обходим эту выборку в цикле, в котором создаем верхнюю строку дерева значений (оно на форме), и в неё записываем ссылку на наш документ.

А внутри этого цикла будем обращаться к полям выборки как к полям вложенной таблицы, и записывать их в дочерние строки дерева с формы.

Вот какой результат будет возвращать этот код


Остались вопросы?

Вы ответите на них сами, когда изучите мой курс «Запросы в 1С для начинающих». Где эти и многие другие вопросы рассматриваются более подробно. Вся информация дается в простой и доступной форме и понятна даже тем, кто особо не знаком с программированием в 1С.

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