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

Разработка и Конфигурация · 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), " ").

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

1c
Функция ОчиститьСтроку(Знач Строка)
    Строка = СтрЗаменить(Строка, Символ(160), " ");
    Возврат СокрЛП(Строка);
КонецФункции

Функция СтрокаВЧисло(Знач Строка)
    Строка = СтрЗаменить(Строка, Символ(160), "");
    Строка = СтрЗаменить(Строка, " ", "");
    Возврат Число(Строка);
КонецФункции

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

Порядок очистки строки от символа 160
  1. 1
    Замените Символ(160) на обычный пробел или пустую строку через СтрЗаменить
  2. 2
    При необходимости удалите обычные пробелы (для чисел)
  3. 3
    Примените СокрЛП() для обрезки краёв
  4. 4
    Проверьте результат: сравните строки или выполните преобразование в число

Как найти неразрывный пробел в данных без программирования

Если вы не разработчик, а пользователь, проверить наличие символа 160 можно в редакторе, который показывает коды символов, например в Notepad++: скопируйте строку из 1С и включите отображение всех символов — NBSP подсветится отдельно от обычного пробела.

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

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

Типичные ошибки при работе с символом 160

Частая ошибка — попытка заменить неразрывный пробел, скопировав его в код модуля из строки данных. Такой символ в исходном тексте модуля невидим и легко теряется при редактировании; кроме того, конфигуратор может сохранить его неоднозначно. Правильный способ — всегда использовать явный вызов Символ(160), тогда код читается и работает предсказуемо.

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

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

Когда неразрывный пробел нужно оставить

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

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

Итог

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

Символ 160 — неразрывный пробел, который выглядит как обычный, но не равен ему при сравнении. Он появляется из форматирования чисел, Excel и копипасты. Удаляйте его через СтрЗаменить(Строка, Символ(160), " ") до сравнения и преобразования, и помните, что СокрЛП() его не трогает.

Частые вопросы о символе 160 в 1С

Чем символ 160 отличается от символа 32?

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

Почему СокрЛП() не удаляет символ 160?

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

Как узнать код символа в конкретной позиции строки?

Используйте функцию КодСимвола: КодСимвола(Сред(Строка, НомерПозиции, 1)). Удобно выполнить это выражение в окне «Вычислить выражение» во время отладки, чтобы проверить подозрительный пробел.

Почему число из Excel не преобразуется функцией Число()?

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

Можно ли вставить неразрывный пробел в коде осознанно?

Да, вызовом Символ(160). Это уместно в печатных формах и форматированных строках, чтобы число не отрывалось от единицы измерения или инициалы от фамилии. В данных для поиска и сравнения его использовать не следует.

Из-за чего в справочнике появляются визуально одинаковые дубли?

Типичная причина — неразрывный пробел или лишние пробелы в наименованиях, внесённые при копировании из писем и документов. Стандартный поиск такие элементы не находит. Решение — обработка, которая заменяет Символ(160) на обычный пробел, обрезает строку и ищет совпадения; перед запуском делают резервную копию базы.