Разработка и Конфигурация · 9 мин
Как проверить, является ли значение числом в 1С
Способы проверки типа значения в 1С: функция ТипЗнч, Тип("Число"), ОписаниеТипов, преобразование строки в число и обработка ошибок. Примеры кода.
Проверка типа значения — одна из самых частых задач при разработке на встроенном языке 1С. Данные приходят из форм, файлов обмена, запросов и внешних источников, и перед арифметическими операциями нужно убедиться, что в переменной действительно число, а не строка, дата или значение Неопределено.
Платформа 1С не имеет отдельной функции вида «ЭтоЧисло», поэтому проверку выполняют несколькими способами: через функцию ТипЗнч и сравнение с типом «Число», через объект ОписаниеТипов, а также через попытку преобразования значения встроенной функцией Число() с обработкой исключения. У каждого подхода есть свои ограничения и сценарии применения.
Ниже разобраны рабочие варианты проверки с примерами кода, типичные ошибки и рекомендации, какой способ выбрать в конкретной ситуации.
Проверка через ТипЗнч и Тип("Число")
Основной и самый надёжный способ — функция ТипЗнч, которая возвращает тип переданного значения. Результат сравнивается с типом, полученным через конструктор Тип("Число").
Значение = 125.5;
Если ТипЗнч(Значение) = Тип("Число") Тогда
Сообщить("Это число");
Иначе
Сообщить("Это не число");
КонецЕсли;
Такая проверка корректно работает для любых значений: целых, дробных, отрицательных и нуля. Важно понимать, что строка "125" этой проверкой будет признана строкой, а не числом — ТипЗнч анализирует именно тип хранящегося значения, а не его внешний вид.
Для краткости проверку часто оформляют как отдельную функцию в общем модуле, чтобы вызывать её из разных мест конфигурации:
Функция ЭтоЧисло(Значение) Экспорт
Возврат ТипЗнч(Значение) = Тип("Число");
КонецФункции
Если ТипЗнч(Значение) = Тип("Число") Тогда
// значение является числом
КонецЕсли;Проверка с учётом составного типа и ОписаниеТипов
В реквизитах объектов и колонках таблиц значений тип может быть составным — например, «Число или Строка». Если нужно узнать, допускает ли реквизит хранение числа, анализируют не конкретное значение, а описание типов реквизита.
Для этого используют метод СодержитТип объекта ОписаниеТипов:
ОписаниеТипа = Метаданные.Справочники.Номенклатура.Реквизиты.Вес.Тип;
Если ОписаниеТипа.СодержитТип(Тип("Число")) Тогда
Сообщить("Реквизит может хранить число");
КонецЕсли;
Дополнительно у описания типа можно проверить квалификаторы числа: длину, точность и признак неотрицательности. Это полезно, когда нужно убедиться, что значение впишется в ограничения реквизита, например что дробная часть не превышает допустимую разрядность.
Проверка строки, которая должна содержать число
На практике чаще всего требуется не проверить тип переменной, а понять, можно ли строку из файла, поля ввода или веб-сервиса превратить в число. Здесь сравнение типов не поможет — нужна попытка преобразования.
Стандартный приём — функция Число() внутри конструкции Попытка...Исключение:
СтрокаИзФайла = "1 250,75";
Результат = Неопределено;
Попытка
Результат = Число(СтрокаИзФайла);
Исключение
Результат = Неопределено;
КонецПопытки;
Если Результат = Неопределено Тогда
Сообщить("Значение не является числом");
КонецЕсли;
У этого подхода есть тонкости. Функция Число() чувствительна к формату: пробелы-разделители разрядов, запятая или точка как разделитель дробной части, символы валюты могут привести к ошибке или к неожиданному результату в зависимости от региональных настроек. Перед преобразованием строку рекомендуется очистить: убрать неразрывные пробелы, лишние символы и привести разделитель к единому виду с помощью СтрЗаменить.
СтрокаОчищенная = СтрЗаменить(СтрокаИзФайла, Символ(160), ""); // неразрывный пробел
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, " ", "");
СтрокаОчищенная = СтрЗаменить(СтрокаОчищенная, ",", ".");
- 1Удалите из строки пробелы, неразрывные пробелы и символы валют
- 2Приведите разделитель дробной части к одному виду (точка или запятая)
- 3Выполните Число(Строка) внутри Попытка...Исключение
- 4Проверьте результат: если возникло исключение — строка не является числом
- 5При необходимости дополнительно проверьте знак и диапазон значения
Альтернатива без исключений: проверка символов
Если использование Попытка...Исключение нежелательно (например, в массовой обработке, где исключения замедляют выполнение), строку можно проверить посимвольно: убедиться, что она состоит только из цифр, одного разделителя и, при необходимости, знака минус в начале.
Функция СтрокаСодержитЧисло(Строка)
Допустимые = "0123456789.,-";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Если СтрНайти(Допустимые, Сред(Строка, Позиция, 1)) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Такая проверка подтверждает только состав символов, но не гарантирует корректность формата: строка "12-3.4,5" пройдёт фильтр, хотя числом не является. Поэтому посимвольную проверку обычно совмещают с дополнительными условиями — количество разделителей не больше одного, минус только в первой позиции.
Сравнение способов проверки
Подходит для проверки уже типизированных значений в переменных и реквизитах. Не работает со строками, содержащими цифры.
Подходит для строк из файлов и форм. Требует предварительной очистки строки и учёта региональных разделителей.
Подходит для массовой обработки без исключений. Проверяет только состав символов, формат нужно контролировать отдельно.
Типичные ошибки при проверке чисел
Самая распространённая ошибка — сравнение значения со строкой "Число" или попытка использовать несуществующую функцию ЭтоЧисло. Платформа такого встроенного метода не предоставляет, проверка делается только через типы или преобразование.
Вторая частая проблема — игнорирование значения Null из запросов. Если поле запроса не заполнено, в результате будет Null, и любая арифметика с ним даст ошибку. Для полей запроса удобно использовать ЕСТЬNULL(Поле, 0) прямо в тексте запроса.
Третья ошибка — доверие к функции Число() без очистки строки. Строка "1 000 руб." вызовет исключение, а строка с неразрывным пробелом из Excel может повести себя непредсказуемо. Данные из внешних источников всегда нужно нормализовать перед преобразованием.
Как убедиться, что проверка работает правильно
После внедрения проверки протестируйте её на граничных значениях: ноль, отрицательное число, дробное значение с точкой и с запятой, пустая строка, строка из одних пробелов, очень большое число, значение Неопределено и Null. Каждый вариант должен давать ожидаемый результат.
Для массовых загрузок полезно логировать отклонённые значения: записывайте в протокол исходную строку и причину отказа. Это позволит быстро найти проблемные записи в файле и не останавливать всю загрузку из-за одной ошибки.
Как проверить результат
Определяется как число
Обрабатывается как пустое значение
Отклоняется проверкой
Преобразуется в 0 без предупреждения
После очистки преобразуется в число
Возникает исключение из-за пробела или запятой
Заменяется через ЕСТЬNULL или отсеивается
Попадает в арифметику и вызывает ошибку
Ответы на частые вопросы
Есть ли в 1С встроенная функция ЭтоЧисло?
Нет, встроенной функции с таким именем платформа не предоставляет. Проверку выполняют сравнением ТипЗнч(Значение) = Тип("Число") или создают собственную функцию в общем модуле и вызывают её по имени ЭтоЧисло.
Почему строка "123" не проходит проверку ТипЗнч на число?
Потому что ТипЗнч анализирует тип хранящегося значения, а не его содержимое. Строка "123" имеет тип «Строка», даже если состоит только из цифр. Чтобы работать с ней как с числом, сначала выполните преобразование функцией Число().
Как проверить число в запросе 1С?
В тексте запроса можно использовать конструкцию ВЫБОР с проверкой типа через ВЫРАЗИТЬ или функцию ЕСТЬNULL для замены Null. Для проверки типа поля чаще анализируют метаданные до построения запроса, а не само значение в запросе.
Что делать, если Число() выдаёт ошибку на корректной строке?
Проверьте наличие неразрывных пробелов (код символа 160), которые часто попадают в данные при копировании из Excel или веб-страниц, и региональный разделитель дробной части. Очистите строку через СтрЗаменить и повторите преобразование.
Как проверить, что число целое, а не дробное?
Сравните значение с результатом функции Цел(Значение): если они равны, дробная часть отсутствует. Дополнительно можно убедиться, что тип значения — «Число», чтобы не сравнивать значения разных типов.
Что важно запомнить
Проверка числа в 1С делается через ТипЗнч(Значение) = Тип("Число") для типизированных значений и через Число() с Попытка...Исключение для строк. Строки из внешних источников очищайте от пробелов и приводите разделитель к единому виду, а Null из запросов заменяйте через ЕСТЬNULL.