К статье
Практический материал

Разработка и Конфигурация · 12 мин

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

Как найти и удалить неразрывный пробел в 1С: функции СтрЗаменить, Символ(160), Символы.НПП, обработка чисел и строк, типичные ошибки и примеры кода.

Неразрывный пробел (символ с кодом 160, NBSP) — одна из самых частых причин «невидимых» ошибок в 1С. Строка выглядит нормально, но сравнение не срабатывает, число не преобразуется, а поиск по справочнику ничего не находит. Причина проста: визуально неразрывный пробел неотличим от обычного (код 32), но для платформы это два разных символа.

Чаще всего символ 160 попадает в данные при копировании из Excel, Word, веб-страниц и PDF, а также при загрузке курсов валют, выписок и прайсов. Он встречается внутри чисел как разделитель разрядов («1 250 000»), в наименованиях контрагентов, в номерах документов и в адресах.

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

Как распознать неразрывный пробел в данных

Главный признак — «фантомные» ошибки: функция Число() возвращает 0 или вызывает исключение, СокрЛП не помогает, две визуально одинаковые строки не равны. Например, наименование контрагента введено вручную, а затем то же наименование загружено из файла — и в справочнике появляется дубль, потому что строки различаются одним невидимым символом.

Надёжный способ проверки — вычислить код символа. Встроенная функция КодСимвола(Строка, Позиция) возвращает числовой код: для обычного пробела это 32, для неразрывного — 160. Если в строке есть символ с кодом 160, значит, проблема подтверждена.

Для быстрой диагностики удобно пройтись по строке в цикле и вывести коды всех символов, которые не являются буквами или цифрами. Так вы увидите не только 160, но и другие «невидимки»: табуляцию (9), перенос строки (10), возврат каретки (13).

Число() возвращает 0В строке есть лишние символы

Проверьте наличие символа 160 между разрядами числа

Строки визуально равны, но сравнение ложноРазные коды пробелов

Сравните КодСимвола по позициям пробелов

Дубли в справочнике после загрузкиНаименования с NBSP

Нормализуйте строки перед поиском и записью

СокрЛП не очищает края строкиНестандартный символ по краям

Проверьте коды первого и последнего символа

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

Основной инструмент — функция СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены). Чтобы убрать все неразрывные пробелы, передайте в качестве подстроки поиска символ с кодом 160. Получить его можно двумя способами: Символ(160) или предопределённое свойство Символы.НПП.

Пример кода:

ИсходнаяСтрока = "ООО «Ромашка»";

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

// или так:

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

Оба варианта эквивалентны. Символы.НПП читается нагляднее и не требует запоминания кода, поэтому в прикладном коде предпочтителен именно он. Обратите внимание: заменять нужно именно на пустую строку, а не на обычный пробел, если символ стоит внутри числа или в слитном идентификаторе.

Если неразрывный пробел нужно не удалить, а заменить обычным (например, в наименованиях, где он стоит между словами), используйте замену на Символ(32) или строковый литерал с пробелом. Так текст останется читаемым, а сравнение строк начнёт работать корректно.

bsl
СтрокаБезНПП = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");

Комплексная очистка строки: пробелы, табуляции, переносы

На практике неразрывный пробел редко приходит один. Данные из Excel или веб-форм содержат смесь из NBSP, обычных пробелов, табуляций и переносов строк. Поэтому полезно написать универсальную функцию нормализации и использовать её во всех местах, где строки сравниваются или преобразуются.

Пример такой функции:

Функция НормализоватьСтроку(Знач Стр)

Стр = СтрЗаменить(Стр, Символы.НПП, " ");

Стр = СтрЗаменить(Стр, Символы.Таб, " ");

Стр = СтрЗаменить(Стр, Символы.ПС, " ");

Стр = СтрЗаменить(Стр, Символы.ВК, " ");

Пока СтрНайти(Стр, " ") > 0 Цикл

Стр = СтрЗаменить(Стр, " ", " ");

КонецЦикла;

Возврат СокрЛП(Стр);

КонецФункции

Функция сначала приводит все виды пробельных символов к обычному пробелу, затем схлопывает повторные пробелы и обрезает края. После такой обработки строки можно безопасно сравнивать, искать по ним в справочниках и выводить в отчёты.

Важно понимать ограничение СокрЛП: эта функция удаляет с краёв строки только стандартные пробельные символы и в типовых сценариях не всегда убирает символ 160. Поэтому рассчитывать только на СокрЛП при работе с загруженными данными нельзя — сначала выполните явную замену NBSP.

Преобразование строки с разделителями разрядов в число

Отдельный частый случай — числа, скопированные из Excel или с сайта: «1 250 000,50». Разряды в них разделены именно неразрывным пробелом, и функция Число() такую строку не примет: результатом будет 0 или исключение «Преобразование значения к типу Число не может быть выполнено».

Порядок безопасного преобразования: удалить из строки символ 160 и обычный пробел, при необходимости заменить запятую на точку (или наоборот, в зависимости от региональных настроек), затем вызвать Число() внутри попытки. Пример:

Функция СтрокаВЧисло(Знач Стр)

Стр = СтрЗаменить(Стр, Символы.НПП, "");

Стр = СтрЗаменить(Стр, " ", "");

Стр = СтрЗаменить(Стр, ",", ".");

Попытка

Возврат Число(Стр);

Исключение

Возврат 0;

КонецПопытки;

КонецФункции

Оборачивание в Попытка/Исключение обязательно для загрузки файлов: одна «битая» строка не должна обрывать весь процесс. Вместо молчаливого возврата нуля имеет смысл записывать проблемное значение в журнал регистрации или в протокол загрузки — иначе ошибки данных останутся незамеченными.

Порядок действий при загрузке чисел из файла
  1. 1
    Прочитайте значение ячейки как строку
  2. 2
    Удалите символы 160 и обычные пробелы через СтрЗаменить
  3. 3
    Приведите десятичный разделитель к нужному виду
  4. 4
    Преобразуйте через Число() внутри Попытка/Исключение
  5. 5
    Запишите ошибочные значения в протокол загрузки

Массовая чистка данных в справочниках и документах

Если неразрывные пробелы уже накопились в базе — в наименованиях контрагентов, номенклатуры, в адресах — ручное исправление не подходит. Нужна сервисная обработка, которая обходит записи, чистит строковые поля и записывает изменённые объекты.

Типовая схема обработки: запросом выбрать объекты, где поле содержит символ 160; для каждого объекта получить объектную ссылку через ПолучитьОбъект(), применить СтрЗаменить к нужным реквизитам и записать. Отбор именно через запрос важен: он позволяет не трогать записи без проблемы и сокращает время работы.

Пример отбора в запросе:

ВЫБРАТЬ Контрагенты.Ссылка

ИЗ Справочник.Контрагенты КАК Контрагенты

ГДЕ Контрагенты.Наименование ПОДОБНО "%" + Символ(160) + "%"

Конструкция ПОДОБНО "%" + Символ(160) + "%" находит записи, где в строке встречается NBSP. В обычном конструкторе запроса такую строку удобнее передавать параметром, заранее собрав её в коде.

Дополнительные меры безопасности: запускайте обработку в монопольном режиме или вне рабочих часов, обрабатывайте данные порциями с транзакциями, а для документов используйте Записать(РежимЗаписиДокумента.Запись), чтобы случайно не перепровести документы и не изменить движения.

Ручное исправление без программирования

Если записей немного, неразрывный пробел можно убрать прямо в интерфейсе. Откройте форму элемента, встаньте в поле, выделите пробел между словами и введите обычный пробел с клавиатуры. Проблема в том, что визуально отличить символы нельзя, поэтому надёжнее выделить всё значение поля, удалить его и ввести заново вручную.

В табличных документах и при редактировании макетов работает стандартный поиск и замена (Ctrl+F / Ctrl+H), но вставить символ 160 в строку поиска с клавиатуры сложно. Практический приём: скопировать «плохой» фрагмент прямо из ячейки с ошибкой и вставить его в поле поиска — тогда в строку поиска попадёт именно неразрывный пробел.

Для разовой загрузки из Excel проще почистить данные до попадания в 1С: в Excel используйте «Найти и заменить», где в поле поиска вводится символ с кодом 160 (в Excel его можно вставить через формулу СИМВОЛ(160) и скопировать результат). После этого файл загружается без сюрпризов.

Сравнение способов удаления NBSP

СтрЗаменить в коде

Универсально и точно; требует доступа к конфигуратору или внешней обработке

Сервисная обработка по базе

Подходит для массовой чистки; рискованно без копии и требует аккуратной записи объектов

Ручное исправление в форме

Быстро для единичных записей; не масштабируется и не гарантирует полноту

Чистка в Excel до загрузки

Предотвращает проблему; не решает уже накопленные в базе данные

Типичные ошибки и проверка результата

Самая частая ошибка — заменять неразрывный пробел на пустую строку там, где он стоит между словами: «ООО «Ромашка»» превращается в «ООО«Ромашка»». Правило простое: внутри чисел и кодов — удалять, внутри текстов — заменять на обычный пробел.

Вторая ошибка — чистить только видимое поле. Например, в справочнике контрагентов символ 160 может сидеть одновременно в наименовании, полном наименовании и наименовании для печати. Если почистить одно поле, дубли и ошибки сравнения останутся.

Третья ошибка — забыть про регистр сведений, хранящий «сырые» загруженные значения, или про дополнительные реквизиты и свойства. Проверяйте все строковые поля, которые участвуют в поиске, сравнении и обмене данными.

Типичные ошибки
01
Замена NBSP на пустую строку в текстах — слова склеиваются
02
Использование только СокрЛП — символ 160 по краям строки остаётся
03
Число() без Попытка/Исключение — загрузка падает на первой битой строке
04
Чистка одного поля из нескольких — дубли и ошибки сравнения сохраняются
05
Массовая запись без резервной копии — изменения нельзя откатить

После чистки проверьте результат тем же запросом с условием ПОДОБНО "%" + Символ(160) + "%" — он должен вернуть пустой результат. Дополнительно проверьте прикладные сценарии: поиск контрагента по наименованию, преобразование загруженных сумм, сравнение строк в обмене данными.

Контрольные точки

Как проверить результат

Запрос с ПОДОБНО по символу 160
Норма

Возвращает пустой результат

Тревожный признак

Записи с NBSP всё ещё находятся

Сравнение ранее «неравных» строк
Норма

Строки равны после нормализации

Тревожный признак

Сравнение по-прежнему ложно

Преобразование сумм из файла
Норма

Число() возвращает корректные значения

Тревожный признак

Нули или исключения в протоколе

Поиск дублей в справочнике
Норма

Повторные наименования не создаются

Тревожный признак

Дубли продолжают появляться

Итог

Что важно запомнить

Неразрывный пробел — это символ 160 (Символы.НПП), визуально неотличимый от обычного. Удаляйте его через СтрЗаменить: в числах — на пустую строку, в текстах — на обычный пробел. Для массовой чистки используйте запрос с ПОДОБНО и обработку записи, обязательно после резервного копирования. Результат проверяйте повторным поиском символа 160.

Частые вопросы

Чем неразрывный пробел отличается от обычного?

Обычный пробел имеет код 32, неразрывный — код 160. Визуально они одинаковы, но для 1С это разные символы: сравнение строк, поиск и преобразование в число учитывают различие. Неразрывный пробел предназначен для запрета переноса строки между словами, поэтому часто встречается в текстах из веба и офисных программ.

Почему СокрЛП не удаляет неразрывный пробел?

СокрЛП ориентирован на стандартные пробельные символы, и символ 160 в типовых сценариях может остаться на месте. Надёжная схема: сначала заменить Символы.НПП на обычный пробел или пустую строку через СтрЗаменить, и только потом применять СокрЛП.

Как найти все записи с неразрывным пробелом в справочнике?

Используйте запрос с условием вида: Наименование ПОДОБНО "%" + Символ(160) + "%". Строку поиска удобно собрать в коде и передать в запрос параметром. Такой запрос вернёт только проблемные записи, что удобно и для диагностики, и для последующей обработки.

Можно ли удалить неразрывный пробел без программирования?

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

Почему Число() возвращает 0 для строки вида «1 250 000»?

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

Опасно ли массово перезаписывать объекты при чистке?

Да, если действовать без подготовки: запись документов может затронуть проведение и движения, а ошибка в обработке испортит данные во всех записях сразу. Обязательно сделайте резервную копию, сначала запустите обработку в режиме просмотра найденного, а документы записывайте в режиме «Запись», а не «Проведение».