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

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

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

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

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

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

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

Функция Число() — основной способ преобразования

Глобальная функция Число() принимает значение и пытается привести его к числовому типу. Она корректно обрабатывает строки вида "123", "123.45", "-50", а также булевы значения (Истина превращается в 1, Ложь — в 0) и даты (в число секунд, хотя на практике такое преобразование почти не используется осознанно).

Пример простейшего использования:

СтрокаИзФайла = "1250,50";

// Внимание: разделитель должен соответствовать ожиданиям функции

Результат = Число("1250.50"); // 1250.5

ЦелоеЧисло = Число("42"); // 42

Важная особенность: функция Число() ожидает точку в качестве разделителя дробной части. Строка "1250,50" с запятой вызовет ошибку, потому что запятая не распознаётся как разделитель. Это самая частая причина сбоев при загрузке данных из Excel, CSV и текстовых файлов, выгруженных с русскими региональными настройками.

Если преобразование невозможно, функция генерирует исключение и прерывает выполнение кода. Поэтому вызывать её «в лоб» на непроверенных данных из внешних источников нельзя — нужна защита, о которой ниже.

Безопасное преобразование через Попытка/Исключение

Стандартный приём в прикладном коде — обернуть вызов Число() в конструкцию Попытка...Исключение и задать значение по умолчанию на случай ошибки. Это особенно актуально при пакетной загрузке: одна «битая» строка не должна обрывать обработку всего файла.

Функция СтрокаВЧисло(Строка, ЗначениеПоУмолчанию = 0)

Результат = ЗначениеПоУмолчанию;

Попытка

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

Исключение

// Строка не является числом — оставляем значение по умолчанию

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

Возврат Результат;

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

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

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

bsl
Попытка
	СуммаДокумента = Число(СтрЗаменить(ИсходнаяСтрока, ",", "."));
Исключение
	СуммаДокумента = 0;
	ЗаписьЖурналаРегистрации("Загрузка", УровеньЖурналаРегистрации.Предупреждение,,, "Не удалось преобразовать: " + ИсходнаяСтрока);
КонецПопытки;

Подготовка строки: разделители, пробелы и лишние символы

Реальные данные редко приходят в чистом виде. Типичные загрязнения: запятая вместо точки, неразрывный пробел как разделитель разрядов ("1 250,50"), символ валюты, буква «О» вместо нуля, пробелы по краям. Перед вызовом Число() строку нужно нормализовать.

Минимальный набор операций очистки выглядит так:

Функция ОчиститьИПреобразовать(ИсходнаяСтрока)

Строка = СокрЛП(ИсходнаяСтрока);

// Неразрывный пробел (код 160) и обычный пробел — разделители разрядов

Строка = СтрЗаменить(Строка, Символ(160), "");

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

// Запятую приводим к точке

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

Результат = 0;

Попытка

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

Исключение

Результат = 0;

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

Возврат Результат;

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

Обратите внимание на неразрывный пробел: визуально он неотличим от обычного, поэтому данные, скопированные из Excel или веб-страниц, часто «не преобразуются» без видимой причины. Удаление Символ(160) решает эту проблему. Если в данных встречаются символы валют или единицы измерения, их тоже удаляют через СтрЗаменить до преобразования.

Типичные ошибки
01
Преобразование строки с запятой без замены на точку — функция Число() выдаёт исключение даже на корректном числе
02
Игнорирование неразрывного пробела (Символ(160)) — строка "1 250" визуально выглядит нормально, но не преобразуется
03
Вызов Число() без Попытки в цикле загрузки — одна некорректная строка обрывает обработку всего файла
04
Сравнение строки с числом без преобразования — результат сравнения непредсказуем и зависит от строкового представления

Проверка строки перед преобразованием

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

Простой вариант проверки — перебор символов:

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

Такая проверка не гарантирует стопроцентной корректности (строка "1.2.3" пройдёт фильтр, но не преобразуется), поэтому её обычно комбинируют с Попытка/Исключение. В типовых конфигурациях есть готовые функции вида СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке() — если конфигурация на БСП, используйте их вместо собственных велосипедов.

Порядок действий при загрузке чисел из файла
  1. 1
    Прочитайте значение ячейки или поля как строку
  2. 2
    Удалите неразрывные и обычные пробелы, символы валют
  3. 3
    Замените запятую на точку как разделитель дробной части
  4. 4
    Преобразуйте через Число() внутри Попытка/Исключение
  5. 5
    При ошибке запишите строку в протокол и присвойте значение по умолчанию
  6. 6
    Проверьте результат на допустимость (например, сумма не отрицательна)

Преобразование через ОписаниеТипов и другие сценарии

Метод ОписаниеТипов.ПривестиЗначение() — альтернативный способ, который ведёт себя мягче: вместо исключения он часто возвращает значение по умолчанию для типа (для числа — 0), если приведение невозможно. Это удобно, когда нужно привести значение к типу реквизита объекта.

ОписаниеЧисла = Новый ОписаниеТипов("Число", 

Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой));

Результат = ОписаниеЧисла.ПривестиЗначение("123,45");

Дополнительный плюс ОписаниеТипов — автоматическое округление до заданной разрядности и отсечение лишних знаков. Это полезно при присвоении значений реквизитам документов: тип реквизита известен, и приведение гарантирует соответствие.

Число в запросе

В языке запросов преобразование выполняется функцией ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)). Она применяется, когда значение хранится в строковом или составном поле, а по нему нужно сортировать, сравнивать или агрегировать. Учтите: приведение в запросе не может обработать некорректные строки — результат для них будет непредсказуем, поэтому данные лучше очищать на этапе записи.

Обратная задача: число в строку

Для обратного преобразования используют Строка(), Формат() или строковое соединение. Функция Формат(Значение, "ЧГ=0") позволяет убрать группировку разрядов, чтобы число выводилось без пробелов — это важно при выгрузке в файлы обмена, где пробелы сломают загрузку на принимающей стороне.

Сравнение способов преобразования

Число() + Попытка

Универсальный вариант для любых строк. Требует очистки разделителей и обработки исключения

ОписаниеТипов.ПривестиЗначение()

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

ВЫРАЗИТЬ в запросе

Только внутри запроса, для сортировки и агрегации. Не очищает некорректные данные

Функции БСП

Готовые проверки и преобразования в типовых конфигурациях. Не подходят для самописных решений без БСП

Проверка результата и граничные случаи

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

Отдельный граничный случай — очень большие числа и точность. Числовой тип в 1С имеет ограниченную разрядность (в типовых реквизитах обычно задаётся квалификаторами, например 15 знаков и 2 дробных). При превышении разрядности значение округляется или отсекается без предупреждения, что при финансовых расчётах недопустимо. Контролируйте квалификаторы числа у реквизитов, в которые записывается результат.

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

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

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

Тип значения после преобразования
Норма

ТипЗнч(Результат) = Тип("Число")

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

Значение осталось строкой или стало Неопределено

Дробная часть
Норма

Копейки и знаки после разделителя сохранены

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

Дробная часть потерялась из-за запятой в исходной строке

Большие числа
Норма

Все разряды на месте

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

Лишние пробелы-разделители или округление из-за квалификаторов

Поведение на ошибке
Норма

Некорректная строка попала в протокол, загрузка продолжилась

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

Вся обработка упала с исключением на первой битой строке

Итог

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

Преобразование в число в 1С делается функцией Число(), но в прикладном коде она всегда идёт в связке с очисткой строки (пробелы, запятые, Символ(160)) и обработкой исключений. Для приведения к типу реквизита используйте ОписаниеТипов, в запросах — ВЫРАЗИТЬ. Проверяйте не только факт преобразования, но и смысловую допустимость результата.

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

Почему Число("123,45") выдаёт ошибку?

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

Что вернёт Число() для пустой строки?

Для пустой строки функция вызовет исключение, а не вернёт 0. Если пустые значения допустимы, проверяйте строку на пустоту до вызова или используйте Попытка/Исключение со значением по умолчанию.

Как преобразовать строку с пробелами-разделителями вида "1 250 000"?

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

Чем отличается Число() от ОписаниеТипов.ПривестиЗначение()?

Число() при невозможности преобразования вызывает исключение. ПривестиЗначение() ведёт себя мягче и дополнительно округляет результат по квалификаторам (разрядность, знак), что удобно при присвоении реквизитам объектов.

Как преобразовать булево значение в число?

Функция Число() корректно обрабатывает булевы значения: Истина превращается в 1, Ложь — в 0. Отдельной обработки не требуется.

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

Используйте конструкцию ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)) в секции УПОРЯДОЧИТЬ ПО. Учтите, что некорректные строковые значения могут дать непредсказуемый результат, поэтому данные лучше очищать при записи.