Разработка и Конфигурация · 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).
Позиция = СтрНайти(Наименование, Символ(160));
Если Позиция > 0 Тогда
Сообщить("Неразрывный пробел на позиции " + Позиция);
КонецЕсли;Как выявить непечатаемые символы посимвольным перебором
Когда неизвестно, какой именно символ «спрятался» в строке, применяют посимвольный разбор: строка перебирается в цикле, и для каждого символа проверяется его код функцией КодСимвола. Это универсальный способ диагностики «грязных» данных, пришедших из внешних систем.
Функция НайтиНепечатаемыеСимволы(Строка) Экспорт
Результат = "";
Для Поз = 1 По СтрДлина(Строка) Цикл
ТекСимвол = Сред(Строка, Поз, 1);
Код = КодСимвола(ТекСимвол);
Если Код < 32 Или Код = 160 Или Код = 173 Тогда
Результат = Результат + "Позиция " + Поз + ": код " + Код + Символы.ПС;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Коды с 0 по 31 — это управляющие символы (кроме допустимых 9, 10, 13 в некоторых контекстах). Код 160 — неразрывный пробел, 173 — мягкий перенос. Если диагностика показывает такие коды в полях, которые участвуют в поиске или сравнении (артикулы, коды, наименования), данные нужно чистить.
Для быстрой разовой проверки одного значения удобно воспользоваться консолью кода (внешней обработкой) или командой «Вычислить выражение» (Shift+F9) в отладчике: достаточно вычислить КодСимвола(Сред(Значение, 3, 1)) для подозрительной позиции.
- 1Скопируйте проблемное значение из базы или файла
- 2Переберите строку через Сред() и КодСимвола()
- 3Зафиксируйте коды символов вне диапазона печатаемых (меньше 32, равно 160, 173)
- 4Определите позиции и источник попадания символов (загрузка, обмен, ручной ввод)
- 5Очистите данные через СтрЗаменить и проверьте повторным перебором
Очистка строк от спецсимволов
Для удаления известного символа используют СтрЗаменить(Строка, ЧтоЗаменить, НаЧто). Чтобы убрать все переносы строк и неразрывные пробелы, достаточно последовательных замен:
Чистая = СтрЗаменить(Исходная, Символы.ПС, " ");
Чистая = СтрЗаменить(Чистая, Символы.ВК, "");
Чистая = СтрЗаменить(Чистая, Символы.Таб, " ");
Чистая = СтрЗаменить(Чистая, Символ(160), " ");
Чистая = СокрЛП(Чистая);
Важный нюанс: СокрЛП удаляет только пробельные символы по краям строки, причём неразрывный пробел в некоторых случаях она не трогает. Поэтому замену символа 160 нужно выполнять до СокрЛП, а не вместо неё. Двойные пробелы, образовавшиеся после замен, убирают циклом замены двух пробелов на один до тех пор, пока СтрНайти(Строка, " ") не вернёт 0.
Для массовой очистки справочника (например, наименований номенклатуры) пишут обработку: выборка запросом, очистка каждого значения, запись объекта только если строка изменилась. Перед массовой обработкой обязательно сделайте резервную копию базы и сначала выполните прогон в режиме «только отчёт» без записи, чтобы оценить объём изменений.
Спецсимволы в запросах и операторе ПОДОБНО
При поиске по текстовым полям через запрос с оператором ПОДОБНО символы %, _ и квадратные скобки работают как служебные: процент заменяет любую последовательность, подчёркивание — один символ. Если пользователь ищет строку, содержащую сам знак процента (например, «скидка 10%»), его нужно экранировать.
Для экранирования в запросе задают специальный символ через параметр СПЕЦСИМВОЛ и вставляют его перед служебным знаком в шаблоне поиска. Без экранирования поиск «10%» найдёт и «100», и «10 кг», что даст лишние результаты.
Отдельная ловушка — поиск по полю, в котором хранятся переносы строк. Условие ГДЕ Наименование = &Строка не сработает, если в базе значение содержит перенос строки или неразрывный пробел, а переданный параметр — нет. В таких случаях сначала чистят данные в базе, а не подгоняют каждый запрос под «грязные» значения.
Регулярные выражения и внешние компоненты
Встроенного механизма регулярных выражений во встроенном языке 1С нет. Если нужен поиск по шаблону — например, «все символы, кроме букв, цифр и дефиса» — применяют один из обходных путей: посимвольную проверку через КодСимвола, функцию СтрРазделить по допустимым разделителям или подключение внешних компонент и COM-объектов.
На клиенте под Windows иногда используют COM-объект VBScript.RegExp, но он недоступен на сервере под Linux и в веб-клиенте, поэтому для серверного кода такой подход не подходит. Кроссплатформенная альтернатива — самописная функция проверки по «белому списку» допустимых символов:
Функция ЕстьНедопустимыеСимволы(Строка, Допустимые) Экспорт
Для Поз = 1 По СтрДлина(Строка) Цикл
Если СтрНайти(Допустимые, Сред(Строка, Поз, 1)) = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Подход с «белым списком» надёжнее поиска по «чёрному списку»: перечислить все возможные нежелательные символы невозможно, а перечислить допустимые для конкретного поля (например, для артикула — латиница, цифры, дефис) — реально.
Сравнение способов поиска
Быстрый поиск известного символа. Подходит для ПС, ВК, Таб, НПП. Не помогает, если символ неизвестен
Универсальная диагностика любых непечатаемых символов. Медленнее на больших объёмах
Надёжная валидация ввода и загрузок. Требует заранее определить допустимый набор
Полноценные регулярные выражения. Работает только на Windows-клиенте, не подходит для сервера Linux
Типичные ошибки и проверка результата
Самая распространённая ошибка — попытка удалить неразрывный пробел функцией СокрЛП. Она обрезает только крайние пробельные символы и не трогает символ 160 в середине строки. Вторая ошибка — заменять перенос строки на пустую строку там, где он разделяет слова: «Слово1Слово2» вместо «Слово1 Слово2». Переносы и табуляции в текстовых полях корректнее заменять на обычный пробел.
Третья ошибка — очистка только при отображении, а не в данных. Если символ остаётся в базе, проблема возвращается при каждом обмене, поиске и выгрузке. Четвёртая — массовая обработка без предварительного отчёта: нельзя оценить масштаб изменений и заметить, что обработка задела лишние записи.
После очистки результат проверяют повторным посимвольным перебором: функция диагностики должна вернуть пустую строку. Дополнительно стоит проверить прикладной сценарий — поиск элемента, сравнение строк, выгрузку в файл — именно тот, который раньше давал сбой.
Как проверить результат
Нет кодов меньше 32, 160 и 173
Диагностика снова показывает непечатаемые коды
Строки равны, СтрСравнить возвращает 0
Строки визуально совпадают, но сравнение даёт неравенство
Элемент находится с первого раза
Поиск не находит существующий элемент
FAQ
Как найти неразрывный пробел в строке 1С?
Используйте СтрНайти(Строка, Символ(160)) или СтрНайти(Строка, Символы.НПП). Возвращённая позиция больше нуля означает, что символ присутствует. Для удаления выполните СтрЗаменить(Строка, Символ(160), " ").
Как узнать код символа в строке?
Функция КодСимвола(Сред(Строка, Позиция, 1)) возвращает код Unicode символа на указанной позиции. В отладчике то же самое можно вычислить через «Вычислить выражение» (Shift+F9), не изменяя код.
Почему СокрЛП не убирает все пробелы?
СокрЛП удаляет пробельные символы только с начала и конца строки и не затрагивает неразрывный пробел (код 160) в середине. Его нужно предварительно заменить на обычный пробел через СтрЗаменить.
Как искать спецсимволы в запросе 1С?
Напрямую искать непечатаемые символы в запросе неудобно. Обычно используют оператор ПОДОБНО с шаблоном, а служебные символы %, _ и [ экранируют через конструкцию СПЕЦСИМВОЛ. Для поиска записей с переносами строк проще использовать обработку с посимвольным перебором.
Есть ли в 1С регулярные выражения?
Встроенной поддержки регулярных выражений во встроенном языке нет. На Windows-клиенте можно подключить COM-объект VBScript.RegExp, но это не работает на сервере Linux и в веб-клиенте. Кроссплатформенная замена — проверка по белому списку допустимых символов.
Как массово очистить справочник от спецсимволов?
Напишите обработку: запросом выберите элементы, для каждого примените цепочку СтрЗаменить и запишите объект только при изменении значения. Перед запуском сделайте резервную копию и выполните тестовый прогон в режиме отчёта без записи.