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