Разработка и Конфигурация · 10 мин
Как убрать неразрывный пробел в 1С
Как найти и убрать неразрывный пробел в 1С: замена через СтрЗаменить, Символ(160), обработка строк в коде и в Excel. Примеры и типичные ошибки.
Неразрывный пробел (символ с кодом 160) — частая причина «фантомных» ошибок в 1С: число выглядит как число, но не преобразуется, строка не находится при поиске, сравнение двух визуально одинаковых значений возвращает «Ложь». Внешне неразрывный пробел неотличим от обычного, поэтому проблему часто ищут совсем не там.
Чаще всего неразрывные пробелы попадают в данные при копировании из веб-страниц, Excel, PDF-документов и при выгрузке из сторонних систем, где они используются как разделители разрядов в числах (например, «1 250 000»). Также типовые механизмы форматирования 1С сами могут выводить числа с неразрывными пробелами в представлениях.
Ниже — рабочие способы найти и удалить неразрывный пробел: программно в коде на встроенном языке, при загрузке данных, в Excel перед импортом и в запросах. Выбор способа зависит от того, где возникла проблема: в одном поле, в массовой загрузке или в уже записанных данных базы.
Как распознать неразрывный пробел в данных
Главный признак — «невозможное» поведение: Число() возвращает 0 для видимо корректного числа, Найти() не находит подстроку, которая на экране точно есть, сравнение двух одинаковых с виду строк даёт «Ложь». Если логика кода верна, а результат неверен — проверяйте строки на скрытые символы.
Быстрая проверка в коде — сравнить длину строки с количеством видимых символов или вывести коды символов. Обычный пробел имеет код 32, неразрывный — 160. Увидеть разницу можно так:
Строка = "1 250"; // внутри может быть неразрывный пробел
Для Позиция = 1 По СтрДлина(Строка) Цикл
Сообщить(КодСимвола(Строка, Позиция));
КонецЦикла;
Если среди кодов встречается 160 — неразрывный пробел подтверждён. В отладчике можно также скопировать значение переменной и вставить его в текстовый редактор с отображением скрытых символов (например, Notepad++ с включённым режимом «Отображать все символы»): обычный пробел показывается точкой, неразрывный — иначе или вовсе не помечается, что тоже является признаком.
Проверить коды символов на наличие 160
Сравнить СтрДлина обеих строк
Скопировать значение в редактор с показом скрытых символов
Удаление неразрывного пробела функцией СтрЗаменить
Основной инструмент — функция СтрЗаменить в сочетании с Символ(160). Важно понимать разницу между двумя вариантами: замена на обычный пробел сохраняет читаемость текста, а замена на пустую строку полностью удаляет символ — это нужно при преобразовании чисел.
// Замена неразрывного пробела на обычный
ЧистаяСтрока = СтрЗаменить(ИсходнаяСтрока, Символ(160), " ");
// Полное удаление (для чисел)
СтрокаЧисла = СтрЗаменить(ИсходнаяСтрока, Символ(160), "");
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", ""); // и обычные пробелы-разделители
Результат = Число(СтрокаЧисла);
Обратите внимание: замена на пустую строку для текстовых наименований может склеить слова («Иванов Иван» → «ИвановИван»). Поэтому для текстов используйте замену на обычный пробел, а для чисел — удаление всех пробельных символов.
Полезно заодно чистить и другие невидимые символы: табуляцию (Символ(9)), перевод строки (Символы.ПС), возврат каретки (Символы.ВК) и неразрывный дефис, если данные приходят из веба. Функция СокрЛП удаляет пробелы только по краям строки и не трогает символы в середине — это частая причина непонимания, почему «СокрЛП не помогает».
Чистка чисел, загруженных из Excel и веб-страниц
При загрузке прайсов и отчётов из Excel числа часто приходят как текст с неразрывными пробелами-разделителями разрядов. Если записать такое значение в реквизит числового типа напрямую, 1С либо откажется преобразовывать, либо запишет ноль. Правильный подход — чистить строку до преобразования.
Универсальная функция для безопасного преобразования строки в число:
Функция СтрокаВЧисло(Знач Строка)
Строка = СтрЗаменить(Строка, Символ(160), "");
Строка = СтрЗаменить(Строка, " ", "");
Строка = СтрЗаменить(Строка, ",", ".");
Попытка
Возврат Число(Строка);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Если есть возможность подготовить файл заранее, проще почистить данные в самом Excel до загрузки: Ctrl+H, в поле «Найти» вставить неразрывный пробел (скопировать его из ячейки или ввести с зажатым Alt код 0160 на цифровой клавиатуре), поле «Заменить на» оставить пустым, нажать «Заменить все». После этого файл загружается без сюрпризов.
- 1Открыть файл и проверить, есть ли разделители разрядов в числовых колонках
- 2Выполнить замену неразрывного пробела на пусто через Ctrl+H (Alt+0160 в поле поиска)
- 3Сохранить файл и загрузить в 1С либо чистить строки программно в обработке загрузки
- 4Проверить несколько загруженных значений на корректность сумм
Массовая чистка уже записанных данных
Если неразрывные пробелы уже записаны в базу — например, в наименованиях номенклатуры после обмена с сайтом — потребуется обработка, которая перебирает элементы и исправляет значения. Делать это нужно в копии базы или после резервного копирования.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если СтрНайти(Выборка.Наименование, Символ(160)) > 0 Тогда
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Наименование = СтрЗаменить(Объект.Наименование, Символ(160), " ");
Объект.Записать();
КонецЕсли;
КонецЦикла;
Условие с СтрНайти перед записью важно: оно отсекает элементы без проблемы и не создаёт лишних записей в базе. Для больших справочников обработку лучше запускать порциями и в монопольном или малозагруженном режиме, чтобы не блокировать работу пользователей.
Неразрывные пробелы в запросах и сравнениях
В запросах 1С нет прямого аналога СтрЗаменить для произвольных символов, поэтому искать записи с неразрывным пробелом через ПОДОБНО неудобно. Практичный подход — выбрать данные запросом и фильтровать их уже в коде через СтрНайти, как показано в примере выше.
Если проблема в сравнении строк при поиске элемента справочника (например, «НайтиПоНаименованию» не находит существующий элемент), нормализуйте обе строки перед сравнением: уберите неразрывные пробелы, приведите к одному регистру и примените СокрЛП. Это стандартный приём для обменов, где строки приходят из разных систем с разным оформлением.
При обменах с сайтами и внешними системами удобно завести одну общую функцию нормализации строк (убрать Символ(160), лишние пробелы, привести регистр) и вызывать её во всех местах сопоставления данных. Это снимает целый класс ошибок «дублируются элементы» и «не находится контрагент».
Типичные ошибки и ограничения
Первая ошибка — попытка удалить неразрывный пробел функцией СокрЛП. Она работает только с краями строки, и символ в середине остаётся на месте. Вторая — замена только обычного пробела: код 32 и код 160 — разные символы, и замена одного не затрагивает другой.
Третья ошибка — удаление пробела вместо замены в текстовых полях, из-за чего слова склеиваются. Четвёртая — забыть, что в представлениях чисел, сформированных функцией Формат(), неразрывный пробел может появляться как разделитель групп разрядов: если такое представление потом парсится обратно в число, его нужно чистить.
Как проверить результат
После чистки убедитесь, что символ действительно удалён: повторно выведите коды символов строки или проверьте условие СтрНайти(Строка, Символ(160)) — оно должно вернуть 0. Для чисел проверьте, что Число() возвращает ожидаемое значение, а суммы в документах сходятся с источником.
Для массовой обработки полезно до записи вывести в сообщения или в табличный документ список элементов, которые будут изменены, и сверить его глазами на нескольких примерах. Это занимает пару минут, но защищает от массовой порчи данных.
Как проверить результат
Возвращает 0
Возвращает позицию символа — пробел остался
Возвращает корректное значение
Возвращает 0 или ошибку — остались лишние символы
Строки равны после нормализации
Равенства нет — проверить регистр и другие скрытые символы
Что важно запомнить
Неразрывный пробел — это Символ(160), внешне неотличимый от обычного. Убирается через СтрЗаменить: на обычный пробел в текстах и на пустую строку в числах. СокрЛП его в середине строки не удаляет. Массовую чистку базы делайте только после резервной копии и с предварительным отбором через СтрНайти.
Частые вопросы
Чем неразрывный пробел отличается от обычного?
Обычный пробел имеет код 32, неразрывный — код 160. Визуально они одинаковы, но для программы это разные символы: сравнение строк, поиск и преобразование в число учитывают разницу. Неразрывный пробел применяется в типографике и веб-вёрстке, чтобы не допустить переноса строки между словами или разрядами числа.
Почему СокрЛП не удаляет неразрывный пробел?
СокрЛП удаляет незначащие символы только в начале и конце строки. Если неразрывный пробел стоит в середине — например, между разрядами числа или словами — функция его не затрагивает. Для середины строки нужна СтрЗаменить с Символ(160).
Как ввести неразрывный пробел в поле поиска-замены в Excel?
Скопируйте символ из проблемной ячейки и вставьте в поле «Найти», либо введите его кодом: зажмите Alt и наберите 0160 на цифровом блоке клавиатуры. Поле «Заменить на» оставьте пустым для удаления или введите обычный пробел для замены.
Можно ли найти неразрывный пробел запросом 1С?
Напрямую через ПОДОБНО это сделать затруднительно, так как в языке запросов нет удобной функции замены произвольных символов. Практичнее выбрать данные запросом, а проверку наличия символа выполнить в коде через СтрНайти(Строка, Символ(160)).
Откуда в наименованиях номенклатуры берутся неразрывные пробелы?
Чаще всего они приходят при обмене с сайтами и маркетплейсами, при загрузке из Excel, а также при копировании данных из браузера или PDF вручную. Веб-страницы активно используют неразрывные пробелы для форматирования, и они переносятся в базу вместе с текстом.
Опасно ли менять данные обработкой в рабочей базе?
Да, если действовать без подготовки. Запись объектов в цикле изменяет данные необратимо, поэтому нужны резервная копия, отбор только проблемных элементов через СтрНайти и проверка списка изменений до записи. При больших объёмах обработку лучше запускать в период минимальной нагрузки.