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

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

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

Способы проверки типа значения в 1С: функция ТипЗнч, Тип("Число"), ОписаниеТипов, преобразование строки в число и обработка ошибок. Примеры кода.

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

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

Ниже разобраны рабочие варианты проверки с примерами кода, типичные ошибки и рекомендации, какой способ выбрать в конкретной ситуации.

Проверка через ТипЗнч и Тип("Число")

Основной и самый надёжный способ — функция ТипЗнч, которая возвращает тип переданного значения. Результат сравнивается с типом, полученным через конструктор Тип("Число").

Значение = 125.5;

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

Сообщить("Это число");

Иначе

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

КонецЕсли;

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

Для краткости проверку часто оформляют как отдельную функцию в общем модуле, чтобы вызывать её из разных мест конфигурации:

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

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

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

bsl
Если ТипЗнч(Значение) = Тип("Число") Тогда
    // значение является числом
КонецЕсли;

Проверка с учётом составного типа и ОписаниеТипов

В реквизитах объектов и колонках таблиц значений тип может быть составным — например, «Число или Строка». Если нужно узнать, допускает ли реквизит хранение числа, анализируют не конкретное значение, а описание типов реквизита.

Для этого используют метод СодержитТип объекта ОписаниеТипов:

ОписаниеТипа = Метаданные.Справочники.Номенклатура.Реквизиты.Вес.Тип;

Если ОписаниеТипа.СодержитТип(Тип("Число")) Тогда

Сообщить("Реквизит может хранить число");

КонецЕсли;

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

Проверка строки, которая должна содержать число

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

Стандартный приём — функция Число() внутри конструкции Попытка...Исключение:

СтрокаИзФайла = "1 250,75";

Результат = Неопределено;

Попытка

Результат = Число(СтрокаИзФайла);

Исключение

Результат = Неопределено;

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

Если Результат = Неопределено Тогда

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

КонецЕсли;

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

СтрокаОчищенная = СтрЗаменить(СтрокаИзФайла, Символ(160), ""); // неразрывный пробел

СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, " ", "");

СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, ",", ".");

Порядок проверки строки на число
  1. 1
    Удалите из строки пробелы, неразрывные пробелы и символы валют
  2. 2
    Приведите разделитель дробной части к одному виду (точка или запятая)
  3. 3
    Выполните Число(Строка) внутри Попытка...Исключение
  4. 4
    Проверьте результат: если возникло исключение — строка не является числом
  5. 5
    При необходимости дополнительно проверьте знак и диапазон значения

Альтернатива без исключений: проверка символов

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

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

Допустимые = "0123456789.,-";

Для Позиция = 1 По СтрДлина(Строка) Цикл

Если СтрНайти(Допустимые, Сред(Строка, Позиция, 1)) = 0 Тогда

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

КонецЕсли;

КонецЦикла;

Возврат Истина;

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

Такая проверка подтверждает только состав символов, но не гарантирует корректность формата: строка "12-3.4,5" пройдёт фильтр, хотя числом не является. Поэтому посимвольную проверку обычно совмещают с дополнительными условиями — количество разделителей не больше одного, минус только в первой позиции.

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

ТипЗнч = Тип("Число")

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

Число() с Попытка...Исключение

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

Посимвольная проверка

Подходит для массовой обработки без исключений. Проверяет только состав символов, формат нужно контролировать отдельно.

Типичные ошибки при проверке чисел

Самая распространённая ошибка — сравнение значения со строкой "Число" или попытка использовать несуществующую функцию ЭтоЧисло. Платформа такого встроенного метода не предоставляет, проверка делается только через типы или преобразование.

Вторая частая проблема — игнорирование значения Null из запросов. Если поле запроса не заполнено, в результате будет Null, и любая арифметика с ним даст ошибку. Для полей запроса удобно использовать ЕСТЬNULL(Поле, 0) прямо в тексте запроса.

Третья ошибка — доверие к функции Число() без очистки строки. Строка "1 000 руб." вызовет исключение, а строка с неразрывным пробелом из Excel может повести себя непредсказуемо. Данные из внешних источников всегда нужно нормализовать перед преобразованием.

Типичные ошибки
01
Сравнение ТипЗнч(Значение) со строкой "Число" вместо Тип("Число") — условие всегда ложно
02
Арифметика с Null или Неопределено без предварительной проверки — ошибка выполнения
03
Вызов Число() для строки с пробелами и символами валют без очистки — ложное срабатывание исключения
04
Проверка только состава символов без контроля количества разделителей — некорректные строки проходят как числа

Как убедиться, что проверка работает правильно

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

Для массовых загрузок полезно логировать отклонённые значения: записывайте в протокол исходную строку и причину отказа. Это позволит быстро найти проблемные записи в файле и не останавливать всю загрузку из-за одной ошибки.

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

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

Число 0
Норма

Определяется как число

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

Обрабатывается как пустое значение

Пустая строка
Норма

Отклоняется проверкой

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

Преобразуется в 0 без предупреждения

Строка "1 250,50"
Норма

После очистки преобразуется в число

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

Возникает исключение из-за пробела или запятой

Значение Null из запроса
Норма

Заменяется через ЕСТЬNULL или отсеивается

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

Попадает в арифметику и вызывает ошибку

Ответы на частые вопросы

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

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

Почему строка "123" не проходит проверку ТипЗнч на число?

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

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

В тексте запроса можно использовать конструкцию ВЫБОР с проверкой типа через ВЫРАЗИТЬ или функцию ЕСТЬNULL для замены Null. Для проверки типа поля чаще анализируют метаданные до построения запроса, а не само значение в запросе.

Что делать, если Число() выдаёт ошибку на корректной строке?

Проверьте наличие неразрывных пробелов (код символа 160), которые часто попадают в данные при копировании из Excel или веб-страниц, и региональный разделитель дробной части. Очистите строку через СтрЗаменить и повторите преобразование.

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

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

Итог

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

Проверка числа в 1С делается через ТипЗнч(Значение) = Тип("Число") для типизированных значений и через Число() с Попытка...Исключение для строк. Строки из внешних источников очищайте от пробелов и приводите разделитель к единому виду, а Null из запросов заменяйте через ЕСТЬNULL.