Разработка и Конфигурация · 11 мин
Как найти недопустимые символы в 1С
Как найти недопустимые символы в 1С: поиск в справочниках, запросах и обработках. Примеры кода на встроенном языке, типичные ошибки и способы очистки данных.
Недопустимые символы в 1С — это служебные и управляющие знаки, которые не видны на экране, но ломают обмен данными, выгрузку в XML, печать документов и работу веб-сервисов. Чаще всего проблема проявляется сообщениями вида «Ошибка разбора XML: недопустимый символ», сбоями синхронизации между базами или отказом загрузки файла в стороннюю систему.
Источники таких символов почти всегда одинаковы: копирование текста из Word, Excel, почты или PDF, загрузка данных из внешних файлов, интеграции с сайтами и ручной ввод с нестандартными раскладками. Символы с кодами 0–31 (кроме табуляции, перевода строки и возврата каретки), неразрывные пробелы, «мягкие» переносы и невидимые знаки Юникода остаются в строках незамеченными, пока не доходят до механизма сериализации или обмена.
Найти их можно несколькими способами: встроенным поиском по справочнику, запросом с конструкцией ПОДОБНО, универсальной обработкой поиска и замены значений, а также программной проверкой кодов символов в цикле. Ниже разобраны все рабочие варианты — от простых до массовых.
Какие символы считаются недопустимыми и где они прячутся
Под недопустимыми обычно понимают управляющие символы с кодами от 0 до 31, за исключением допустимых в XML знаков: табуляции (код 9), перевода строки (код 10) и возврата каретки (код 13). Спецификация XML запрещает большинство управляющих кодов, поэтому любой обмен через XML, веб-сервисы или EnterpriseData падает при их наличии в данных.
Отдельная группа — визуально «невидимые» символы Юникода: неразрывный пробел (код 160), нулевой пробел, мягкий перенос (код 173), различные кавычки-«ёлочки» и тире, скопированные из офисных документов. Они не всегда ломают обмен, но мешают поиску, сравнению строк и сопоставлению данных при синхронизации.
Типичные места обитания проблемных символов: наименования товаров и контрагентов, полное наименование организаций, адреса, описания, комментарии к документам, реквизиты типа «Строка неограниченной длины». Именно эти поля чаще всего заполняются копированием из внешних источников.
Проверить строковые реквизиты объектов, участвующих в обмене
Сравнить коды символов в строке через КодСимвола()
Найти объект по последней успешно выгруженной записи
Сравнить строки после нормализации пробелов
Быстрый поиск через запрос с оператором ПОДОБНО
Самый быстрый способ без программирования — консоль запросов с оператором ПОДОБНО. В языке запросов 1С нет прямой функции для кода символа, поэтому символ вставляют в шаблон буквально или ищут через конкретные подозрительные знаки. Например, для поиска неразрывного пробела в наименованиях номенклатуры запрос выглядит так:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Наименование ПОДОБНО "%" + СИМВОЛ(160) + "%"
Обратите внимание: функция СИМВОЛ() доступна не во всех версиях платформы в языке запросов. Если консоль запросов её не принимает, символ можно вставить в параметр запроса из кода или скопировать сам знак в шаблон напрямую. Для управляющих символов (коды 0–8, 11, 12, 14–31) прямой поиск через ПОДОБНО затруднён — надёжнее программная проверка.
Практический приём: сначала ищут самые частые нарушители — неразрывный пробел (160), мягкий перенос (173), символы табуляции там, где их не должно быть. Если ошибка обмена сохраняется, переходят к полному сканированию кодов программным способом.
Поиск через типовую обработку «Поиск и замена значений»
В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) есть встроенная обработка «Поиск и замена значений» — обычно она находится в разделе «Администрирование» → «Обслуживание» или «Поддержка и обслуживание». Она позволяет искать произвольные строки по всем реквизитам выбранных объектов и при необходимости сразу заменять найденное.
Для поиска недопустимых символов в поле поиска вставляют скопированный символ — например, неразрывный пробел, предварительно «добытый» из проблемной строки. Дальше выбирают объекты метаданных для проверки (справочники, документы) и запускают поиск. Обработка покажет список объектов, где значение встречается, с возможностью перейти к каждому из них.
Ограничение метода: он работает, только если вы знаете, какой именно символ ищете, и можете его вставить в поле поиска. Управляющие символы с кодами 0–8 вставить в поле ввода обычно невозможно — для них нужен программный способ.
Программный поиск по кодам символов
Универсальный и самый надёжный способ — перебрать строки в коде и проверить код каждого символа функцией КодСимвола(). Так можно найти любой управляющий знак, включая те, что невозможно ввести с клавиатуры. Пример функции проверки строки:
Функция НайтиНедопустимыеСимволы(Строка)
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, Позиция);
Если (Код < 32 И Код <> 9 И Код <> 10 И Код <> 13)
Или Код = 160 Или Код = 173 Тогда
Результат = Результат + "Позиция " + Позиция
+ ": код " + Код + Символы.ПС;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Для массовой проверки функцию оборачивают в цикл по выборке запросом: выбирают все элементы справочника, для каждого проверяют строковые реквизиты и выводят в табличное поле или журнал регистрации ссылки на проблемные объекты. Такая обработка пишется за полчаса и многократно окупается при регулярных обменах.
Если нужно не только найти, но и исправить, используют СтрЗаменить() для известных символов либо собирают очищенную строку посимвольно, пропуская недопустимые коды. Перед любой массовой замене обязательно делают резервную копию информационной базы.
// Проверка строки на недопустимые символы XML
Функция ЕстьНедопустимые(Строка)
Для П = 1 По СтрДлина(Строка) Цикл
Код = КодСимвола(Строка, П);
Если Код < 32 И Код <> 9 И Код <> 10 И Код <> 13 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункцииПоиск проблемного объекта при ошибке обмена XML
Когда обмен падает с ошибкой «недопустимый символ», узел проблемы часто указан в сообщении: имя тега, тип объекта, порядковый номер записи в файле. Первый шаг — открыть файл обмена в текстовом редакторе, который показывает управляющие символы (например, Notepad++ с включённым отображением всех знаков), и найти позицию ошибки.
Второй вариант — бинарный поиск по данным: отключить половину объектов в выгрузке, повторить обмен и сузить круг до конкретного элемента. Метод медленный, но работает даже без доступа к коду и консоли запросов.
Третий путь — журнал регистрации. В нём фиксируются ошибки обмена с указанием объекта, если обмен выполняется типовыми механизмами. Найдя элемент, откройте его карточку и проверьте все длинные текстовые поля: наименование, описание, комментарий, адрес.
- 1Откройте журнал регистрации и найдите запись об ошибке с указанием объекта или позиции в файле
- 2Откройте файл обмена в редакторе с отображением управляющих символов и найдите позицию сбоя
- 3Определите объект 1С, которому принадлежит проблемная строка
- 4Проверьте строковые реквизиты объекта программной функцией по кодам символов
- 5Удалите или замените недопустимый символ и повторите обмен
Очистка данных и профилактика
После обнаружения символы удаляют вручную в карточке объекта (если их мало) или массово — обработкой. Ручная правка подходит для единичных случаев: откройте поле, установите курсор и удалите невидимый знак клавишами Delete/Backspace, двигаясь по строке посимвольно. Иногда проще полностью очистить поле и ввести значение заново с клавиатуры.
Для массовой очистки пишут обработку: перебор объектов, замена неразрывных пробелов на обычные через СтрЗаменить(Строка, Символ(160), " "), удаление управляющих кодов посимвольной сборкой строки, запись изменённых объектов в транзакции. Запуск — только после резервного копирования и желательно сначала в режиме «только показать, что будет изменено».
Профилактика сводится к трём мерам: очистка строк на входе (в процедуре ОбработкаЗаполнения или ПриЗаписи для данных из обменов), проверка в форме при вводе через событие ОкончаниеВводаТекста, и нормализация данных при загрузке из файлов — сразу заменять неразрывные пробелы и отсекать управляющие символы.
Частые ошибки при поиске и как их избежать
Самая распространённая ошибка — поиск «на глаз»: пользователь видит в строке обычный пробел, а на самом деле там неразрывный (код 160). Визуально они неотличимы, поэтому диагностику всегда нужно подтверждать проверкой кодов символов, а не внешним видом строки.
Вторая ошибка — исправление только одного найденного символа. Если данные пришли из внешнего источника, проблемных символов обычно несколько и в разных объектах. Правильный подход — полное сканирование всех строковых реквизитов всех объектов, участвующих в обмене, а не точечное латание.
Третья ошибка — игнорирование табличных частей и дополнительных реквизитов. Недопустимый символ может сидеть не в наименовании, а в описании товара в табличной части, в значении дополнительного реквизита или в комментарии документа. Сканирование должно покрывать все строковые поля объекта.
FAQ
Как узнать код конкретного символа в строке?
Используйте функцию КодСимвола(Строка, Позиция) во встроенном языке — она возвращает числовой код знака на указанной позиции. Удобно выполнить этот код в консоли кода или через кнопку «Вычислить выражение» (Shift+F9) в отладчике, подставив значение проблемного реквизита.
Почему поиск по строке не находит значение, которое точно есть в базе?
Почти наверняка в хранящейся строке есть неразрывный пробел (код 160) или другой невидимый символ, а вы вводите обычный пробел. Строки для платформы разные, поэтому совпадения нет. Скопируйте фрагмент строки прямо из карточки объекта в поле поиска или нормализуйте пробелы перед сравнением.
Можно ли найти недопустимые символы без прав на изменение конфигурации?
Да. Для этого не нужно дорабатывать конфигурацию: достаточно типовой обработки «Поиск и замена значений», внешней консоли запросов или внешней обработки, открытой через «Файл → Открыть». Права на запись объектов понадобятся только для исправления найденных значений.
Какие символы разрешены в XML-обмене 1С?
Из управляющих символов допустимы только табуляция (код 9), перевод строки (код 10) и возврат каретки (код 13). Все остальные коды от 0 до 31 недопустимы и вызывают ошибку разбора XML. Также требуют экранирования знаки <, > и & в текстовых узлах.
Символы появляются снова после очистки — что делать?
Значит, источник не устранён: данные продолжают поступать из внешней системы, файла или копированием пользователями. Найдите канал поступления (обмен, загрузка, конкретный сотрудник) и добавьте очистку строк на входе — в момент записи объекта или в процедуре загрузки данных.
Чем опасна замена неразрывного пробела на обычный в номенклатуре?
Если наименование участвует в сопоставлении при синхронизации с другой базой или сайтом, после замены строки перестанут совпадать, и обмен может создать дубли элементов. Перед массовой заменой проверьте, по каким полям выполняется сопоставление, и при необходимости обновите данные на обеих сторонах обмена.
Что важно запомнить
Недопустимые символы — это невидимые управляющие знаки, попадающие в базу при копировании и загрузке данных. Находят их запросом с ПОДОБНО, типовой обработкой поиска и замены или программной проверкой кодов через КодСимвола(). Полное сканирование всех строковых реквизитов надёжнее точечных исправлений, а любая массовая очистка требует резервной копии и профилактики на входе.