К статье
Практический материал

Разработка и Конфигурация · 8 мин

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

Как получить остаток от деления в 1С: оператор %, проверка чётности, деление с остатком, типичные ошибки и примеры кода для разработчика.

Остаток от деления в 1С вычисляется оператором % — тем же символом процента, который используется во многих языках программирования. Выражение 10 % 3 вернёт 1, потому что 10 делится на 3 три раза с остатком 1. Оператор работает с числами и доступен как в тонком клиенте, так и на сервере, в любом модуле встроенного языка.

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

Синтаксис оператора остатка от деления

Общий вид выражения: Остаток = Делимое % Делитель;. Оба операнда должны быть числами — целыми или дробными. Если передать строку, дату или значение другого типа, платформа выдаст ошибку о несоответствии типов операндов.

Для делителя действует жёсткое ограничение: он не должен быть равен нулю. Деление на ноль приводит к исключению «Деление на ноль», которое прерывает выполнение кода, если оно не перехвачено конструкцией Попытка...Исключение.

Остаток = 17 % 5;   // результат: 2

Остаток = 100 % 10; // результат: 0

Остаток = 7 % 9; // результат: 7 (делимое меньше делителя)

Обратите внимание на последний пример: если делимое меньше делителя, остаток равен самому делимому. Это нормальное поведение, а не ошибка — учитывайте его при проверках.

Проверка чётности и кратности числа

Самое распространённое применение оператора — проверка, делится ли число нацело на другое. Если остаток равен нулю, деление выполняется без остатка.

Если Число % 2 = 0 Тогда

Сообщить("Число чётное");

Иначе

Сообщить("Число нечётное");

КонецЕсли;

Такой же приём работает для любой кратности: Количество % 3 = 0 проверяет делимость на три, Сумма % 100 = 0 — что сумма круглая до сотен. Это удобно для валидации введённых пользователем данных, например проверки, что количество товара кратно размеру упаковки.

Практические примеры в прикладном коде

Чередование строк в отчёте

Классическая задача — «зебра» при выводе строк табличного документа: чётным и нечётным строкам назначаются разные цвета фона.

НомерСтроки = 0;

Для Каждого Строка Из ТаблицаДанных Цикл

НомерСтроки = НомерСтроки + 1;

Если НомерСтроки % 2 = 0 Тогда

Область.ЦветФона = ЦветФонаЧётной;

КонецЕсли;

КонецЦикла;

Разложение суммы по номиналам

При расчёте выдачи наличных сумму раскладывают на купюры: целая часть деления даёт количество купюр, остаток — следующую сумму для разбора.

ОстатокСуммы = СуммаКВыдаче;

Купюр1000 = Цел(ОстатокСуммы / 1000);

ОстатокСуммы = ОстатокСуммы % 1000;

Купюр500 = Цел(ОстатокСуммы / 500);

ОстатокСуммы = ОстатокСуммы % 500;

Распределение по циклу

Если нужно распределить N элементов по K группам по кругу, номер группы вычисляется как Индекс % K. При этом удобно нумеровать индексы с нуля, чтобы первая группа получала номер 0.

Порядок действий для проверки кратности
  1. 1
    Убедитесь, что оба значения имеют числовой тип
  2. 2
    Проверьте, что делитель не равен нулю
  3. 3
    Вычислите остаток: Остаток = Делимое % Делитель
  4. 4
    Сравните результат с нулём: Остаток = 0 означает деление нацело
  5. 5
    Протестируйте на граничных значениях: 0, 1, отрицательных числах

Ограничения и особенности оператора

Оператор % применим только к числам. Перед использованием значений из реквизитов формы или параметров запроса убедитесь в их типе — например, функцией ТипЗнч() или через описание типов реквизита. Строку с цифрами предварительно преобразуйте функцией Число(), но помните, что она вызовет исключение на нечисловой строке.

Для отрицательных чисел поведение стоит проверить на тестовом примере в вашей версии платформы: -7 % 3 может вернуть результат, отличный от интуитивно ожидаемого в математике. Если логика зависит от знака остатка, берите модуль функцией Макс()/Мин() или предварительно приводите значения к положительным.

Альтернативные способы получения остатка

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

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

Функция Цел() отбрасывает дробную часть, поэтому формула даёт тот же результат для положительных чисел. Этот способ полезен как приём самопроверки: сравните результат с оператором % на контрольных значениях.

Для задач округления сумм до кратности (например, до 0,01 или до целых рублей) остаток обычно не нужен — используйте функцию Окр(Значение, Точность, РежимОкругления), которая решает задачу напрямую и безопаснее для денежных величин.

Сравнение вариантов

Оператор %

Самый короткий и читаемый способ; подходит для всех стандартных задач с числами

Формула через Цел()

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

Окр()

Не вычисляет остаток, но заменяет его в задачах округления денежных сумм до заданной точности

Типичные ошибки и как их избежать

Типичные ошибки
01
Деление на ноль: делитель не проверен перед вычислением — код падает с исключением. Всегда добавляйте условие Если Делитель <> 0
02
Передача строки вместо числа: реквизит формы хранит строку, оператор выдаёт ошибку типов. Преобразуйте значение через Число() с обработкой исключения
03
Ожидание остатка 0 при делимом меньше делителя: 3 % 5 вернёт 3, а не 0. Проверяйте логику на малых значениях
04
Использование остатка для денег без округления: накопленные ошибки представления дробных чисел дают 0.999999 вместо 1. Сначала округляйте через Окр()

Отдельная группа ошибок — логические. Например, разработчик проверяет Номер % 2 = 1 для определения нечётности, но нумерация в цикле начинается с нуля, и визуально «первая» строка оказывается чётной. Совет: явно задавайте начальное значение счётчика и проговаривайте, с 0 или с 1 идёт отсчёт.

Как проверить результат

Быстрый способ — окно «Вычислить выражение» (Shift+F9) в конфигураторе при отладке: введите выражение с оператором % и посмотрите значение. Для разовой проверки без отладки подойдёт временный вызов Сообщить(17 % 5) в любом серверном модуле.

Контрольные точки

Как проверить результат

17 % 5
Норма

Результат 2

Тревожный признак

Любое другое число или ошибка типов — проверьте операнды

100 % 10
Норма

Результат 0 — деление нацело

Тревожный признак

Ненулевое значение указывает на ошибку в данных

Делитель из пользовательского ввода
Норма

Перед вычислением есть проверка Делитель <> 0

Тревожный признак

Проверки нет — возможно исключение в рабочей базе

После внедрения кода в обработку прогоните её на граничных данных: нулевой делитель, делимое меньше делителя, отрицательные значения, пустые реквизиты. Такой минимальный набор тестов отсекает большинство ошибок до попадания кода в рабочую базу.

Итог

Что важно запомнить

Остаток от деления в 1С — это оператор %: Результат = Делимое % Делитель. Проверяйте тип операндов, всегда исключайте нулевой делитель, для денежных сумм сначала округляйте значения, а результат тестируйте на граничных случаях.

Частые вопросы

Как проверить, что число чётное, в 1С?

Используйте условие Число % 2 = 0. Если остаток от деления на два равен нулю — число чётное, иначе нечётное. Проверка работает для любых целых значений, включая ноль.

Что произойдёт, если делитель равен нулю?

Платформа выдаст исключение «Деление на ноль» и прервёт выполнение кода. Чтобы избежать падения, проверяйте делитель условием Если Делитель <> 0 либо оборачивайте вычисление в Попытка...Исключение с осмысленной обработкой ошибки.

Можно ли применять % к дробным числам?

Технически да, оператор сработает. Но из-за особенностей представления дробных чисел результат может отличаться от ожидаемого на малые величины. Для денежных и количественных расчётов надёжнее сначала округлить значения функцией Окр() до нужной точности.

Чем отличается % от функции Цел()?

Оператор % возвращает остаток от деления, а Цел() — целую часть числа, отбрасывая дробную. Вместе они дают полный результат деления: Цел(17 / 5) равно 3 (частное), 17 % 5 равно 2 (остаток).

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

В языке запросов 1С для этой задачи используется конструкция вычисления остатка через деление и приведение типов либо выражение с ВЫБОР, в зависимости от версии платформы. Проще и надёжнее вычислить остаток уже после запроса — в цикле обхода выборки оператором %.

Почему 3 % 5 возвращает 3, а не 0?

Так устроена математика остатка: три не делится на пять ни одного раза, поэтому целая часть равна нулю, а остаток — всё делимое, то есть 3. Если ваша логика ожидает другого поведения, добавьте явную проверку соотношения делимого и делителя.