Преобразование строк в числа — одна из самых частых операций при работе с данными в 1С:Предприятие 8.3. Без этого не обойтись при импорте данных из Excel, обработке пользовательского ввода или парсинге внешних файлов. Казалось бы, что может быть проще? Но на практике разработчики сталкиваются с ошибками формата, региональными настройками и неявными преобразованиями, которые ломают логику расчётов.

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

Обратите внимание: методы преобразования зависят от конфигурации 1С и версии платформы. Например, в 1С:Бухгалтерия 3.0 и 1С:УТ 11 могут использоваться разные подходы к обработке числовых строк с учётом региональных настроек. Если вы работаете с унаследованными системами (версии ниже 8.3.10), некоторые функции могут вести себя иначе — это важно учитывать при миграции кода.

═══

1. Стандартная функция Число() — базовый метод

Функция Число() — самый распространённый способ преобразования строк в числа в . Она автоматически распознаёт формат числа, учитывая региональные настройки (разделитель дробной части, тысячные разряды).

Синтаксис прост:

Число = Число(Строка);

Примеры использования:

  • 📌 Число("1234,56") → вернёт 1234.56 (если разделитель — запятая)
  • 📌 Число("1 000.25") → вернёт 1000.25 (тысячные разряды игнорируются)
  • 📌 Число("5E+3") → вернёт 5000 (научная нотация поддерживается)

⚠️ Внимание: Если строка содержит нечисловые символы (например, валюту "$100" или текст "Цена: 200"), функция вызовет ошибку. Для таких случаев требуется предварительная очистка строки или использование Val().

📊 Какой метод преобразования строк в числа вы используете чаще?
Функция Число()
Функция Val()
Ручной парсинг
Другое

2. Функция Val() — для нестандартных форматов

Функция Val() работает иначе, чем Число(): она игнорирует все нечисловые символы в начале строки и преобразует только первую числовую последовательность. Это полезно для обработки "грязных" данных, где числа смешаны с текстом.

Синтаксис:

ЧисловоеЗначение = Val(Строка);

Ключевые особенности:

  • 🔹 Преобразует только первое число в строке (остальной текст игнорируется)
  • 🔹 Не зависит от региональных настроек (всегда использует точку как разделитель)
  • 🔹 Возвращает 0, если число не найдено (в отличие от Число(), которая вызывает ошибку)

Примеры:

Val("Цена: $120.50 руб.")  // вернёт 120.5

Val("Артикул 45-Товар") // вернёт 45

Val("Нет чисел здесь") // вернёт 0

⚠️ Внимание: Val() не распознаёт тысячные разделители (пробелы или запятые). Для строк вида "1 000 000" придётся предварительно удалять пробелы функцией СтрЗаменить().

💡

Если вам нужно извлечь все числа из строки, комбинируйте Val() с циклом и функцией СтрПолучитьСтроку(), разбивая текст по разделителям.

3. Преобразование с учётом региональных настроек

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

Чтобы избежать проблем, используйте один из методов:

Способ 1. Явное указание формата:

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

Способ 2. Использование параметра формата:

Число = Число(Строка, "ЧДЦ=.; ЧРД="); // ЧДЦ - разделитель дробной части, ЧРД - разделитель тысяч

Способ 3. Получение текущих региональных настроек:

ТекущийРазделитель = Символы.Таб?.Получить("DecimalSeparator");

Число = Число(СтрЗаменить(Строка, ".", ТекущийРазделитель));

📊 Сравнение методов:

МетодПоддерживает региональные настройкиОбрабатывает ошибкиПример
Число()ДаНет (ошибка)Число("1,23")
Val()Нет (только точка)Да (возвращает 0)Val("1.23")
Ручная заменаДа (при правильной замене)НетЧисло(СтрЗаменить("1.23", ".", ","))
Форматный параметрДаНетЧисло("1 234,56", "ЧДЦ=,; ЧРД= ")
Как проверить текущие региональные настройки в 1С?

Чтобы узнать текущие региональные параметры (разделители, формат даты), выполните в отладчике:

Сообщить(РегиональныеНастройки.ТекущаяДата());

Сообщить(Символы.Таб?.Получить("DecimalSeparator"));

Это поможет понять, почему функция Число() ведёт себя неожиданно.

4. Обработка строк с валютами и единицами измерения

Частая задача — преобразовать строки вида "$100", "500 руб.", "1000 USD" в числовые значения. Здесь Число() и Val() не помогут — нужна предварительная очистка строки.

Алгоритм действий:

  1. Удалите все нечисловые символы (кроме точки/запятой и знака "-")
  2. Замените разделители на текущие региональные
  3. Примените Число() или Val()

Пример кода для строки "$1 234.56":

Строка = "$1 234.56";

// 1. Удаляем все символы, кроме цифр, точки, запятой и минуса

ОчищеннаяСтрока = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка,

"$", ""),

" ", ""),

"руб.", ""),

"USD", "");

// 2. Преобразуем с учётом региональных настроек

Число = Число(ОчищеннаяСтрока);

⚠️ Внимание: Если в строке есть несколько чисел (например, "Цена: 100 руб., НДС 20%"), используйте регулярные выражения или разбивайте строку по разделителям. Для этого подходит функция РегВыражение() (доступна с версии 8.3.10).

Удалить символы валют ($, €, руб.)|Убрать пробелы-разделители тысяч|Заменить точку/запятую на региональный разделитель|Проверить наличие отрицательных чисел (знак "-")-->

5. Преобразование строк с датами в числовые форматы

Иногда требуется преобразовать строковое представление даты (например, "31.12.2023") в числовой формат для расчётов (например, количество дней). В для этого есть два подхода:

Способ 1. Преобразование в тип Дата, затем в число:

ДатаСтрока = "31.12.2023";

Дата = Дата(ДатаСтрока);

ЧисловоеЗначение = Дата.ДеньГода(); // или Дата.НомерНедели() и т.д.

Способ 2. Прямое извлечение компонентов даты:

ДатаСтрока = "31-12-2023";

День = Число(Лев(ДатаСтрока, 2));

Месяц = Число(Сред(ДатаСтрока, 4, 2));

Год = Число(Прав(ДатаСтрока, 4));

🔹 Типичные ошибки:

  • 🗓️ Путаница в форматах даты (DD.MM.YYYY vs MM/DD/YYYY)
  • 🗓️ Неучёт високосных годов при расчёте дней
  • 🗓️ Использование Число() напрямую для строки с датой (вернёт ошибку)

📌 Критично! При работе с датами в строковом формате всегда явно указывайте формат, чтобы избежать ошибок из-за региональных настроек:

Дата = Дата(ДатаСтрока, "ДФ=dd.MM.yyyy");

6. Оптимизация и обработка ошибок

При массовой обработке данных (например, при импорте из Excel) важно не только правильно преобразовать строки в числа, но и обработать возможные ошибки, чтобы не прерывать выполнение кода.

Приёмы для надёжного кода:

  • 🛡️ Используйте Попытка...Исключение для перехвата ошибок преобразования
  • 🛡️ Проверяйте результат на ТипЗнч() после преобразования
  • 🛡️ Для критических расчётов дублируйте проверку через Val() и Число()

Пример защищённого кода:

Функция БезопасноеПреобразованиеВЧисло(Значение)

Попытка

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

Если ТипЗнч(Результат) <> Тип("Число") Тогда

Результат = Val(Значение);

КонецЕсли;

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

Исключение

Возврат 0; // или Null, в зависимости от логики

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

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

⚠️ Внимание: При работе с большими объёмами данных (например, обработка 10 000 строк) избегайте вложенных циклов с преобразованиями. Лучше использовать Запрос с конструкцией ВЫРАЗИТЬ(... КАК ЧИСЛО) — это ускорит выполнение в 5-10 раз.

💡

Для массовой обработки данных всегда предпочитайте SQL-запросы с явным приведением типов вместо поэлементного преобразования в цикле.

7. Альтернативные методы: регулярные выражения и внешние компоненты

В сложных случаях (например, когда строка содержит несколько чисел или нестандартные разделители) стандартные функции могут не справиться. Тогда на помощь приходят:

1. Регулярные выражения (доступны с 8.3.10):

Текст = "Артикул: ABC-123, Цена: 1 200.50 руб., НДС: 20%";

РегВыр = Новый РегВыражение("(\d[\d\s]\.?\d)");

Результаты = РегВыр.НайтиВсе(Текст);

Для Каждого Найденное Из Результаты Цикл

Число = Число(СтрЗаменить(Найденное.Значение, " ", ""));

Сообщить(Число);

КонецЦикла;

2. Внешние компоненты (например, AddIn):

  • 🔧 Позволяют использовать функции других языков (C#, Python)
  • 🔧 Полезны для обработки больших файлов (например, JSON с числовыми данными)
  • 🔧 Требуют дополнительной настройки и лицензирования

⚠️ Внимание: Регулярные выражения в работают медленнее, чем встроенные функции. Используйте их только когда другие способы невозможны.

📌 Важно для интеграций! При обмене данными с внешними системами (например, через REST API) всегда уточняйте формат числовых полей в документации. Часто числа передаются в виде строк с фиксированным количеством знаков после запятой (например, "100.0000"), и их нужно нормализовать перед использованием в .

FAQ: Частые вопросы по преобразованию строк в числа

Почему функция Число() выдаёт ошибку для строки "1.23", хотя это явное число?

Скорее всего, в ваших региональных настройках в качестве разделителя дробной части установлена запятая (","), а не точка ("."). Используйте Число(СтрЗаменить("1.23", ".", ",")) или явно укажите формат: Число("1.23", "ЧДЦ=.").

Как преобразовать строку "1 000 000" в число, если пробелы используются как разделители тысяч?

Удалите пробелы перед преобразованием: Число(СтрЗаменить("1 000 000", " ", "")). Если пробелы — часть формата (например, в отчётах), используйте параметр формата: Число("1 000 000", "ЧРД= ").

Можно ли преобразовать строку с датой "01.01.2023" в число дней с начала года?

Да, сначала преобразуйте строку в тип Дата, затем используйте метод ДеньГода():

ДатаОбъект = Дата("01.01.2023");

ДнейСНачалаГода = ДатаОбъект.ДеньГода(); // вернёт 1

Как обработать строку, в которой число записано словами (например, "сто двадцать три")?

Стандартными средствами это невозможно. Вам потребуется либо внешняя компонента, либо сложный алгоритм на основе словаря чисел. Для бухгалтерских задач проще избегать таких форматов или использовать предварительную конвертацию в источниках данных.

Почему после преобразования строка "1E5" становится числом 100000, а не 1?

Это научная нотация (экспоненциальная запись), где "E" обозначает "умножить на 10 в степени". Функция Число() поддерживает такой формат: "1E5" = 1 × 105 = 100 000. Если вам нужно игнорировать "E", используйте Val() или предварительную очистку строки.