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