Разработка и Конфигурация · 10 мин
1С 8: как преобразовать строку в число
Как в 1С 8 преобразовать строку в число: функция Число(), обработка ошибок, разделители, пробелы, запросы и типовые приёмы с примерами кода.
Задача преобразовать строку в число в 1С 8 возникает постоянно: данные приходят из файлов Excel и CSV, из веб-сервисов, из обменов с банками и сайтами, из реквизитов типа «Строка» в старых конфигурациях. Встроенный язык платформы даёт несколько способов такого преобразования, и у каждого есть свои ограничения, о которых нужно знать заранее, чтобы не получить ошибку «Преобразование значения к типу Число не может быть выполнено» в рабочей базе.
Основной инструмент — функция Число(), которая пытается интерпретировать переданное значение как число. Однако она строга к формату: лишние пробелы, разделитель разрядов, валютные символы или неправильный десятичный разделитель приводят к исключению. Поэтому в реальной разработке преобразование почти всегда сопровождается предварительной очисткой строки и обработкой ошибок.
Ниже разобраны все рабочие способы: прямое преобразование, безопасный вариант с обработкой исключений, очистка строки от мусора, преобразование в запросах, а также типичные ошибки и способы проверки результата.
Базовый способ: функция Число()
Функция Число(Значение) — штатный способ приведения строки к числовому типу. Она принимает строку, содержащую цифры, необязательный знак минус в начале и десятичный разделитель. Важно: в качестве разделителя дробной части функция воспринимает точку, а не запятую — это одна из самых частых причин ошибок, потому что в российских данных дробная часть обычно отделена запятой.
Число("123") // 123
Число("-45.7") // -45.7
Число("123,45") // ошибка преобразования
Число("1 200,50") // ошибка преобразования
Если строка содержит запятую, её нужно предварительно заменить на точку. Если в строке есть разделители разрядов — обычные или неразрывные пробелы — их нужно удалить. Символ валюты, буквы и любые другие посторонние символы также вызывают исключение.
Очистка строки перед преобразованием
Данные из внешних источников почти всегда «грязные»: суммы из Excel содержат неразрывные пробелы, выгрузки с сайтов — символ валюты, а банковские файлы — разделители разрядов. Универсальный приём — последовательно убрать всё лишнее с помощью СтрЗаменить и СокрЛП.
Строка = "1 234 567,89 руб.";
Строка = СтрЗаменить(Строка, Символ(160), ""); // неразрывный пробел
Строка = СтрЗаменить(Строка, " ", "");
Строка = СтрЗаменить(Строка, "руб.", "");
Строка = СтрЗаменить(Строка, ",", ".");
Результат = Число(СокрЛП(Строка)); // 1234567.89
Обратите внимание на Символ(160) — это неразрывный пробел, который визуально неотличим от обычного, но не удаляется ни СокрЛП, ни заменой обычного пробела. Именно он чаще всего становится причиной «необъяснимых» ошибок преобразования при загрузке сумм из Excel.
Если формат входных данных заранее неизвестен, полезно оставить в строке только цифры, точку, запятую и минус, удалив всё остальное циклом по символам или регулярным выражением через VBScript.RegExp (на Windows-клиенте) или через поиск недопустимых символов.
- 1Удалите неразрывные пробелы: СтрЗаменить(Строка, Символ(160), "")
- 2Уберите обычные пробелы и символы валюты
- 3Замените запятую на точку
- 4Примените СокрЛП к результату
- 5Выполните Число() внутри блока Попытка/Исключение
- 6Проверьте результат на адекватность (например, неотрицательность)
Безопасное преобразование через Попытка/Исключение
Если строка приходит извне и её корректность не гарантирована, прямой вызов Число() опасен: исключение прервёт выполнение обработки. Стандартный приём — обернуть преобразование в конструкцию Попытка...Исключение...КонецПопытки и при неудаче вернуть значение по умолчанию, обычно 0 или Неопределено.
Функция СтрокаВЧисло(Строка)
Результат = 0;
Попытка
Результат = Число(Строка);
Исключение
Результат = 0;
КонецПопытки;
Возврат Результат;
КонецФункции
Такую функцию удобно разместить в общем модуле и вызывать во всех обменах. Внутри блока Исключение можно не только вернуть ноль, но и записать предупреждение в журнал регистрации или в протокол загрузки — это помогает найти проблемные строки в исходном файле, не останавливая весь процесс.
Альтернатива без исключений — предварительная проверка строки: убедиться, что она состоит только из цифр, одного десятичного разделителя и, возможно, минуса в начале. Такая проверка быстрее обработки исключения, если «битых» строк много, но код получается объёмнее.
Функция СтрокаВЧисло(Строка)
Подготовленная = СтрЗаменить(Строка, Символ(160), "");
Подготовленная = СтрЗаменить(Подготовленная, " ", "");
Подготовленная = СтрЗаменить(Подготовленная, ",", ".");
Попытка
Возврат Число(СокрЛП(Подготовленная));
Исключение
Возврат 0;
КонецПопытки;
КонецФункцииПреобразование в запросах
В языке запросов 1С прямого аналога функции Число() нет — оператор ВЫРАЗИТЬ приводит только между совместимыми типами и не умеет превращать строку в число. Поэтому стандартная стратегия — выбрать строковые данные запросом, а преобразование выполнить уже в коде при обходе выборки или в СКД через вычисляемое поле.
Если преобразование нужно именно на уровне запроса (например, для соединения с числовым полем другой таблицы), используют приём с ПОДСТРОКА и ВЫБОР: посимвольно разбирают строку и собирают число. Это громоздкий и медленный способ, оправданный только когда обойтись без него нельзя. На практике почти всегда проще и быстрее выгрузить результат и преобразовать в коде.
В СКД задача решается проще: в вычисляемом поле доступны функции встроенного языка, поэтому в выражении можно вызвать ту же самодельную функцию из общего модуля, если она объявлена с директивой, доступной на сервере, где выполняется компоновка.
Сравнение способов преобразования
Подходит для гарантированно чистых данных из кода. Риск: исключение на любой посторонний символ.
Универсальный вариант для загрузок из файлов и обменов. Немного медленнее при большом числе ошибок.
Быстрее исключений при массовых ошибках, но требует больше кода и аккуратности.
Только через громоздкие конструкции ПОДСТРОКА/ВЫБОР. Использовать, когда нет доступа к коду обработки.
Особые случаи: экспоненциальная запись, даты и булевы значения
Строки вида «1,5E+06» или «2.3e-4» приходят из выгрузок научных систем и некоторых веб-API. Функция Число() корректно распознаёт экспоненциальную запись с точкой, но с запятой внутри такой записи снова потребуется замена. После преобразования проверьте, не потерялась ли точность: для очень больших чисел платформа ограничена разрядностью числового типа (до 38 знаков, из которых не более 10 — в дробной части при стандартных настройках).
Отдельная ситуация — когда под «строкой» на самом деле скрывается дата или логическое значение. Строку «01.03.2026» нельзя превратить в число напрямую осмысленным образом: для дат используется функция Дата() с форматом «ГГГГММДД». А значения «Истина»/«Ложь» при необходимости преобразуют в 1 и 0 через условный оператор, а не через Число().
Ещё один нюанс — пустая строка. Число("") вызывает исключение, поэтому перед преобразованием стоит проверить ПустаяСтрока(Строка) и сразу вернуть 0 или Неопределено, в зависимости от логики обработки.
Проверка результата и контроль качества данных
После преобразования стоит убедиться, что результат попал в ожидаемый диапазон. Для сумм — что число неотрицательное (или наоборот, допускает отрицательные значения для сторно), для количеств — что оно целое: сравните результат с Цел(Результат). Несовпадение означает, что в исходной строке была дробная часть, которую логика обработки, возможно, не предусматривает.
При массовой загрузке полезно вести счётчик успешных и неуспешных преобразований и выводить пользователю итог: сколько строк загружено, сколько пропущено с ошибкой формата. Это позволяет отличить ситуацию «файл загружен полностью» от «половина данных молча потеряна».
Как проверить результат
ТипЗнч(Результат) = Тип("Число")
Результат остался строкой или Неопределено
Число соответствует исходной строке по величине
0 там, где в строке было ненулевое значение — признак скрытой ошибки
Результат = Цел(Результат) для целочисленных данных
Появилась дробная часть, которой не должно быть
Частые вопросы
Что делать, если Число() выдаёт ошибку на строке, которая выглядит как число?
Почти всегда причина — невидимые символы: неразрывный пробел (код 160), табуляция или символы переноса. Удалите их через СтрЗаменить с Символ(160), Символы.Таб и Символы.ПС, затем примените СокрЛП. Проверить фактическое содержимое строки можно, выведя её длину — лишние символы сразу видны по расхождению с ожидаемой длиной.
Как преобразовать строку «1 234,56» из Excel в число?
Последовательно удалите пробелы (обычные и неразрывные), затем замените запятую на точку и вызовите Число(). Типовая цепочка: СтрЗаменить по Символ(160) и по " ", затем СтрЗаменить(Строка, ",", "."), затем Число(СокрЛП(Строка)) внутри Попытка/Исключение.
Можно ли преобразовать строку в число прямо в запросе 1С?
Штатной функции нет: ВЫРАЗИТЬ строку в число не преобразует. Теоретически возможна посимвольная сборка через ПОДСТРОКА и ВЫБОР, но на практике данные выбирают запросом как есть, а преобразуют в коде при обходе выборки или в вычисляемом поле СКД.
Что вернёт Число() для пустой строки?
Ничего — будет вызвано исключение «Преобразование значения к типу Число не может быть выполнено». Перед вызовом проверяйте строку функцией ПустаяСтрока() и возвращайте 0 или Неопределено в зависимости от логики обработки.
Как отличить, удалось преобразование или вернулся ноль по умолчанию?
Возвращайте из функции-обёртки Неопределено вместо 0 при неудаче — тогда Неопределено однозначно означает ошибку формата, а 0 — реальный ноль из данных. Альтернатива — второй параметр-признак успеха, который функция выставляет через переданную переменную.
Почему после преобразования большого числа теряются знаки?
Числовой тип платформы ограничен разрядностью (до 38 знаков, дробная часть — в пределах заданной точности). Если строка содержит число с большим количеством значащих цифр, лишние разряды отбрасываются. Для идентификаторов и длинных кодов числа использовать нельзя — храните их строками.
Что важно запомнить
Строку в число в 1С 8 преобразует функция Число(), но она требует чистого формата: только цифры, минус и точка. Перед вызовом удаляйте пробелы (включая неразрывный Символ(160)) и заменяйте запятую на точку, а сам вызов оборачивайте в Попытка/Исключение. В запросах прямого преобразования нет — преобразуйте данные в коде или вычисляемых полях СКД.