Разработка и Конфигурация · 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Убедитесь, что оба значения имеют числовой тип
- 2Проверьте, что делитель не равен нулю
- 3Вычислите остаток: Остаток = Делимое % Делитель
- 4Сравните результат с нулём: Остаток = 0 означает деление нацело
- 5Протестируйте на граничных значениях: 0, 1, отрицательных числах
Ограничения и особенности оператора
Оператор % применим только к числам. Перед использованием значений из реквизитов формы или параметров запроса убедитесь в их типе — например, функцией ТипЗнч() или через описание типов реквизита. Строку с цифрами предварительно преобразуйте функцией Число(), но помните, что она вызовет исключение на нечисловой строке.
Для отрицательных чисел поведение стоит проверить на тестовом примере в вашей версии платформы: -7 % 3 может вернуть результат, отличный от интуитивно ожидаемого в математике. Если логика зависит от знака остатка, берите модуль функцией Макс()/Мин() или предварительно приводите значения к положительным.
Альтернативные способы получения остатка
Если оператор % по какой-то причине не подходит, остаток можно вычислить формулой через целую часть деления:
Остаток = Делимое - Цел(Делимое / Делитель) * Делитель;
Функция Цел() отбрасывает дробную часть, поэтому формула даёт тот же результат для положительных чисел. Этот способ полезен как приём самопроверки: сравните результат с оператором % на контрольных значениях.
Для задач округления сумм до кратности (например, до 0,01 или до целых рублей) остаток обычно не нужен — используйте функцию Окр(Значение, Точность, РежимОкругления), которая решает задачу напрямую и безопаснее для денежных величин.
Сравнение вариантов
Самый короткий и читаемый способ; подходит для всех стандартных задач с числами
Громоздкая, но полезна для самопроверки и в случаях, когда нужен явный контроль над целой частью
Не вычисляет остаток, но заменяет его в задачах округления денежных сумм до заданной точности
Типичные ошибки и как их избежать
Отдельная группа ошибок — логические. Например, разработчик проверяет Номер % 2 = 1 для определения нечётности, но нумерация в цикле начинается с нуля, и визуально «первая» строка оказывается чётной. Совет: явно задавайте начальное значение счётчика и проговаривайте, с 0 или с 1 идёт отсчёт.
Как проверить результат
Быстрый способ — окно «Вычислить выражение» (Shift+F9) в конфигураторе при отладке: введите выражение с оператором % и посмотрите значение. Для разовой проверки без отладки подойдёт временный вызов Сообщить(17 % 5) в любом серверном модуле.
Как проверить результат
Результат 2
Любое другое число или ошибка типов — проверьте операнды
Результат 0 — деление нацело
Ненулевое значение указывает на ошибку в данных
Перед вычислением есть проверка Делитель <> 0
Проверки нет — возможно исключение в рабочей базе
После внедрения кода в обработку прогоните её на граничных данных: нулевой делитель, делимое меньше делителя, отрицательные значения, пустые реквизиты. Такой минимальный набор тестов отсекает большинство ошибок до попадания кода в рабочую базу.
Что важно запомнить
Остаток от деления в 1С — это оператор %: Результат = Делимое % Делитель. Проверяйте тип операндов, всегда исключайте нулевой делитель, для денежных сумм сначала округляйте значения, а результат тестируйте на граничных случаях.
Частые вопросы
Как проверить, что число чётное, в 1С?
Используйте условие Число % 2 = 0. Если остаток от деления на два равен нулю — число чётное, иначе нечётное. Проверка работает для любых целых значений, включая ноль.
Что произойдёт, если делитель равен нулю?
Платформа выдаст исключение «Деление на ноль» и прервёт выполнение кода. Чтобы избежать падения, проверяйте делитель условием Если Делитель <> 0 либо оборачивайте вычисление в Попытка...Исключение с осмысленной обработкой ошибки.
Можно ли применять % к дробным числам?
Технически да, оператор сработает. Но из-за особенностей представления дробных чисел результат может отличаться от ожидаемого на малые величины. Для денежных и количественных расчётов надёжнее сначала округлить значения функцией Окр() до нужной точности.
Чем отличается % от функции Цел()?
Оператор % возвращает остаток от деления, а Цел() — целую часть числа, отбрасывая дробную. Вместе они дают полный результат деления: Цел(17 / 5) равно 3 (частное), 17 % 5 равно 2 (остаток).
Как получить остаток от деления в запросе?
В языке запросов 1С для этой задачи используется конструкция вычисления остатка через деление и приведение типов либо выражение с ВЫБОР, в зависимости от версии платформы. Проще и надёжнее вычислить остаток уже после запроса — в цикле обхода выборки оператором %.
Почему 3 % 5 возвращает 3, а не 0?
Так устроена математика остатка: три не делится на пять ни одного раза, поэтому целая часть равна нулю, а остаток — всё делимое, то есть 3. Если ваша логика ожидает другого поведения, добавьте явную проверку соотношения делимого и делителя.