При разработке на платформе 1С мы часто сталкиваемся с тем, что строковые представления чисел, полученные из табличных документов, отчетов или внешних файлов, содержат специфический символ — неразрывный пробел. Этот символ автоматически подставляется системой в качестве разделителя групп разрядов в зависимости от региональных настроек. Обычная функция СтрЗаменить с параметром «пробел» часто не справляется с задачей, так как этот символ не является обычным пробелом (код ASCII 32).
Рассмотрим, как правильно решить эту проблему и корректно преобразовать такую строку в число.
Когда мы получаем данные через свойство Текст ячейки табличного документа, мы работаем с визуальным отображением числа, а не с самим значением. Система форматирует это число для удобства пользователя, вставляя неразрывный пробел (код 160). Если попытаться заменить этот символ обычным пробелом, 1С его «не увидит», так как коды символов различаются. Именно поэтому код типа СтрЗаменить(Строка, " ", "") не приводит к нужному результату.
Самый простой и эффективный способ «найти и обезвредить» этот символ — обратиться к системному перечислению Символы. Неразрывный пробел в 1С представлен константой Символы.НПП.
Давайте разберем, как применить это на практике:
// Получаем строку из ячейки
ИсходнаяСтрока = ТвояЯчейка.Текст;
// Заменяем неразрывный пробел на пустую строку
ОчищеннаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");
// Теперь строку можно смело преобразовывать в число
ЧисловоеЗначение = Число(ОчищеннаяСтрока);
Этот метод надежен, так как он явно указывает платформе, какой именно символ мы хотим удалить, независимо от текущих региональных настроек операционной системы.
Если мы работаем с объектом ТабличныйДокумент или элементами управления формы, важно помнить, что большинство из них хранят данные в двух видах: визуальном (Текст) и исходном (Значение). Вместо того чтобы «чистить» строку, мы можем просто извлечь число напрямую.
Рассмотрим пример:
// Вместо обращения к свойству Текст, обращаемся к Значение
// Это позволит получить числовой тип данных сразу
ЗначениеЧислом = ТекущаяОбласть.Значение;
// Если тип ячейки изначально задан как Число,
// этот метод вернет готовое число без лишних манипуляций
Важное замечание: Свойство Значение доступно не всегда. Если объект представляет собой «сырую» область ячейки, которая не была типизирована как число при заполнении, свойство Значение может быть недоступно для чтения. В таких случаях метод с Символы.НПП остается самым универсальным.
Современные версии платформы 1С достаточно умны. Часто функция Число() способна самостоятельно обработать строку с неразрывными пробелами, если они являются единственным «лишним» элементом в строке.
Разберем пример:
СтрокаСПробелами = "1 006"; // Здесь неразрывный пробел
ЧисловойРезультат = Число(СтрокаСПробелами);
В большинстве случаев платформа корректно отработает данную конструкцию. Однако, если в строке присутствуют иные символы (например, префиксы валют или пробелы в разных позициях), мы рекомендуем предварительно комбинировать СтрЗаменить(Строка, Символы.НПП, "") с последующим приведением к типу.
Чтобы избежать ошибок при работе с числами в строковом виде, следуйте этим рекомендациям:
Значение, если это возможно.Символы.НПП для очистки от неразрывных пробелов.Число() приводите строку к «чистому» виду, удаляя все лишние символы.Применяя эти методы, вы сделаете ваш код более устойчивым к изменениям настроек в информационной базе и избавите себя от проблем с некорректным преобразованием типов данных.