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

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

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

Как проверить, целое число или нет, в 1С: функции Цел(), ТипЗначения, проверка дробной части, обработка строковых значений. Примеры кода для 1С 8.3.

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

Задача разбивается на две подзадачи: убедиться, что значение вообще является числом, и убедиться, что у него нет дробной части. Обе проверки нужны, потому что значение «12,5» — число, но не целое, а значение «12 шт.» — вообще строка, и попытка арифметики с ней вызовет ошибку выполнения.

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

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

Прежде чем проверять целостность, нужно убедиться, что значение вообще число. В 1С для этого служит функция ТипЗнч(), которая возвращает тип переданного значения. Сравнение выполняется с типом «Число»:

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

// дальнейшая проверка на целостность

Иначе

Сообщить("Значение не является числом");

КонецЕсли;

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

Обратите внимание: числовой реквизит документа с ненулевой точностью (например, Число(15,3)) может хранить дробные значения, даже если пользователь обычно вводит целые. Тип реквизита не гарантирует целостность конкретного значения — это разные вещи.

Проверка целостности через функцию Цел()

Основной и самый читаемый способ — сравнить число с его целой частью. Функция Цел() отбрасывает дробную часть без округления: Цел(7,9) вернёт 7, а Цел(-3,2) вернёт -3. Если исходное значение равно результату Цел(), дробной части нет:

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

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

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

КонецЕсли;

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

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

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

Альтернатива — сравнение с округлённым значением через Окр(Значение, 0). Математически результат тот же для проверки целостности: если число равно самому себе, округлённому до нуля знаков, дробной части нет. Разница между Цел() и Окр() проявляется только при получении целой части: Окр(7,9, 0) даст 8, а Цел(7,9) — 7.

bsl
Функция ЭтоЦелоеЧисло(Значение) Экспорт
	Если ТипЗнч(Значение) <> Тип("Число") Тогда
		Возврат Ложь;
	КонецЕсли;
	Возврат Значение = Цел(Значение);
КонецФункции

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

Ещё один вариант — оператор остатка от деления %. Если остаток от деления числа на 1 равен нулю, число целое:

Если Значение % 1 = 0 Тогда

// число целое

КонецЕсли;

Способ рабочий, но менее читаемый, чем сравнение с Цел(), и требует тех же предварительных проверок типа. Он уместен, когда в той же логике уже используется деление по модулю — например, при проверке кратности упаковки товара: Количество % ВУпаковке = 0 проверяет, что количество делится на размер упаковки без остатка.

Учитывайте, что оператор % в 1С работает именно как остаток от деления, а не как операция взятия по модулю в математическом смысле, что для проверки целостности значения не имеет.

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

Значение = Цел(Значение)

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

Значение = Окр(Значение, 0)

Даёт тот же результат проверки, но логика менее очевидна для читающего код. Уместен, если рядом уже используется округление.

Значение % 1 = 0

Компактно, но менее наглядно. Хорош для проверок кратности, где % уже применяется по существу задачи.

Проверка строковых значений из файлов и форм

При загрузке данных из Excel, CSV или при чтении ответа веб-сервиса числа часто приходят строками. Строку «15» нужно сначала преобразовать в число, а строку «15,7» — распознать как дробное. Прямое преобразование через Число() вызовет исключение на нечисловой строке, поэтому используют конструкцию Попытка...Исключение:

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

Попытка

ЗначениеЧисло = Число(Строка);

Исключение

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

КонецПопытки;

Возврат ЗначениеЧисло = Цел(ЗначениеЧисло);

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

Перед преобразованием полезно нормализовать строку: убрать пробелы через СокрЛП() и заменить запятую на точку, если данные приходят с разделителем-запятой, — функция Число() воспринимает точку как разделитель дробной части. Строки вида «1 200» с неразрывным пробелом-разделителем разрядов также требуют предварительной очистки через СтрЗаменить().

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

Порядок проверки значения из файла
  1. 1
    Убрать лишние пробелы: Строка = СокрЛП(Строка)
  2. 2
    Заменить запятую на точку: Строка = СтрЗаменить(Строка, ",", ".")
  3. 3
    В блоке Попытка преобразовать: ЗначениеЧисло = Число(Строка)
  4. 4
    При исключении — зафиксировать ошибку загрузки для строки
  5. 5
    Сравнить: ЗначениеЧисло = Цел(ЗначениеЧисло)
  6. 6
    Если не равны — значение дробное, обработать по правилам задачи

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

Первая распространённая ошибка — проверка целостности без проверки типа. Код Если Значение = Цел(Значение) упадёт с исключением, если Значение окажется строкой, даже числовой на вид. Всегда начинайте с ТипЗнч().

Вторая ошибка — использование Цел() для округления. Разработчик ожидает, что Цел(7,9) даст 8, но получает 7, и дальнейшие сравнения количества товара идут с заниженным значением. Для округления до ближайшего целого используется Окр(), для округления вверх — комбинация с условием или Цел(Значение + 0,5) для положительных чисел.

Третья проблема — игнорирование отрицательных чисел и нуля. Ноль — целое число, и корректная проверка должна возвращать для него «Истина». Если по смыслу задачи нужны только положительные целые (например, количество штук товара), добавьте отдельное условие Значение > 0, не смешивая его с проверкой целостности.

Типичные ошибки
01
Проверка Цел(Значение) без ТипЗнч() — падение кода на строковых и ссылочных значениях
02
Использование Цел() вместо Окр() — заниженные значения при округлении количеств
03
Преобразование Число(Строка) без Попытка/Исключение — необработанное исключение на «грязных» данных из файлов
04
Смешение проверки целостности и проверки на положительность — ноль и отрицательные целые отбрасываются ошибочно

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

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

В обменах данными проверка защищает от некорректных значений из внешних систем: если по бизнес-правилу поле должно быть целым, а пришло «12,5», значение либо отклоняется с записью в журнал, либо приводится к целому по согласованному правилу (отбрасывание или округление) с фиксацией факта преобразования.

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

Маршрут решения

Как выбрать подход

Значение уже гарантированно число (реквизит типа Число)Достаточно сравнения Значение = Цел(Значение)
Значение приходит из файла, формы или сервиса как строкаСначала Число() внутри Попытка/Исключение, затем проверка целостности
Нужно запретить дробный ввод на формеЗадайте реквизиту точность 0 — платформа заблокирует дробный ввод сама
Проверяется кратность (упаковки, партии)Используйте остаток от деления: Количество % Кратность = 0

Проверка результата и отладка

После внедрения функции проверьте её на граничных значениях: 0, -5, 7,0, 7,5, -3,14, очень большое целое число и строка «10». Для быстрой отладки удобно вывести промежуточные значения через Сообщить() или воспользоваться табло в конфигураторе.

Признак корректной работы: функция возвращает «Истина» для 0, 7, -5 и строки «10» после преобразования, и «Ложь» — для 7,5, -3,14, строки «abc» и значений нечисловых типов. Если для строки «10,0» функция возвращает «Истина» — это нормально: после преобразования в число это значение целое.

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

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

Целые числа: 0, 7, -5
Норма

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

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

Ложь — ошибка в логике сравнения

Дробные числа: 7,5 и -3,14
Норма

Функция возвращает Ложь

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

Истина — сравнение не работает

Строка "10" после преобразования
Норма

Истина, исключений нет

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

Необработанное исключение — нет блока Попытка

Нечисловая строка "abc"
Норма

Ложь без падения кода

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

Исключение преобразования типа

Итог

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

Проверка целого числа в 1С строится на двух шагах: контроль типа через ТипЗнч() и сравнение значения с Цел(Значение). Строки преобразуются через Число() внутри Попытка/Исключение. Для полей ввода надёжнее ограничить точность реквизита нулём, чем проверять значение после ввода.

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

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

Нет, отдельной функции «ЭтоЦелое» в языке нет. Проверку реализуют сравнением значения с результатом функции Цел() или через остаток от деления на 1. Обычно такую проверку оформляют как функцию в общем модуле, чтобы вызывать её из любого места конфигурации.

Чем Цел() отличается от Окр()?

Цел() отбрасывает дробную часть: Цел(7,9) вернёт 7. Окр() округляет до ближайшего значения с заданной точностью: Окр(7,9, 0) вернёт 8. Для проверки целостности подходят оба варианта, а для получения целой части результата разница существенна — выбирайте функцию по смыслу задачи.

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

Надёжнее всего задать реквизиту формы тип «Число» с точностью 0 — тогда платформа сама не позволит ввести дробную часть. Если реквизит строковый, преобразуйте введённое значение через Число() в блоке Попытка/Исключение и сравните с Цел() от полученного числа.

Почему Число("1 200") вызывает ошибку?

Функция Число() не воспринимает пробелы-разделители разрядов и некоторые другие символы форматирования. Перед преобразованием очистите строку: уберите пробелы через СтрЗаменить(Строка, " ", "") и СокрЛП(), замените запятую на точку, если она используется как разделитель дробной части.

Ноль считается целым числом в такой проверке?

Да, сравнение 0 = Цел(0) истинно, и проверка вернёт «Истина». Если по бизнес-логике нужны только положительные целые значения (например, количество товара в штуках), добавьте отдельное условие Значение > 0 — не смешивайте его с проверкой целостности.

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

Да, сравнение Значение = Цел(Значение) корректно для отрицательных чисел: -5 = Цел(-5) даёт «Истина», а -3,14 = Цел(-3,14) — «Ложь», так как Цел(-3,14) возвращает -3. Отдельной обработки знака не требуется.