Разработка и Конфигурация · 10 мин
Как проверить кратность числа в 1С
Как проверить кратность числа в 1С: оператор остатка от деления %, функция проверки чётности, примеры кода, типичные ошибки и проверка результата.
Во встроенном языке 1С нет отдельной функции «ЧислоКратно», но задача решается одной строкой кода через оператор остатка от деления — символ процента (%). Выражение А % Б возвращает остаток от деления А на Б, и если остаток равен нулю, значит А делится на Б без остатка, то есть кратно ему.
Такая проверка встречается в практике постоянно: определить чётность номера строки таблицы для чередования окраски, проверить, делится ли количество товара на размер упаковки, вычислить високосный год, сформировать каждый N-й документ, разбить партию на равные части. Во всех этих сценариях используется один и тот же приём.
Ниже разобраны базовый синтаксис, готовая универсальная функция, прикладные примеры для типовых задач, особенности работы с дробными и отрицательными числами, а также типичные ошибки, из-за которых проверка даёт неверный результат.
Оператор остатка от деления: базовый синтаксис
Оператор % во встроенном языке 1С работает так же, как операция mod в других языках: возвращает остаток от целочисленного деления. Конструкция проверки кратности выглядит так:
Число = 24;
Делитель = 6;
Если Число % Делитель = 0 Тогда
Сообщить("Число кратно делителю");
Иначе
Сообщить("Есть остаток: " + (Число % Делитель));
КонецЕсли;
Здесь 24 % 6 вернёт 0, поэтому сработает ветка «кратно». Если подставить 25, остаток будет 1, и условие не выполнится. Важно помнить: сравнение идёт строго с нулём, а не с пустым значением или Ложью — результат оператора всегда число.
Отдельный частный случай — проверка чётности. Число чётное, если оно кратно двум:
Если НомерСтроки % 2 = 0 Тогда
// чётная строка
КонецЕсли;
Если Число % Делитель = 0 Тогда
// число кратно делителю
КонецЕсли;Универсальная функция проверки кратности
Чтобы не дублировать одну и ту же конструкцию по всему модулю, проверку удобно вынести в функцию общего модуля. Функция принимает число и делитель, возвращает значение типа Булево.
Функция ЧислоКратно(Число, Делитель) Экспорт
Если Делитель = 0 Тогда
Возврат Ложь;
КонецЕсли;
Возврат Число % Делитель = 0;
КонецФункции
Обратите внимание на первую строку тела функции — защиту от деления на ноль. Оператор % с нулевым делителем вызывает ошибку выполнения и прерывает код. Если делитель приходит из пользовательского ввода или из данных документа, проверка на ноль обязательна.
Использование функции в прикладном коде становится читаемым:
Если ЧислоКратно(КоличествоТовара, КоличествоВУпаковке) Тогда
ТекстСообщения = "Товар укладывается в целое число упаковок";
КонецЕсли;
Прикладные примеры в типовых задачах
Чередование оформления строк
Классический сценарий — «зебра» в табличном документе или динамической раскраске. Чётные и нечётные строки определяются остатком от деления номера на 2:
Для НомерСтроки = 1 По ТаблицаЗначений.Количество() Цикл
Если НомерСтроки % 2 = 0 Тогда
// цвет фона для чётной строки
КонецЕсли;
КонецЦикла;
Проверка упаковки товара
При отгрузке часто нужно убедиться, что количество кратно размеру транспортной упаковки, чтобы не отгружать «разорванные» места:
ОстатокОтУпаковки = КоличествоОтгрузки % КоличествоВКоробе;
Если ОстатокОтУпаковки <> 0 Тогда
Сообщить("Неполный короб: " + ОстатокОтУпаковки + " шт.");
КонецЕсли;
Каждый N-й элемент
Если нужно выполнить действие для каждого пятого, десятого или сотого элемента — например, вывести промежуточное состояние длительной обработки:
Для Сч = 1 По ВсегоЗаписей Цикл
// обработка записи
Если Сч % 100 = 0 Тогда
Состояние("Обработано " + Сч + " из " + ВсегоЗаписей);
КонецЕсли;
КонецЦикла;
Високосный год
Год високосный, если он кратен 4, но не кратен 100, либо кратен 400. На встроенном языке это выражается комбинацией проверок:
Функция ГодВисокосный(Год)
Возврат (Год % 4 = 0 И Год % 100 <> 0) Или Год % 400 = 0;
КонецФункции
- 1Определите, какое число проверяется и какой делитель задаёт кратность
- 2Убедитесь, что делитель не может быть равен нулю, либо добавьте проверку
- 3Напишите условие вида «Если Число % Делитель = 0 Тогда»
- 4Вынесите проверку в функцию общего модуля, если она используется более одного раза
- 5Протестируйте на граничных значениях: ноль, отрицательные числа, делитель больше числа
Особенности: отрицательные и дробные числа
С отрицательными числами оператор % работает корректно для проверки кратности: -15 % 5 вернёт 0, и условие кратности выполнится. Однако при ненулевом остатке знак остатка может зависеть от знака делимого, поэтому сравнивать результат следует именно с нулём, а не с положительным числом.
Дробные числа — более тонкий случай. Оператор % применим и к ним, но из-за особенностей хранения дробных значений в двоичном виде выражение вроде 0.3 % 0.1 может дать не точный ноль, а очень маленькое число. Для денежных и количественных значений надёжнее сначала привести всё к целым: например, работать в копейках или в минимальных единицах измерения.
СуммаВКопейках = Окр(Сумма * 100, 0);
Если СуммаВКопейках % 50 = 0 Тогда
// сумма кратна 50 копейкам
КонецЕсли;
Альтернативные способы проверки
Помимо оператора %, кратность можно проверить через целую часть деления. Функция Цел() отбрасывает дробную часть, и сравнение результата деления с его целой частью показывает, делится ли число нацело:
Если Число / Делитель = Цел(Число / Делитель) Тогда
// делится нацело
КонецЕсли;
Этот способ рабочий, но менее читаемый и чуть медленнее, поэтому в новом коде предпочтителен оператор %. Вариант с Цел() иногда встречается в старых конфигурациях — при доработке такого кода его можно безопасно заменить на остаток от деления.
Способы проверки кратности
Основной способ: короткая запись, понятный смысл, работает с целыми и отрицательными числами. Требует проверки делителя на ноль.
Альтернатива через целую часть деления. Подходит для поддержки старого кода, но менее читаема и тоже требует защиты от деления на ноль.
Не отдельный алгоритм, а обёртка над оператором % с защитой от нулевого делителя. Рекомендуется при повторном использовании в разных объектах.
Типичные ошибки и как их избежать
Чаще всего проблемы возникают не из-за самого оператора, а из-за данных, которые в него попадают. Разберём основные сценарии сбоев.
Первая ошибка — отсутствие проверки делителя на ноль. Если делитель вычисляется из реквизита, который пользователь не заполнил, код падает с ошибкой. Вторая — сравнение остатка с Ложью или пустой строкой вместо нуля: Если Число % 2 Тогда в строгой типизации 1С может вести себя не так, как ожидает разработчик, привыкший к другим языкам. Всегда пишите полное сравнение = 0 или <> 0.
Третья группа ошибок — типы данных. Если в переменной оказалась строка или Неопределено, оператор % вызовет ошибку. Перед вычислением убедитесь, что оба операнда — числа, например через проверку ТипЗнч(Число) = Тип("Число") или через ОписаниеТипов на уровне реквизита.
Как проверить результат
После внедрения проверки кратности протестируйте её на граничных значениях. Минимальный набор: число, кратное делителю; число с остатком 1; ноль в качестве проверяемого числа (0 кратен любому ненулевому делителю — остаток 0); делитель больше числа (например, 3 % 10 = 3, не кратно); отрицательное число.
Для быстрой отладки используйте окно «Вычислить выражение» (Shift+F9) в конфигураторе: остановитесь на точке останова и вычислите выражение вида Число % Делитель с реальными данными. Это покажет и фактический остаток, и типы операндов.
Контрольные точки
Результат 0, условие истинно
Ненулевой остаток — проверьте типы данных
Код отрабатывает защиту и продолжает работу
Ошибка выполнения «Деление на ноль»
Результат 0 — ноль кратен любому делителю
Условие не срабатывает — ошибка в логике сравнения
Проверка после приведения к целым единицам
Ложное «не кратно» при визуально точных значениях
Если проверка используется в проведении документов или регламентных операциях, дополнительно прогоните сценарий на копии базы с реальными данными: именно там всплывают незаполненные реквизиты и неожиданные типы значений.
Что важно запомнить
Кратность в 1С проверяется оператором остатка от деления: «Число % Делитель = 0». Всегда защищайтесь от деления на ноль, сравнивайте остаток явно с нулём, дробные значения приводите к целым, а повторно используемую проверку выносите в функцию общего модуля.
Частые вопросы
Как проверить, чётное ли число в 1С?
Чётность — это кратность двум. Используйте условие Если Число % 2 = 0 Тогда для чётных и Если Число % 2 <> 0 Тогда для нечётных. Отдельной встроенной функции чётности в языке нет.
Что вернёт выражение 0 % 5?
Ноль. Ноль делится на любое ненулевое число без остатка, поэтому условие кратности для нулевого значения будет истинным. Учитывайте это, если ноль в вашей задаче не должен считаться допустимым значением — добавьте отдельную проверку.
Почему проверка кратности суммы даёт неверный результат?
Чаще всего причина в дробной части: суммы хранятся с копейками, и остаток от деления получается ненулевым из-за погрешности представления дробных чисел. Приведите сумму к копейкам с округлением (Окр(Сумма * 100, 0)) и проверяйте кратность уже целого значения.
Можно ли использовать % в запросах 1С?
В языке запросов 1С оператора остатка от деления нет. Если кратность нужна в запросе, вычисляйте её в коде до или после запроса, либо используйте обход через целую часть: сравнение выражения деления с его усечённым значением. На практике проще выбрать данные запросом, а кратность проверить в цикле обхода.
Как проверить кратность сразу нескольким числам?
Число кратно нескольким делителям одновременно, если оно кратно их наименьшему общему кратному. Для простых случаев достаточно составного условия: Если Число % 3 = 0 И Число % 5 = 0 Тогда. Для взаимно простых делителей это равносильно проверке на их произведение (в примере — на 15).
Работает ли оператор % с отрицательными числами?
Да, для проверки кратности оператор работает корректно: -20 % 4 вернёт 0. Однако при ненулевом остатке его знак может быть отрицательным, поэтому для логики «кратно / не кратно» всегда сравнивайте результат именно с нулём, а не с положительным значением.