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

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

Как найти спецсимволы в 1С

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

Спецсимволы в 1С — это символы, которые имеют служебное значение или не отображаются на экране: переносы строк, табуляции, неразрывные пробелы, переводы каретки, а также непечатаемые управляющие коды. Они часто попадают в данные при обмене с внешними системами, копировании из Excel, загрузке прайсов и выгрузках из старых конфигураций. Если их не найти и не обработать, ломаются сравнения строк, поиск в базе, выгрузки в XML и интеграции по API.

Встроенный язык 1С предоставляет несколько инструментов для поиска таких символов: функции работы со строками (СтрНайти, СтрЗаменить), объект Символы для типовых служебных символов, функции КодСимвола и Символ для работы с кодами Unicode, а также возможность подключения регулярных выражений через внешние компоненты. Выбор способа зависит от задачи: разовая очистка данных, проверка ввода пользователя или массовая обработка справочника.

Ниже разобраны практические способы найти спецсимволы в строках, определить их коды, очистить данные и избежать типичных ошибок при сравнении строк.

Что считается спецсимволом в 1С и откуда он берётся

Под спецсимволами в контексте 1С обычно понимают две группы. Первая — служебные символы форматирования: перенос строки (ПС, код 10), возврат каретки (ВК, код 13), табуляция (Таб, код 9), неразрывный пробел (код 160). Вторая — непечатаемые управляющие символы Unicode с кодами от 0 до 31 и некоторые другие, которые не отображаются визуально, но влияют на обработку строк.

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

Отдельная категория — символы, которые имеют специальное значение внутри самих механизмов 1С: кавычки в тексте запроса, вертикальная черта в шаблонах, символы подстановки в операторе ПОДОБНО (%, _, [ ]) при поиске в запросах.

Поиск спецсимвола функцией СтрНайти

Основной инструмент поиска подстроки — функция СтрНайти(Строка, ПодстрокаПоиска). Она возвращает позицию первого вхождения или 0, если символ не найден. Для типовых служебных символов удобно использовать предопределённый объект Символы: Символы.ПС (перенос строки), Символы.ВК (возврат каретки), Символы.Таб (табуляция), Символы.НПП (неразрывный пробел).

Пример проверки строки на наличие переноса строки и табуляции:

Строка = "Текст с" + Символы.ПС + "переносом";

Если СтрНайти(Строка, Символы.ПС) > 0 Тогда

Сообщить("Найден перенос строки на позиции " + СтрНайти(Строка, Символы.ПС));

КонецЕсли;

Если СтрНайти(Строка, Символы.Таб) > 0 Тогда

Сообщить("Найдена табуляция");

КонецЕсли;

Для поиска произвольного символа по его коду Unicode используют функцию Символ(Код). Например, неразрывный пробел можно искать так: СтрНайти(Строка, Символ(160)). Это удобно, когда символ не входит в объект Символы — например, мягкий перенос (код 173) или нулевой символ (код 0).

bsl
Позиция = СтрНайти(Наименование, Символ(160));
Если Позиция > 0 Тогда
    Сообщить("Неразрывный пробел на позиции " + Позиция);
КонецЕсли;

Как выявить непечатаемые символы посимвольным перебором

Когда неизвестно, какой именно символ «спрятался» в строке, применяют посимвольный разбор: строка перебирается в цикле, и для каждого символа проверяется его код функцией КодСимвола. Это универсальный способ диагностики «грязных» данных, пришедших из внешних систем.

Функция НайтиНепечатаемыеСимволы(Строка) Экспорт

Результат = "";

Для Поз = 1 По СтрДлина(Строка) Цикл

ТекСимвол = Сред(Строка, Поз, 1);

Код = КодСимвола(ТекСимвол);

Если Код < 32 Или Код = 160 Или Код = 173 Тогда

Результат = Результат + "Позиция " + Поз + ": код " + Код + Символы.ПС;

КонецЕсли;

КонецЦикла;

Возврат Результат;

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

Коды с 0 по 31 — это управляющие символы (кроме допустимых 9, 10, 13 в некоторых контекстах). Код 160 — неразрывный пробел, 173 — мягкий перенос. Если диагностика показывает такие коды в полях, которые участвуют в поиске или сравнении (артикулы, коды, наименования), данные нужно чистить.

Для быстрой разовой проверки одного значения удобно воспользоваться консолью кода (внешней обработкой) или командой «Вычислить выражение» (Shift+F9) в отладчике: достаточно вычислить КодСимвола(Сред(Значение, 3, 1)) для подозрительной позиции.

Порядок диагностики строки
  1. 1
    Скопируйте проблемное значение из базы или файла
  2. 2
    Переберите строку через Сред() и КодСимвола()
  3. 3
    Зафиксируйте коды символов вне диапазона печатаемых (меньше 32, равно 160, 173)
  4. 4
    Определите позиции и источник попадания символов (загрузка, обмен, ручной ввод)
  5. 5
    Очистите данные через СтрЗаменить и проверьте повторным перебором

Очистка строк от спецсимволов

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

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

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

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

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

Чистая = СокрЛП(Чистая);

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

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

Спецсимволы в запросах и операторе ПОДОБНО

При поиске по текстовым полям через запрос с оператором ПОДОБНО символы %, _ и квадратные скобки работают как служебные: процент заменяет любую последовательность, подчёркивание — один символ. Если пользователь ищет строку, содержащую сам знак процента (например, «скидка 10%»), его нужно экранировать.

Для экранирования в запросе задают специальный символ через параметр СПЕЦСИМВОЛ и вставляют его перед служебным знаком в шаблоне поиска. Без экранирования поиск «10%» найдёт и «100», и «10 кг», что даст лишние результаты.

Отдельная ловушка — поиск по полю, в котором хранятся переносы строк. Условие ГДЕ Наименование = &Строка не сработает, если в базе значение содержит перенос строки или неразрывный пробел, а переданный параметр — нет. В таких случаях сначала чистят данные в базе, а не подгоняют каждый запрос под «грязные» значения.

Регулярные выражения и внешние компоненты

Встроенного механизма регулярных выражений во встроенном языке 1С нет. Если нужен поиск по шаблону — например, «все символы, кроме букв, цифр и дефиса» — применяют один из обходных путей: посимвольную проверку через КодСимвола, функцию СтрРазделить по допустимым разделителям или подключение внешних компонент и COM-объектов.

На клиенте под Windows иногда используют COM-объект VBScript.RegExp, но он недоступен на сервере под Linux и в веб-клиенте, поэтому для серверного кода такой подход не подходит. Кроссплатформенная альтернатива — самописная функция проверки по «белому списку» допустимых символов:

Функция ЕстьНедопустимыеСимволы(Строка, Допустимые) Экспорт

Для Поз = 1 По СтрДлина(Строка) Цикл

Если СтрНайти(Допустимые, Сред(Строка, Поз, 1)) = 0 Тогда

Возврат Истина;

КонецЕсли;

КонецЦикла;

Возврат Ложь;

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

Подход с «белым списком» надёжнее поиска по «чёрному списку»: перечислить все возможные нежелательные символы невозможно, а перечислить допустимые для конкретного поля (например, для артикула — латиница, цифры, дефис) — реально.

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

СтрНайти + Символы

Быстрый поиск известного символа. Подходит для ПС, ВК, Таб, НПП. Не помогает, если символ неизвестен

Посимвольный перебор с КодСимвола

Универсальная диагностика любых непечатаемых символов. Медленнее на больших объёмах

Белый список допустимых символов

Надёжная валидация ввода и загрузок. Требует заранее определить допустимый набор

COM VBScript.RegExp

Полноценные регулярные выражения. Работает только на Windows-клиенте, не подходит для сервера Linux

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

Самая распространённая ошибка — попытка удалить неразрывный пробел функцией СокрЛП. Она обрезает только крайние пробельные символы и не трогает символ 160 в середине строки. Вторая ошибка — заменять перенос строки на пустую строку там, где он разделяет слова: «Слово1Слово2» вместо «Слово1 Слово2». Переносы и табуляции в текстовых полях корректнее заменять на обычный пробел.

Третья ошибка — очистка только при отображении, а не в данных. Если символ остаётся в базе, проблема возвращается при каждом обмене, поиске и выгрузке. Четвёртая — массовая обработка без предварительного отчёта: нельзя оценить масштаб изменений и заметить, что обработка задела лишние записи.

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

Типичные ошибки
01
Удаление неразрывного пробела через СокрЛП — символ 160 в середине строки остаётся
02
Замена переноса строки на пустую строку — слова склеиваются
03
Очистка значения только в момент вывода — грязные данные остаются в базе и ломают обмены
04
Массовая обработка без резервной копии и тестового прогона — необратимые изменения
05
Поиск в запросе без экранирования % и _ — лишние результаты при ПОДОБНО
Контрольные точки

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

Повторный посимвольный перебор строки
Норма

Нет кодов меньше 32, 160 и 173

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

Диагностика снова показывает непечатаемые коды

Сравнение очищенной строки с эталоном
Норма

Строки равны, СтрСравнить возвращает 0

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

Строки визуально совпадают, но сравнение даёт неравенство

Поиск элемента справочника по значению
Норма

Элемент находится с первого раза

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

Поиск не находит существующий элемент

FAQ

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

Используйте СтрНайти(Строка, Символ(160)) или СтрНайти(Строка, Символы.НПП). Возвращённая позиция больше нуля означает, что символ присутствует. Для удаления выполните СтрЗаменить(Строка, Символ(160), " ").

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

Функция КодСимвола(Сред(Строка, Позиция, 1)) возвращает код Unicode символа на указанной позиции. В отладчике то же самое можно вычислить через «Вычислить выражение» (Shift+F9), не изменяя код.

Почему СокрЛП не убирает все пробелы?

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

Как искать спецсимволы в запросе 1С?

Напрямую искать непечатаемые символы в запросе неудобно. Обычно используют оператор ПОДОБНО с шаблоном, а служебные символы %, _ и [ экранируют через конструкцию СПЕЦСИМВОЛ. Для поиска записей с переносами строк проще использовать обработку с посимвольным перебором.

Есть ли в 1С регулярные выражения?

Встроенной поддержки регулярных выражений во встроенном языке нет. На Windows-клиенте можно подключить COM-объект VBScript.RegExp, но это не работает на сервере Linux и в веб-клиенте. Кроссплатформенная замена — проверка по белому списку допустимых символов.

Как массово очистить справочник от спецсимволов?

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