Разработка и Конфигурация · 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.
Функция ЭтоЦелоеЧисло(Значение) Экспорт
Если ТипЗнч(Значение) <> Тип("Число") Тогда
Возврат Ложь;
КонецЕсли;
Возврат Значение = Цел(Значение);
КонецФункцииПроверка через остаток от деления
Ещё один вариант — оператор остатка от деления %. Если остаток от деления числа на 1 равен нулю, число целое:
Если Значение % 1 = 0 Тогда
// число целое
КонецЕсли;
Способ рабочий, но менее читаемый, чем сравнение с Цел(), и требует тех же предварительных проверок типа. Он уместен, когда в той же логике уже используется деление по модулю — например, при проверке кратности упаковки товара: Количество % ВУпаковке = 0 проверяет, что количество делится на размер упаковки без остатка.
Учитывайте, что оператор % в 1С работает именно как остаток от деления, а не как операция взятия по модулю в математическом смысле, что для проверки целостности значения не имеет.
Сравнение способов проверки
Самый читаемый и универсальный вариант. Подходит для любых чисел, легко выносится в общую функцию.
Даёт тот же результат проверки, но логика менее очевидна для читающего код. Уместен, если рядом уже используется округление.
Компактно, но менее наглядно. Хорош для проверок кратности, где % уже применяется по существу задачи.
Проверка строковых значений из файлов и форм
При загрузке данных из Excel, CSV или при чтении ответа веб-сервиса числа часто приходят строками. Строку «15» нужно сначала преобразовать в число, а строку «15,7» — распознать как дробное. Прямое преобразование через Число() вызовет исключение на нечисловой строке, поэтому используют конструкцию Попытка...Исключение:
Функция СтрокаЭтоЦелоеЧисло(Строка)
Попытка
ЗначениеЧисло = Число(Строка);
Исключение
Возврат Ложь;
КонецПопытки;
Возврат ЗначениеЧисло = Цел(ЗначениеЧисло);
КонецФункции
Перед преобразованием полезно нормализовать строку: убрать пробелы через СокрЛП() и заменить запятую на точку, если данные приходят с разделителем-запятой, — функция Число() воспринимает точку как разделитель дробной части. Строки вида «1 200» с неразрывным пробелом-разделителем разрядов также требуют предварительной очистки через СтрЗаменить().
Для полей ввода на форме есть более мягкий вариант: задать реквизиту формы тип «Число» с точностью 0. Тогда платформа сама не даст ввести дробное значение, и отдельная проверка в коде становится избыточной — это надёжнее, чем проверять после ввода.
- 1Убрать лишние пробелы: Строка = СокрЛП(Строка)
- 2Заменить запятую на точку: Строка = СтрЗаменить(Строка, ",", ".")
- 3В блоке Попытка преобразовать: ЗначениеЧисло = Число(Строка)
- 4При исключении — зафиксировать ошибку загрузки для строки
- 5Сравнить: ЗначениеЧисло = Цел(ЗначениеЧисло)
- 6Если не равны — значение дробное, обработать по правилам задачи
Типичные ошибки и ограничения
Первая распространённая ошибка — проверка целостности без проверки типа. Код Если Значение = Цел(Значение) упадёт с исключением, если Значение окажется строкой, даже числовой на вид. Всегда начинайте с ТипЗнч().
Вторая ошибка — использование Цел() для округления. Разработчик ожидает, что Цел(7,9) даст 8, но получает 7, и дальнейшие сравнения количества товара идут с заниженным значением. Для округления до ближайшего целого используется Окр(), для округления вверх — комбинация с условием или Цел(Значение + 0,5) для положительных чисел.
Третья проблема — игнорирование отрицательных чисел и нуля. Ноль — целое число, и корректная проверка должна возвращать для него «Истина». Если по смыслу задачи нужны только положительные целые (например, количество штук товара), добавьте отдельное условие Значение > 0, не смешивая его с проверкой целостности.
Практические сценарии применения
В документах реализации проверка целого количества нужна для штучных товаров: если номенклатура учитывается в штуках, дробное количество — ошибка ввода. Проверку размещают в обработчике ОбработкаПроверкиЗаполнения или в процедуре проведения, выводя пользователю сообщение с указанием строки табличной части.
В обменах данными проверка защищает от некорректных значений из внешних систем: если по бизнес-правилу поле должно быть целым, а пришло «12,5», значение либо отклоняется с записью в журнал, либо приводится к целому по согласованному правилу (отбрасывание или округление) с фиксацией факта преобразования.
В расчётных алгоритмах проверка целостности результата используется для валидации: например, если сумма делится на количество и результат должен быть целым (распределение штук по коробам), нецелый результат сигнализирует о необходимости ручной корректировки распределения.
Как выбрать подход
Проверка результата и отладка
После внедрения функции проверьте её на граничных значениях: 0, -5, 7,0, 7,5, -3,14, очень большое целое число и строка «10». Для быстрой отладки удобно вывести промежуточные значения через Сообщить() или воспользоваться табло в конфигураторе.
Признак корректной работы: функция возвращает «Истина» для 0, 7, -5 и строки «10» после преобразования, и «Ложь» — для 7,5, -3,14, строки «abc» и значений нечисловых типов. Если для строки «10,0» функция возвращает «Истина» — это нормально: после преобразования в число это значение целое.
Как проверить результат
Функция возвращает Истина
Ложь — ошибка в логике сравнения
Функция возвращает Ложь
Истина — сравнение не работает
Истина, исключений нет
Необработанное исключение — нет блока Попытка
Ложь без падения кода
Исключение преобразования типа
Что важно запомнить
Проверка целого числа в 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. Отдельной обработки знака не требуется.