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

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

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

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

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

Во встроенном языке 1С нет отдельной функции вида «ЭтоЧетное()», поэтому чётность определяется через арифметику — остаток от деления на 2. Ниже разобраны все рабочие способы: в коде модулей, в языке запросов, в выражениях СКД и в пользовательских сценариях без программирования.

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

Во встроенном языке 1С оператор % возвращает остаток от деления. Если остаток от деления числа на 2 равен нулю — число чётное. Это самый короткий и общепринятый способ:

Число = 10;

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

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

Иначе

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

КонецЕсли;

Тот же результат можно получить функцией Цел(): если Цел(Число / 2) = Число / 2, дробной части нет и число чётное. Однако вариант с % читается проще и работает быстрее для восприятия, поэтому именно его стоит использовать как основной.

Для отрицательных чисел поведение тоже корректное: -4 % 2 даст 0, а -3 % 2 даст -1, то есть проверка = 0 остаётся надёжной и для отрицательных значений.

bsl
Функция ЭтоЧетноеЧисло(Число)
    Возврат Число % 2 = 0;
КонецФункции

Проверка чётности через универсальную функцию

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

// Общий модуль ОбщегоНазначения

Функция ЭтоЧетноеЧисло(Число) Экспорт

Если ТипЗнч(Число) <> Тип("Число") Тогда

ВызватьИсключение "Ожидалось значение типа Число";

КонецЕсли;

Возврат Число % 2 = 0;

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

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

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

В языке запросов 1С тоже доступен оператор остатка от деления %. Это позволяет отобрать, например, только документы с чётными номерами строк или разбить данные на две группы прямо на уровне выборки, без постобработки в коде.

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

Товары.Количество КАК Количество

ИЗ

Документ.РеализацияТоваров.Товары КАК Товары

ГДЕ

Товары.Количество % 2 = 0

Если нужно не отфильтровать, а пометить строки, используйте конструкцию ВЫБОР:

ВЫБРАТЬ

Строки.НомерСтроки КАК НомерСтроки,

ВЫБОР

КОГДА Строки.НомерСтроки % 2 = 0

ТОГДА "Чётная"

ИНАЧЕ "Нечётная"

КОНЕЦ КАК ПризнакЧетности

ИЗ

Документ.Заказ.Товары КАК Строки

Учтите ограничение: оператор % в запросах поддерживается не во всех СУБД одинаково и применим только к целочисленным значениям. Если поле имеет дробную часть (например, количество 2,5), результат может отличаться от ожидаемого — в таких случаях сначала приведите значение к целому через ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 0)).

Проверка чётности в СКД и вычисляемых полях

В системе компоновки данных чётность обычно нужна для оформления: например, для «зебры» — чередования фона строк отчёта. Для этого создаётся вычисляемое поле с выражением остатка от деления номера строки.

Типовой подход: добавить в набор данных поле с порядковым номером строки, затем в ресурсах или в условном оформлении проверять НомерСтроки % 2 = 0. В выражениях СКД доступен тот же оператор %, что и в запросах.

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

Где выполнять проверку

Встроенный язык (модуль)

Подходит для логики обработки, проведения, валидации. Полный контроль над типами и ошибками.

Язык запросов

Подходит для отбора и группировки данных на уровне выборки. Ограничение — только целые числа.

СКД, вычисляемое поле

Подходит для оформления отчётов и чередования строк. Не влияет на данные, только на представление.

Типовые сценарии применения

Чередование строк в таблице формы

При программном оформлении динамического списка или таблицы значений чётность индекса строки определяет цвет фона. Индексы в коллекциях 1С начинаются с нуля, поэтому «первая» визуально строка имеет индекс 0 и считается чётной — это нужно учитывать, чтобы не получить смещение раскраски на одну строку.

Распределение данных на две группы

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

Валидация пользовательского ввода

В некоторых учётных схемах номера или количества должны быть кратны двум (парная упаковка, комплекты из двух единиц). Проверка % 2 = 0 в обработчике ПередЗаписью или ПриЗаписи позволяет отклонить некорректное значение с понятным сообщением пользователю.

Порядок действий для проверки в коде
  1. 1
    Убедитесь, что значение имеет тип Число (ТипЗнч или Тип)
  2. 2
    Примените выражение Число % 2 = 0
  3. 3
    При необходимости вынесите проверку в функцию общего модуля
  4. 4
    Протестируйте на нуле, отрицательных и дробных значениях

Типичные ошибки и ограничения

Первая частая ошибка — проверка чётности строки. Если число пришло из формы как строка, оператор % вызовет ошибку. Сначала преобразуйте значение: используйте попытку с Число(Строка) или проверку через СтроковыеФункцииКлиентСервер.

Вторая ошибка — ожидание, что % корректно работает с дробными числами везде одинаково. Во встроенном языке 5,5 % 2 вернёт остаток от деления дробного значения, что редко соответствует ожиданиям бизнес-логики. Для дробных величин сначала определитесь, что именно считается «чётным», и при необходимости округлите.

Третья ошибка — сравнение остатка с 1 вместо 0 для отрицательных чисел. Выражение Число % 2 = 1 не сработает для -3, потому что остаток будет -1. Проверка на чётность через = 0 безопасна, а вот проверку на нечётность надёжнее писать как <> 0.

Типичные ошибки
01
Проверка чётности строки без преобразования в число — ошибка выполнения на операторе %
02
Сравнение остатка с 1 для нечётности — не работает для отрицательных чисел, используйте <> 0
03
Применение % к дробным значениям без округления — непредсказуемый результат
04
Забытая нумерация с нуля в коллекциях — смещение чередования строк на одну позицию
Контрольные точки

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

Число 10
Норма

Число % 2 = 0 возвращает Истина

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

Возвращает Ложь — проверьте тип значения

Число -7
Норма

-7 % 2 = 0 возвращает Ложь (нечётное)

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

Возвращает Истина — ошибка в логике сравнения

Число 0
Норма

0 % 2 = 0 возвращает Истина, ноль считается чётным

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

Код падает с исключением — есть лишняя проверка на ноль

Часто задаваемые вопросы

Есть ли в 1С встроенная функция проверки чётности?

Нет, отдельной функции во встроенном языке нет. Стандартный приём — остаток от деления: Число % 2 = 0. При необходимости напишите собственную функцию в общем модуле и используйте её во всей конфигурации.

Считается ли ноль чётным числом в 1С?

Да. Выражение 0 % 2 = 0 возвращает Истина, что соответствует математическому определению: ноль — чётное число. Если по бизнес-логике ноль нужно исключить, добавьте отдельную проверку.

Как проверить чётность числа, введённого пользователем в поле формы?

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

Работает ли оператор % в языке запросов на всех СУБД?

Оператор остатка от деления поддерживается языком запросов 1С, но корректность гарантируется для целочисленных операндов. Для полей с дробной частью сначала приведите значение к целому типу через ВЫРАЗИТЬ, иначе результат может отличаться на разных СУБД.

Как сделать чередование цвета строк отчёта без кода?

Используйте условное оформление в СКД: добавьте вычисляемое поле с номером строки, затем создайте два элемента оформления с условиями НомерСтроки % 2 = 0 и НомерСтроки % 2 <> 0, задав разный цвет фона. Программный код для этого не требуется.

Чем проверка через % лучше проверки через Цел(Число / 2)?

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

Итог

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

Чётность в 1С определяется выражением Число % 2 = 0 — в модуле, запросе или вычисляемом поле СКД. Проверяйте тип значения перед операцией, помните про нумерацию коллекций с нуля и используйте <> 0 для проверки нечётности отрицательных чисел.