Как убрать пробелы и неразрывные пробелы при чтении данных из Excel в 1С?

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

При импорте данных из таблиц Excel через COM-объект разработчики 1С часто сталкиваются с неожиданным форматированием чисел: например, число 67104848 превращается в строку вида 67 104 848. Попытки удалить такие пробелы стандартной функцией СокрЛП() не дают результата, а проверка в символьном редакторе показывает, что разделителем выступает символ с кодом 0xA0 (неразрывный пробел).

Рассмотрим подробно, почему возникает эта проблема и как правильно обработать значения при загрузке.

Выясним причину возникновения неразрывных пробелов

Проанализируем механику работы платформы 1С при обращении к ячейкам Excel через COM-объект:

  1. Маршаллинг типов COM: При обращении к свойству Value COM-объекта ячейки Excel значение автоматически приводится к соответствующему типу данных 1С (число, строка, дата). Форматирование ячейки в самом Excel влияет на то, как COM-сервер передает значение. Если значение воспринимается как число, в 1С попадает числовой тип.
  2. Неявное приведение числа к строке: Функция СокрЛП() ожидает на вход строковый аргумент. Если передать в нее число, платформа 1С автоматически преобразует его в строку с учетом системных региональных настроек. В русской локализации для разделения триад (групп по три цифры) используется неразрывный пробел (Символы.НПП, символ с Unicode-кодом 160 / 0xA0).
  3. Ограничение функции СокрЛП: Функция СокрЛП() обрезает пробелы и неразрывные пробелы только по краям строки (в начале и в конце), но оставляет их внутри текста между цифрами. По этой причине обычная зачистка краев не убирает разделители групп.

Способ 1. Использование функции Формат() (Рекомендуемый подход)

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

Для этого применяется параметр ЧГ=0 (Число: Группировка = 0):


ЗначениеЯчейки = ОкноЕксел.Cells(Й, 2).Value;
РезультатСтрока = Формат(ЗначениеЯчейки, "ЧГ=0");

Если в ячейке может оказаться нулевое значение, которое нужно скрыть или оставить пустым, можно использовать расширенную строку формата:

РезультатСтрока = Формат(ОкноЕксел.Cells(Й, 2).Value, "ЧН=; ЧГ=");

Этот способ исключает появление любых символов-разделителей на этапе формирования строки.

Способ 2. Удаление неразрывного пробела через СтрЗаменить()

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

Рассмотрим пример кода:


ИсходноеЗначение = ОкноЕксел.Cells(Й, 2).Value;
ОчищеннаяСтрока = СтрЗаменить(СокрЛП(ИсходноеЗначение), Символы.НПП, "");
// Дополнительно можно удалить и обычные пробелы:
ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, " ", "");

Способ 3. Оптимизация обращения к ячейкам Excel через Value2

При работе с COM-объектом Excel рекомендуется обращаться к свойству Value2 вместо Value. Свойство Value при наличии форматов даты или валюты пытается выполнить внутреннее преобразование типов. Свойство Value2 всегда возвращает базовое значение (число или строку) без дополнительных преобразований форматов Excel.


ЗначениеЯчейки = ОкноЕксел.Cells(Й, 2).Value2;
ЧислоБезПробелов = Формат(ЗначениеЯчейки, "ЧГ=0");

Способ 4. Фильтрация строки по разрешенным символам

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


ИсходныйТекст = Строка(ОкноЕксел.Cells(Й, 2).Value);
РазрешенныеСимволы = "0123456789.,-";
ОчищенныйТекст = "";

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

Альтернатива: Чтение Excel без использования COM

Чтобы избежать нюансов маршаллинга COM и проблем с региональными настройками Windows, загрузку файлов формата XLSX в 1С можно выполнять с помощью встроенного объекта ТабличныйДокумент. Метод Прочитать() работает кроссплатформенно (в том числе на серверах под управлением Linux) и позволяет получать чистые значения ячеек напрямую.

← На главную