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

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

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

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

Во встроенном языке 1С нет отдельной функции «ЧислоКратно», но задача решается одной строкой кода через оператор остатка от деления — символ процента (%). Выражение А % Б возвращает остаток от деления А на Б, и если остаток равен нулю, значит А делится на Б без остатка, то есть кратно ему.

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

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

Оператор остатка от деления: базовый синтаксис

Оператор % во встроенном языке 1С работает так же, как операция mod в других языках: возвращает остаток от целочисленного деления. Конструкция проверки кратности выглядит так:

Число = 24;

Делитель = 6;

Если Число % Делитель = 0 Тогда

Сообщить("Число кратно делителю");

Иначе

Сообщить("Есть остаток: " + (Число % Делитель));

КонецЕсли;

Здесь 24 % 6 вернёт 0, поэтому сработает ветка «кратно». Если подставить 25, остаток будет 1, и условие не выполнится. Важно помнить: сравнение идёт строго с нулём, а не с пустым значением или Ложью — результат оператора всегда число.

Отдельный частный случай — проверка чётности. Число чётное, если оно кратно двум:

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

// чётная строка

КонецЕсли;

bsl
Если Число % Делитель = 0 Тогда
	// число кратно делителю
КонецЕсли;

Универсальная функция проверки кратности

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

Функция ЧислоКратно(Число, Делитель) Экспорт

Если Делитель = 0 Тогда

Возврат Ложь;

КонецЕсли;

Возврат Число % Делитель = 0;

КонецФункции

Обратите внимание на первую строку тела функции — защиту от деления на ноль. Оператор % с нулевым делителем вызывает ошибку выполнения и прерывает код. Если делитель приходит из пользовательского ввода или из данных документа, проверка на ноль обязательна.

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

Если ЧислоКратно(КоличествоТовара, КоличествоВУпаковке) Тогда

ТекстСообщения = "Товар укладывается в целое число упаковок";

КонецЕсли;

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

Чередование оформления строк

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

Для НомерСтроки = 1 По ТаблицаЗначений.Количество() Цикл

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

// цвет фона для чётной строки

КонецЕсли;

КонецЦикла;

Проверка упаковки товара

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

ОстатокОтУпаковки = КоличествоОтгрузки % КоличествоВКоробе;

Если ОстатокОтУпаковки <> 0 Тогда

Сообщить("Неполный короб: " + ОстатокОтУпаковки + " шт.");

КонецЕсли;

Каждый N-й элемент

Если нужно выполнить действие для каждого пятого, десятого или сотого элемента — например, вывести промежуточное состояние длительной обработки:

Для Сч = 1 По ВсегоЗаписей Цикл

// обработка записи

Если Сч % 100 = 0 Тогда

Состояние("Обработано " + Сч + " из " + ВсегоЗаписей);

КонецЕсли;

КонецЦикла;

Високосный год

Год високосный, если он кратен 4, но не кратен 100, либо кратен 400. На встроенном языке это выражается комбинацией проверок:

Функция ГодВисокосный(Год)

Возврат (Год % 4 = 0 И Год % 100 <> 0) Или Год % 400 = 0;

КонецФункции

Как добавить проверку кратности в свой код
  1. 1
    Определите, какое число проверяется и какой делитель задаёт кратность
  2. 2
    Убедитесь, что делитель не может быть равен нулю, либо добавьте проверку
  3. 3
    Напишите условие вида «Если Число % Делитель = 0 Тогда»
  4. 4
    Вынесите проверку в функцию общего модуля, если она используется более одного раза
  5. 5
    Протестируйте на граничных значениях: ноль, отрицательные числа, делитель больше числа

Особенности: отрицательные и дробные числа

С отрицательными числами оператор % работает корректно для проверки кратности: -15 % 5 вернёт 0, и условие кратности выполнится. Однако при ненулевом остатке знак остатка может зависеть от знака делимого, поэтому сравнивать результат следует именно с нулём, а не с положительным числом.

Дробные числа — более тонкий случай. Оператор % применим и к ним, но из-за особенностей хранения дробных значений в двоичном виде выражение вроде 0.3 % 0.1 может дать не точный ноль, а очень маленькое число. Для денежных и количественных значений надёжнее сначала привести всё к целым: например, работать в копейках или в минимальных единицах измерения.

СуммаВКопейках = Окр(Сумма * 100, 0);

Если СуммаВКопейках % 50 = 0 Тогда

// сумма кратна 50 копейкам

КонецЕсли;

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

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

Если Число / Делитель = Цел(Число / Делитель) Тогда

// делится нацело

КонецЕсли;

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

Способы проверки кратности

Оператор %

Основной способ: короткая запись, понятный смысл, работает с целыми и отрицательными числами. Требует проверки делителя на ноль.

Цел(Число / Делитель)

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

Функция общего модуля

Не отдельный алгоритм, а обёртка над оператором % с защитой от нулевого делителя. Рекомендуется при повторном использовании в разных объектах.

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

Чаще всего проблемы возникают не из-за самого оператора, а из-за данных, которые в него попадают. Разберём основные сценарии сбоев.

Первая ошибка — отсутствие проверки делителя на ноль. Если делитель вычисляется из реквизита, который пользователь не заполнил, код падает с ошибкой. Вторая — сравнение остатка с Ложью или пустой строкой вместо нуля: Если Число % 2 Тогда в строгой типизации 1С может вести себя не так, как ожидает разработчик, привыкший к другим языкам. Всегда пишите полное сравнение = 0 или <> 0.

Третья группа ошибок — типы данных. Если в переменной оказалась строка или Неопределено, оператор % вызовет ошибку. Перед вычислением убедитесь, что оба операнда — числа, например через проверку ТипЗнч(Число) = Тип("Число") или через ОписаниеТипов на уровне реквизита.

Типичные ошибки
01
Нет проверки делителя на ноль — код прерывается ошибкой выполнения
02
Сравнение остатка с Ложью вместо явного «= 0» — неочевидное поведение условия
03
Проверка кратности дробных чисел без округления — ложный результат из-за погрешности
04
Передача строки или Неопределено вместо числа — ошибка типа данных
05
Дублирование одной и той же проверки в десятке мест вместо функции общего модуля

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

После внедрения проверки кратности протестируйте её на граничных значениях. Минимальный набор: число, кратное делителю; число с остатком 1; ноль в качестве проверяемого числа (0 кратен любому ненулевому делителю — остаток 0); делитель больше числа (например, 3 % 10 = 3, не кратно); отрицательное число.

Для быстрой отладки используйте окно «Вычислить выражение» (Shift+F9) в конфигураторе: остановитесь на точке останова и вычислите выражение вида Число % Делитель с реальными данными. Это покажет и фактический остаток, и типы операндов.

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

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

Кратное число: 24 % 6
Норма

Результат 0, условие истинно

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

Ненулевой остаток — проверьте типы данных

Нулевой делитель
Норма

Код отрабатывает защиту и продолжает работу

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

Ошибка выполнения «Деление на ноль»

Нулевое число: 0 % 5
Норма

Результат 0 — ноль кратен любому делителю

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

Условие не срабатывает — ошибка в логике сравнения

Дробные значения
Норма

Проверка после приведения к целым единицам

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

Ложное «не кратно» при визуально точных значениях

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

Итог

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

Кратность в 1С проверяется оператором остатка от деления: «Число % Делитель = 0». Всегда защищайтесь от деления на ноль, сравнивайте остаток явно с нулём, дробные значения приводите к целым, а повторно используемую проверку выносите в функцию общего модуля.

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

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

Чётность — это кратность двум. Используйте условие Если Число % 2 = 0 Тогда для чётных и Если Число % 2 <> 0 Тогда для нечётных. Отдельной встроенной функции чётности в языке нет.

Что вернёт выражение 0 % 5?

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

Почему проверка кратности суммы даёт неверный результат?

Чаще всего причина в дробной части: суммы хранятся с копейками, и остаток от деления получается ненулевым из-за погрешности представления дробных чисел. Приведите сумму к копейкам с округлением (Окр(Сумма * 100, 0)) и проверяйте кратность уже целого значения.

Можно ли использовать % в запросах 1С?

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

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

Число кратно нескольким делителям одновременно, если оно кратно их наименьшему общему кратному. Для простых случаев достаточно составного условия: Если Число % 3 = 0 И Число % 5 = 0 Тогда. Для взаимно простых делителей это равносильно проверке на их произведение (в примере — на 15).

Работает ли оператор % с отрицательными числами?

Да, для проверки кратности оператор работает корректно: -20 % 4 вернёт 0. Однако при ненулевом остатке его знак может быть отрицательным, поэтому для логики «кратно / не кратно» всегда сравнивайте результат именно с нулём, а не с положительным значением.