Sky1C

Разделы каталога

Товар дняХиты продажПереносы данных 1СПродукты и лицензии 1СПрочий Софт

Информация

О насИнтересноеОтгрузка ПОПартнёрамКонтакты

Строка в число 1С

Содержание

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

Способ 1. Функция Число() — просто, но с риском исключения

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

РезультатЧисло = Число(ИсходнаяСтрока);
		

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

Способ 2. СтрокаВЧисло() из БСП — безопасная конвертация

Если конфигурация разработана на основе Библиотеки стандартных подсистем (БСП), для конвертации можно использовать готовый метод общего модуля СтроковыеФункцииКлиентСервер:

Результат = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(МояСтрока);
		

Главное удобство этого метода — он не выбрасывает исключение. Если входная строка содержит посторонние символы и не может быть корректно распознана как число, метод просто возвращает значение Неопределено, а не прерывает выполнение кода. Дальше вы сами решаете, что делать в этом случае — подставить значение по умолчанию, вывести сообщение пользователю или пропустить строку при обработке массива данных. Это делает способ значительно удобнее и безопаснее первого, но он доступен только в конфигурациях, где подключена БСП.

Способ 3. Очистка строки регулярным выражением

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

На современных версиях платформы 1С для такой очистки удобно использовать метод СтрЗаменитьПоРегулярномуВыражению:

ИсходнаяСтрока = "<br> -10.15 руб.";
РегулярноеВыражение = "[^\d\.,-" + Символы.Таб + "]";
ОчищеннаяСтрока = СтрЗаменитьПоРегулярномуВыражению(ИсходнаяСтрока, РегулярноеВыражение, "");

ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, ".", ",");
РезультатЧисло = Число(ОчищеннаяСтрока); // строка "<br> -10.15 руб." будет сконвертирована в "-10.15"
Сообщить(РезультатЧисло);
		

Регулярное выражение [^\d\.,-\t] означает «любой символ, который не является цифрой, точкой, запятой, минусом или табуляцией» — все такие символы вырезаются из строки. После этого точка заменяется на запятую (так как в русской локализации 1С дробным разделителем по умолчанию считается запятая), и только затем очищенная строка передаётся в Число(). На этом этапе исключение уже практически исключено, потому что в строке остались только символы, из которых число собрать можно.

Способ 4. Своя функция без исключений на переборе символов

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

Функция СтрокаВЧислоБезИсключения(ИсходнаяСтрока) Экспорт
	ДопустимыеСимволы = "0123456789-.," + Символы.Таб;
	Результат = "";

	Для Ном = 1 По СтрДлина(ИсходнаяСтрока) Цикл
		Символ = Сред(ИсходнаяСтрока, Ном, 1);
		Если СтрНайти(ДопустимыеСимволы, Символ) > 0 Тогда
			Результат = Результат + Символ;
		КонецЕсли;
	КонецЦикла;

	Результат = СтрЗаменить(Результат, ".", ",");
	Возврат Число(Результат);
КонецФункции
		

Здесь функция идёт по строке символ за символом, для каждого символа проверяет, входит ли он в перечень допустимых («0123456789-.,» плюс символ табуляции), и если да — добавляет его в результирующую строку, а если нет — просто пропускает. В отличие от способа 1, здесь нет ни одного вызова, который мог бы выбросить исключение: даже если на входе пустая строка или строка без единой цифры, функция вернёт корректно обработанный (пусть и, возможно, пустой) результат. Такой подход работает быстро даже на длинных строках, поскольку не использует более тяжеловесные механизмы вроде регулярных выражений, и полностью предсказуем в поведении.

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

СпособВызывает исключениеТребует БСПКогда использовать
Число()Да, при любом «грязном» символеНетСтрока гарантированно уже содержит корректное число
СтрокаВЧисло() (БСП)Нет, возвращает НеопределеноДаКонфигурация на БСП, нужна безопасная разовая конвертация
Регулярное выражениеНет, после очистки строкиНетСтрока содержит посторонний текст вокруг числа (единицы измерения, теги и т.п.)
Своя функция на переборе символовНетНетНужна независимая от БСП, быстрая и предсказуемая конвертация, в том числе массовая

Когда конвертации строк недостаточно

Корректная конвертация строки в число часто становится актуальной задачей именно в проектах переноса данных 1С или интеграции 1С с маркетплейсами — когда числовые значения приходят из внешнего источника (файла выгрузки, API маркетплейса, стороннего сайта) не в том формате, в котором их ожидает платформа 1С. В таких задачах недостаточно один раз написать функцию конвертации — нужно продумать всю цепочку обработки данных: какие форматы чисел встречаются у источника, как обрабатывать ошибки на уровне всего процесса обмена, что делать с данными, которые в принципе не удалось корректно распознать. Если у вас сейчас как раз такая задача — перенос данных 1С или интеграция с маркетплейсом, — команда Sky1c специализируется именно на подобных проектах и поможет спроектировать надёжный процесс обмена данными, а не только отдельную функцию конвертации.

Заключение

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

Читайте также