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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Выясним причину ошибки

Функция Число() в платформе 1С предъявляет строгие требования к входной строке. Если в строке содержится хотя бы один лишний символ, функция мгновенно вызывает исключение. Самые распространенные причины ошибки:

  1. Наличие разделителей групп разрядов (пробелов): В строке могут присутствовать как обычные пробелы, так и неразрывные пробелы (Символы.НПП), часто используемые при форматировании сумм (например, "3 500.50").
  2. Неверный разделитель дробной части: В зависимости от региональных настроек системы платформа может ожидать в качестве разделителя точку или запятую. Если передана точка, а система ожидает запятую, приведение не выполнится.
  3. Служебные символы: Переводы строк (Символы.ПС), табуляция (Символы.Таб) или возврат каретки (Символы.ВК), попавшие из сторонних файлов (CSV, XML, JSON).
  4. Пустые значения: Передача пустой строки "" или значений типов Неопределено и NULL.

Шаг 1. Очистка строки от пробелов и спецсимволов

Рассмотрим, как очистить исходную строку перед вызовом преобразования. В первую очередь необходимо удалить все обычные и неразрывные пробелы с помощью функции СтрЗаменить(), а также обрезать крайние пробелы с помощью СокрЛП().

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


// Исходная строка с обычными или неразрывными пробелами
СтрокаЧисла = "3 500.50";

// Удаляем обычные пробелы
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");

// Удаляем неразрывные пробелы (НПП)
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символы.НПП, "");

// Удаляем возможные пробелы по краям
СтрокаЧисла = СокрЛП(СтрокаЧисла);

// Выполняем преобразование
РезультатЧисло = Число(СтрокаЧисла);

Шаг 2. Нормализация разделителя дробной части

Если в вашей системе разделителем дробной части является точка, а в строке используется запятая (или наоборот), проанализируем ситуацию и выполним замену символа:


// Заменяем запятую на точку для правильного распознавания дробной части
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", ".");
РезультатЧисло = Число(СтрокаЧисла);

Шаг 3. Безопасное приведение через ОписаниеТипов

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

Разберем пример кода с использованием ОписаниеТипов:


// Очищаем строку от нечисловых разделителей
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, Символы.НПП, "");

// Создаем описание типа Число
ОписаниеЧисла = Новый ОписаниеТипов("Число");

// Приводим значение без вызова исключения
Результат = ОписаниеЧисла.ПривестиЗначение(СтрокаЧисла);

Шаг 4. Безопасное преобразование с помощью Попытка ... Исключение

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


СтрокаЧисла = СокрЛП(СтрЗаменить(ИсходнаяСтрока, " ", ""));

Попытка
    ЗначениеЧисла = Число(СтрокаЧисла);
Исключение
    ЗначениеЧисла = 0; // Значение по умолчанию при ошибке
КонецПопытки;

Таким образом, перед преобразованием строки в число необходимо всегда очищать входные данные от обычных и неразрывных пробелов с помощью СтрЗаменить(), контролировать разделитель дробной части и при необходимости применять безопасные методы приведения типов.

← На главную