При импорте данных из таблиц Excel через COM-объект разработчики 1С часто сталкиваются с неожиданным форматированием чисел: например, число 67104848 превращается в строку вида 67 104 848. Попытки удалить такие пробелы стандартной функцией СокрЛП() не дают результата, а проверка в символьном редакторе показывает, что разделителем выступает символ с кодом 0xA0 (неразрывный пробел).
Рассмотрим подробно, почему возникает эта проблема и как правильно обработать значения при загрузке.
Проанализируем механику работы платформы 1С при обращении к ячейкам Excel через COM-объект:
Value COM-объекта ячейки Excel значение автоматически приводится к соответствующему типу данных 1С (число, строка, дата). Форматирование ячейки в самом Excel влияет на то, как COM-сервер передает значение. Если значение воспринимается как число, в 1С попадает числовой тип.СокрЛП() ожидает на вход строковый аргумент. Если передать в нее число, платформа 1С автоматически преобразует его в строку с учетом системных региональных настроек. В русской локализации для разделения триад (групп по три цифры) используется неразрывный пробел (Символы.НПП, символ с Unicode-кодом 160 / 0xA0).СокрЛП() обрезает пробелы и неразрывные пробелы только по краям строки (в начале и в конце), но оставляет их внутри текста между цифрами. По этой причине обычная зачистка краев не убирает разделители групп.Если ячейка Excel содержала числовое значение, логически правильнее всего не выполнять лишних преобразований со строковыми заменами, а сразу отформатировать число без разделителей группировки цифр.
Для этого применяется параметр ЧГ=0 (Число: Группировка = 0):
ЗначениеЯчейки = ОкноЕксел.Cells(Й, 2).Value;
РезультатСтрока = Формат(ЗначениеЯчейки, "ЧГ=0");
Если в ячейке может оказаться нулевое значение, которое нужно скрыть или оставить пустым, можно использовать расширенную строку формата:
РезультатСтрока = Формат(ОкноЕксел.Cells(Й, 2).Value, "ЧН=; ЧГ=");
Этот способ исключает появление любых символов-разделителей на этапе формирования строки.
Если данные из Excel приходят в виде строки или код универсален для различных текстовых и числовых полей, можно явно удалить системный символ неразрывного пробела Символы.НПП с помощью функции СтрЗаменить().
Рассмотрим пример кода:
ИсходноеЗначение = ОкноЕксел.Cells(Й, 2).Value;
ОчищеннаяСтрока = СтрЗаменить(СокрЛП(ИсходноеЗначение), Символы.НПП, "");
// Дополнительно можно удалить и обычные пробелы:
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, " ", "");
При работе с COM-объектом Excel рекомендуется обращаться к свойству Value2 вместо Value. Свойство Value при наличии форматов даты или валюты пытается выполнить внутреннее преобразование типов. Свойство Value2 всегда возвращает базовое значение (число или строку) без дополнительных преобразований форматов Excel.
ЗначениеЯчейки = ОкноЕксел.Cells(Й, 2).Value2;
ЧислоБезПробелов = Формат(ЗначениеЯчейки, "ЧГ=0");
В случаях, когда из сторонних файлов или буфера обмена в строку попадают разного рода спецсимволы (узкие неразрывные пробелы, символы табуляции и перевода строки), надежным решением является посимвольная фильтрация текста по белому списку:
ИсходныйТекст = Строка(ОкноЕксел.Cells(Й, 2).Value);
РазрешенныеСимволы = "0123456789.,-";
ОчищенныйТекст = "";
Для Индекс = 1 По СтрДлина(ИсходныйТекст) Цикл
Символ = Сред(ИсходныйТекст, Индекс, 1);
Если Найти(РазрешенныеСимволы, Символ) > 0 Тогда
ОчищенныйТекст = ОчищенныйТекст + Символ;
КонецЕсли;
КонецЦикла;
Чтобы избежать нюансов маршаллинга COM и проблем с региональными настройками Windows, загрузку файлов формата XLSX в 1С можно выполнять с помощью встроенного объекта ТабличныйДокумент. Метод Прочитать() работает кроссплатформенно (в том числе на серверах под управлением Linux) и позволяет получать чистые значения ячеек напрямую.