Разработка и Конфигурация · 9 мин
Код символа 160: что это за символ и как с ним работать в 1С
Код символа 160 — это неразрывный пробел. Разбираем, как он попадает в данные 1С, чем мешает сравнению строк и как найти и удалить его кодом на встроенном языке.
Символ с кодом 160 — это неразрывный пробел (non-breaking space, NBSP) из таблицы Unicode. Визуально он выглядит как обычный пробел, но для программы это совершенно другой символ: обычный пробел имеет код 32, а неразрывный — 160. Из-за этого строки, которые человек видит одинаковыми, 1С считает разными.
В 1С неразрывный пробел встречается постоянно: его автоматически вставляет платформа при форматировании чисел (разделитель групп разрядов «1 000 000»), он приходит из Excel, из веб-страниц, из скопированного текста документов. Разработчик или пользователь замечает проблему, когда перестают работать сравнение строк, поиск в справочнике, преобразование строки в число или загрузка данных.
Получить этот символ в коде 1С можно функцией Символ(160). Обратная операция — узнать код символа — выполняется функцией КодСимвола(" "), если в кавычках стоит именно неразрывный пробел. Ниже разберём, откуда символ берётся, чем он опасен и как его корректно удалять или заменять.
Что такое символ с кодом 160 и чем он отличается от обычного пробела
В таблице Unicode символ с кодом 160 называется неразрывным пробелом. Его исходное назначение — типографика: он запрещает разрыв строки между двумя словами, например между числом и единицей измерения «10 кг». Браузеры, Word и Excel используют его, чтобы текст переносился аккуратно.
Обычный пробел имеет код 32. Для человека разницы между ними нет — оба выглядят как пустое место. Для машины это два разных символа, и любое посимвольное сравнение строк, где в одной стоит код 32, а в другой код 160, вернёт «ложь».
Проверить, какой именно пробел стоит в строке, можно прямо в отладчике 1С: вычислить выражение КодСимвола(Сред(МояСтрока, 5, 1)), где 5 — позиция подозрительного пробела. Если результат 160, а не 32 — вы нашли источник проблемы.
Откуда неразрывный пробел попадает в данные 1С
Самый частый источник — форматирование чисел. Когда платформа выводит число в табличный документ или преобразует его в строку с группировкой разрядов, в качестве разделителя групп используется именно неразрывный пробел: «1 234 567». Если потом эту строку пытаются обратно преобразовать в число, возникает ошибка или неверный результат.
Вторая типичная ситуация — загрузка из Excel. Ячейки, в которых числа отформатированы с разделителями разрядов, при чтении через COM-объект или табличный документ отдают строки с символом 160. То же происходит при копировании текста из веб-страниц, PDF и Word: верстка этих форматов активно использует неразрывные пробелы.
Третий источник — ручной ввод. Пользователь копирует наименование контрагента или номер договора из письма и вставляет в поле 1С вместе с невидимым символом 160. В результате в справочнике появляются дубли: «ООО Ромашка» и «ООО Ромашка», которые отличаются одним неразрывным пробелом и не находятся стандартным поиском.
Какие проблемы вызывает символ 160 в 1С
Главная проблема — неверное сравнение строк. Условие Если Наименование1 = Наименование2 не сработает, если в одной строке обычный пробел, а в другой неразрывный. На этом ломаются поиск дублей, сопоставление номенклатуры при обмене, сверка данных между базами.
Вторая проблема — преобразование типов. Выражение Число("1 000"), где разделитель — неразрывный пробел, вызовет ошибку преобразования, потому что символ 160 не является допустимым разделителем при явном преобразовании строки в число. Загрузки прайсов и выписок падают именно на этом.
Третья группа проблем — запросы и отборы. Поиск в запросе по точному совпадению строки не найдёт записи с NBSP. Функция СокрЛП() также не удаляет неразрывный пробел по краям строки: она работает только с обычными пробельными символами, поэтому «обрезанная» строка может сохранить невидимый символ в начале или конце.
Как найти и удалить символ 160 кодом 1С
Базовый приём — замена через СтрЗаменить. Чтобы удалить неразрывный пробел полностью: Результат = СтрЗаменить(ИсходнаяСтрока, Символ(160), ""). Если нужно сохранить визуальную структуру строки, заменяйте на обычный пробел: СтрЗаменить(ИсходнаяСтрока, Символ(160), " ").
Для строк, которые должны стать числами, удобно написать универсальную функцию очистки: убрать и неразрывный пробел, и обычный пробел, и при необходимости привести разделитель дробной части. Такая функция вызывается перед каждым преобразованием при загрузке данных.
Функция ОчиститьСтроку(Знач Строка)
Строка = СтрЗаменить(Строка, Символ(160), " ");
Возврат СокрЛП(Строка);
КонецФункции
Функция СтрокаВЧисло(Знач Строка)
Строка = СтрЗаменить(Строка, Символ(160), "");
Строка = СтрЗаменить(Строка, " ", "");
Возврат Число(Строка);
КонецФункцииПорядок действий важен: сначала заменяем символ 160 на обычный пробел или пустую строку, и только потом вызываем СокрЛП(). Если сделать наоборот, неразрывный пробел останется по краям строки.
- 1Замените Символ(160) на обычный пробел или пустую строку через СтрЗаменить
- 2При необходимости удалите обычные пробелы (для чисел)
- 3Примените СокрЛП() для обрезки краёв
- 4Проверьте результат: сравните строки или выполните преобразование в число
Как найти неразрывный пробел в данных без программирования
Если вы не разработчик, а пользователь, проверить наличие символа 160 можно в редакторе, который показывает коды символов, например в Notepad++: скопируйте строку из 1С и включите отображение всех символов — NBSP подсветится отдельно от обычного пробела.
Для поиска дублей в справочниках можно использовать групповую обработку или консоль запросов с условием на ПОДОБНО, но проще всего попросить разработчика выполнить разовую обработку: пройти по элементам справочника, заменить символ 160 в наименованиях и найти совпадения. Перед такой обработкой обязательно сделайте резервную копию базы, потому что массовое изменение наименований необратимо.
При загрузке прайсов из Excel выгоднее чистить данные сразу в момент чтения ячейки, а не после заполнения всей таблицы. Одна строка замены в цикле чтения избавляет от поиска ошибок преобразования по всей загрузке.
Типичные ошибки при работе с символом 160
Частая ошибка — попытка заменить неразрывный пробел, скопировав его в код модуля из строки данных. Такой символ в исходном тексте модуля невидим и легко теряется при редактировании; кроме того, конфигуратор может сохранить его неоднозначно. Правильный способ — всегда использовать явный вызов Символ(160), тогда код читается и работает предсказуемо.
Вторая ошибка — чистить только один источник данных. Если символ приходит и из Excel, и с веб-сервиса, и с копипасты пользователей, обработка одного канала даст ложное ощущение решения. Лучше вынести функцию очистки в общий модуль и применять её на всех входах строковых данных.
Когда неразрывный пробел нужно оставить
Не всегда символ 160 — враг. В печатных формах и форматированных строках он выполняет свою законную функцию: не даёт перенести сумму отдельно от валюты, число от единицы измерения, инициалы от фамилии. При формировании строки для вывода его можно вставлять осознанно: Строка(Сумма) + Символ(160) + "руб.".
Правило простое: в данных, по которым идёт поиск, сравнение и преобразование, неразрывный пробел удаляем; в текстах, предназначенных только для отображения человеку, он допустим и даже полезен.
Что важно запомнить
Символ 160 — неразрывный пробел, который выглядит как обычный, но не равен ему при сравнении. Он появляется из форматирования чисел, Excel и копипасты. Удаляйте его через СтрЗаменить(Строка, Символ(160), " ") до сравнения и преобразования, и помните, что СокрЛП() его не трогает.
Частые вопросы о символе 160 в 1С
Чем символ 160 отличается от символа 32?
Код 32 — обычный пробел, код 160 — неразрывный пробел. Визуально они одинаковы, но при сравнении строк 1С считает их разными символами. Неразрывный пробел дополнительно запрещает перенос строки в месте своего расположения.
Почему СокрЛП() не удаляет символ 160?
Функции СокрЛ, СокрП и СокрЛП удаляют только стандартные пробельные символы, и неразрывный пробел с кодом 160 в их число не входит. Поэтому строку сначала обрабатывают СтрЗаменить с Символ(160), а затем уже применяют СокрЛП.
Как узнать код символа в конкретной позиции строки?
Используйте функцию КодСимвола: КодСимвола(Сред(Строка, НомерПозиции, 1)). Удобно выполнить это выражение в окне «Вычислить выражение» во время отладки, чтобы проверить подозрительный пробел.
Почему число из Excel не преобразуется функцией Число()?
Чаще всего потому, что в строке между разрядами стоит неразрывный пробел с кодом 160, который пришёл из форматирования ячейки Excel. Перед вызовом Число() удалите его: СтрЗаменить(Строка, Символ(160), "").
Можно ли вставить неразрывный пробел в коде осознанно?
Да, вызовом Символ(160). Это уместно в печатных формах и форматированных строках, чтобы число не отрывалось от единицы измерения или инициалы от фамилии. В данных для поиска и сравнения его использовать не следует.
Из-за чего в справочнике появляются визуально одинаковые дубли?
Типичная причина — неразрывный пробел или лишние пробелы в наименованиях, внесённые при копировании из писем и документов. Стандартный поиск такие элементы не находит. Решение — обработка, которая заменяет Символ(160) на обычный пробел, обрезает строку и ищет совпадения; перед запуском делают резервную копию базы.