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

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

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

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

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

Основной инструмент — оператор остатка от деления %. Если число делится на 2 без остатка, оно четное; если остаток равен 1 — нечетное. Этот подход работает для целых чисел любого знака и не требует подключения общих модулей или внешних компонент.

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

Проверка четности через остаток от деления

Во встроенном языке 1С оператор % возвращает остаток от деления. Для четного числа остаток от деления на 2 всегда равен нулю. Минимальный пример проверки выглядит так:

Число = 10;

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

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

Иначе

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

КонецЕсли;

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

ЭтоЧетное = (Число % 2 = 0);

Переменная ЭтоЧетное примет значение Истина для четных чисел и Ложь для нечетных. Такой вариант удобен в условиях компоновки, при вычислении выражений в запросах-выражениях и при заполнении параметров.

bsl
Если Число % 2 = 0 Тогда
	// число четное
Иначе
	// число нечетное
КонецЕсли;

Как работает оператор % и какие у него ограничения

Оператор % вычисляет остаток от целочисленного деления. Для положительных чисел поведение очевидно: 7 % 2 вернет 1, 8 % 2 вернет 0. Для отрицательных чисел результат тоже корректен для задачи четности: -7 % 2 даст -1, а -8 % 2 даст 0, поэтому сравнение именно с нулем остается надежным признаком четности.

Важное ограничение — деление на ноль. Если делитель равен нулю, платформа вызовет исключение. В задаче четности делитель всегда константа 2, поэтому риск отсутствует, но при переиспользовании приема с переменным делителем проверяйте его перед операцией.

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

Универсальная функция для общего модуля

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

// Возвращает признак четности целого числа.

//

// Параметры:

// Значение - Число - проверяемое целое число.

//

// Возвращаемое значение:

// Булево - Истина, если число четное.

//

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

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

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

КонецЕсли;

Возврат Цел(Значение) % 2 = 0;

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

Функция сначала проверяет тип входного значения, затем отсекает дробную часть через Цел() и только после этого вычисляет остаток. Такой порядок защищает от ошибок выполнения и делает поведение предсказуемым при передаче дробных данных.

Размещайте функцию в общем модуле с признаком «Сервер», если она используется в серверных процедурах. Если проверка нужна и на клиенте, включите флажки «Клиент (обычное приложение)» и «Клиент (управляемое приложение)», избегая при этом вызовов серверных методов внутри функции.

Порядок действий
  1. 1
    Убедитесь, что проверяемое значение имеет тип «Число»
  2. 2
    При необходимости отсеките дробную часть функцией Цел()
  3. 3
    Вычислите остаток от деления на 2 оператором %
  4. 4
    Сравните остаток с нулем и используйте результат в условии
  5. 5
    Проверьте работу на положительных, отрицательных и нулевом значении

Четность при работе с дробными числами

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

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

Если Значение = Цел(Значение) Тогда

// число целое, можно проверять четность

Иначе

// дробное число, четность не определена

КонецЕсли;

Не применяйте проверку четности к дробным числам напрямую: 7.5 % 2 вернет 1.5, и сравнение с нулем формально отработает, но результат не будет иметь смысла для бизнес-логики.

Практические сценарии применения

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

Классический сценарий — зебра-подсветка строк при программном формировании табличного документа или динамической обработки. Номер строки проверяется на четность, и в зависимости от результата применяется цвет фона:

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

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

// оформление четной строки

Иначе

// оформление нечетной строки

КонецЕсли;

КонецЦикла;

Разбиение данных на две группы

При распределении нагрузки или формировании пакетов записи делят по четности индекса или порядкового номера. Это простой способ равномерно разложить элементы без сложных алгоритмов балансировки.

Обработка пар значений

Если коллекция хранит данные попарно (ключ и значение, координаты X и Y), четность индекса позволяет понять роль текущего элемента. Здесь

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

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

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

В запросах оператор остатка недоступен напрямую в некоторых конструкциях языка запросов 1С. Там четность вычисляют через выражение вида НомерСтроки - (ВЫРАЗИТЬ(НомерСтроки / 2 КАК ЧИСЛО(15, 0))) * 2 либо выносят расчет на уровень кода после выполнения запроса. Конкретный синтаксис зависит от версии платформы, поэтому проверяйте поведение на тестовых данных.

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

Оператор % (остаток от деления)

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

Целочисленное деление Цел(Число / 2) * 2

Работает везде, где есть деление, но запись длиннее и легче допустить ошибку в скобках

Проверка в запросе через ВЫРАЗИТЬ

Подходит, когда результат нужен на стороне СУБД; синтаксис громоздкий и зависит от версии платформы

Типичные ошибки и проверка результата

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

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

Для проверки корректности достаточно прогнать функцию на контрольном наборе: 0 (четное), 1 (нечетное), 2 (четное), -3 (нечетное), -4 (четное) и дробном значении, например 2.5. Если результаты совпадают с ожиданиями, реализация верна.

Типичные ошибки
01
Сравнение остатка с 1 вместо 0 — ломает логику на отрицательных числах
02
Передача строки или Неопределено в оператор % — исключение и остановка кода
03
Проверка дробного числа без Цел() — бессмысленный результат
04
Путаница с началом индексации коллекции — инвертированная логика четности
Контрольные точки

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

Число 0
Норма

Функция возвращает Истина (четное)

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

Возвращает Ложь или ошибку

Отрицательное четное, например -4
Норма

Возвращает Истина

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

Возвращает Ложь — проверьте сравнение с нулем

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

Обработано по заданному правилу (отклонено или приведено к целому)

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

Результат вычислен напрямую без обработки дробной части

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

Итог

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

Четность в 1С определяется остатком от деления на 2: Число % 2 = 0. Сравнивайте остаток именно с нулем, проверяйте тип значения перед операцией и приводите дробные числа к целым через Цел(). Для повторного использования оформите проверку функцией в общем модуле.

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

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

Нет, штатной функции вида «Четное()» во встроенном языке нет. Проверку реализуют через оператор остатка от деления % и при необходимости выносят в собственную функцию общего модуля.

Как проверить четность отрицательного числа?

Тем же выражением Число % 2 = 0. Для отрицательных четных чисел остаток равен нулю, поэтому сравнение с нулем корректно. Не используйте сравнение с единицей — для отрицательных нечетных чисел остаток равен -1.

Что будет, если передать в оператор % строку или Неопределено?

Платформа вызовет исключение, и выполнение процедуры прервется. Перед проверкой убедитесь, что значение имеет тип «Число», например через ТипЗнч(Значение) = Тип("Число").

Можно ли определить четность дробного числа?

Четность определена только для целых чисел. Для дробных значений сначала решите, как их трактовать: отклонить, округлить или отсечь дробную часть функцией Цел(). Прямая проверка 7.5 % 2 даст 1.5 и не имеет смысла для бизнес-логики.

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

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

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

Скорее всего, причина в начале нумерации: индексы массивов в 1С начинаются с нуля, а привычная нумерация строк — с единицы. Смещение на единицу инвертирует четность. Согласуйте логику проверки с фактическим началом отсчета в вашей коллекции.