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

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

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

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

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

Источники таких символов почти всегда одинаковы: копирование текста из Word, Excel, почты или PDF, загрузка данных из внешних файлов, интеграции с сайтами и ручной ввод с нестандартными раскладками. Символы с кодами 0–31 (кроме табуляции, перевода строки и возврата каретки), неразрывные пробелы, «мягкие» переносы и невидимые знаки Юникода остаются в строках незамеченными, пока не доходят до механизма сериализации или обмена.

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

Какие символы считаются недопустимыми и где они прячутся

Под недопустимыми обычно понимают управляющие символы с кодами от 0 до 31, за исключением допустимых в XML знаков: табуляции (код 9), перевода строки (код 10) и возврата каретки (код 13). Спецификация XML запрещает большинство управляющих кодов, поэтому любой обмен через XML, веб-сервисы или EnterpriseData падает при их наличии в данных.

Отдельная группа — визуально «невидимые» символы Юникода: неразрывный пробел (код 160), нулевой пробел, мягкий перенос (код 173), различные кавычки-«ёлочки» и тире, скопированные из офисных документов. Они не всегда ломают обмен, но мешают поиску, сравнению строк и сопоставлению данных при синхронизации.

Типичные места обитания проблемных символов: наименования товаров и контрагентов, полное наименование организаций, адреса, описания, комментарии к документам, реквизиты типа «Строка неограниченной длины». Именно эти поля чаще всего заполняются копированием из внешних источников.

Ошибка разбора XML при обменеВ данных есть управляющий символ

Проверить строковые реквизиты объектов, участвующих в обмене

Поиск не находит видимое значениеВ строке неразрывный пробел или невидимый знак

Сравнить коды символов в строке через КодСимвола()

Сбой выгрузки в файлНедопустимый символ в наименовании или описании

Найти объект по последней успешно выгруженной записи

Дубли при синхронизацииСтроки отличаются невидимыми символами

Сравнить строки после нормализации пробелов

Быстрый поиск через запрос с оператором ПОДОБНО

Самый быстрый способ без программирования — консоль запросов с оператором ПОДОБНО. В языке запросов 1С нет прямой функции для кода символа, поэтому символ вставляют в шаблон буквально или ищут через конкретные подозрительные знаки. Например, для поиска неразрывного пробела в наименованиях номенклатуры запрос выглядит так:

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

Номенклатура.Наименование ПОДОБНО "%" + СИМВОЛ(160) + "%"

Обратите внимание: функция СИМВОЛ() доступна не во всех версиях платформы в языке запросов. Если консоль запросов её не принимает, символ можно вставить в параметр запроса из кода или скопировать сам знак в шаблон напрямую. Для управляющих символов (коды 0–8, 11, 12, 14–31) прямой поиск через ПОДОБНО затруднён — надёжнее программная проверка.

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

Поиск через типовую обработку «Поиск и замена значений»

В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) есть встроенная обработка «Поиск и замена значений» — обычно она находится в разделе «Администрирование» → «Обслуживание» или «Поддержка и обслуживание». Она позволяет искать произвольные строки по всем реквизитам выбранных объектов и при необходимости сразу заменять найденное.

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

Ограничение метода: он работает, только если вы знаете, какой именно символ ищете, и можете его вставить в поле поиска. Управляющие символы с кодами 0–8 вставить в поле ввода обычно невозможно — для них нужен программный способ.

Программный поиск по кодам символов

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

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

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

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

Код = КодСимвола(Строка, Позиция);

Если (Код < 32 И Код <> 9 И Код <> 10 И Код <> 13)

Или Код = 160 Или Код = 173 Тогда

Результат = Результат + "Позиция " + Позиция

+ ": код " + Код + Символы.ПС;

КонецЕсли;

КонецЦикла;

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

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

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

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

bsl
// Проверка строки на недопустимые символы XML
Функция ЕстьНедопустимые(Строка)
	Для П = 1 По СтрДлина(Строка) Цикл
		Код = КодСимвола(Строка, П);
		Если Код < 32 И Код <> 9 И Код <> 10 И Код <> 13 Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат Ложь;
КонецФункции

Поиск проблемного объекта при ошибке обмена XML

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

Второй вариант — бинарный поиск по данным: отключить половину объектов в выгрузке, повторить обмен и сузить круг до конкретного элемента. Метод медленный, но работает даже без доступа к коду и консоли запросов.

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

Порядок действий при ошибке обмена
  1. 1
    Откройте журнал регистрации и найдите запись об ошибке с указанием объекта или позиции в файле
  2. 2
    Откройте файл обмена в редакторе с отображением управляющих символов и найдите позицию сбоя
  3. 3
    Определите объект 1С, которому принадлежит проблемная строка
  4. 4
    Проверьте строковые реквизиты объекта программной функцией по кодам символов
  5. 5
    Удалите или замените недопустимый символ и повторите обмен

Очистка данных и профилактика

После обнаружения символы удаляют вручную в карточке объекта (если их мало) или массово — обработкой. Ручная правка подходит для единичных случаев: откройте поле, установите курсор и удалите невидимый знак клавишами Delete/Backspace, двигаясь по строке посимвольно. Иногда проще полностью очистить поле и ввести значение заново с клавиатуры.

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

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

Частые ошибки при поиске и как их избежать

Самая распространённая ошибка — поиск «на глаз»: пользователь видит в строке обычный пробел, а на самом деле там неразрывный (код 160). Визуально они неотличимы, поэтому диагностику всегда нужно подтверждать проверкой кодов символов, а не внешним видом строки.

Вторая ошибка — исправление только одного найденного символа. Если данные пришли из внешнего источника, проблемных символов обычно несколько и в разных объектах. Правильный подход — полное сканирование всех строковых реквизитов всех объектов, участвующих в обмене, а не точечное латание.

Третья ошибка — игнорирование табличных частей и дополнительных реквизитов. Недопустимый символ может сидеть не в наименовании, а в описании товара в табличной части, в значении дополнительного реквизита или в комментарии документа. Сканирование должно покрывать все строковые поля объекта.

Типичные ошибки
01
Искать символ визуально вместо проверки кодов — невидимые знаки так не найти
02
Исправить один объект и не проверить остальные — ошибка обмена возвращается на следующем же сеансе
03
Забыть про табличные части и дополнительные реквизиты — символ остаётся в данных
04
Запустить массовую замену без резервной копии — при ошибке данные теряются безвозвратно
05
Менять наименования, участвующие в синхронизации, без учёта связанной базы — появляются дубли

FAQ

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

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

Почему поиск по строке не находит значение, которое точно есть в базе?

Почти наверняка в хранящейся строке есть неразрывный пробел (код 160) или другой невидимый символ, а вы вводите обычный пробел. Строки для платформы разные, поэтому совпадения нет. Скопируйте фрагмент строки прямо из карточки объекта в поле поиска или нормализуйте пробелы перед сравнением.

Можно ли найти недопустимые символы без прав на изменение конфигурации?

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

Какие символы разрешены в XML-обмене 1С?

Из управляющих символов допустимы только табуляция (код 9), перевод строки (код 10) и возврат каретки (код 13). Все остальные коды от 0 до 31 недопустимы и вызывают ошибку разбора XML. Также требуют экранирования знаки <, > и & в текстовых узлах.

Символы появляются снова после очистки — что делать?

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

Чем опасна замена неразрывного пробела на обычный в номенклатуре?

Если наименование участвует в сопоставлении при синхронизации с другой базой или сайтом, после замены строки перестанут совпадать, и обмен может создать дубли элементов. Перед массовой заменой проверьте, по каким полям выполняется сопоставление, и при необходимости обновите данные на обеих сторонах обмена.

Итог

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

Недопустимые символы — это невидимые управляющие знаки, попадающие в базу при копировании и загрузке данных. Находят их запросом с ПОДОБНО, типовой обработкой поиска и замены или программной проверкой кодов через КодСимвола(). Полное сканирование всех строковых реквизитов надёжнее точечных исправлений, а любая массовая очистка требует резервной копии и профилактики на входе.