Работа с данными в 1С:Предприятие часто сталкивается с проблемой недопустимых символов — скрытых знаков, которые ломают обмены, выгрузки в XML/JSON или приводят к ошибкам при загрузке в внешние системы. Эти символы могут попадать в базу через копипаст из Word, Excel, веб-страниц или даже при ручном вводе с клавиатуры (например, «кавычки-ёлочки» вместо стандартных). В отличие от очевидных опечаток, недопустимые символы зачастую невидимы в интерфейсе 1С, но вызывают критическую ошибку Неверный символ в позиции X или Ошибка при чтении потока.

Эта статья поможет как программистам , так и обычным пользователям найти и устранить проблемные символы. Мы рассмотрим:

  • 🔍 Какие символы считаются недопустимыми в разных контекстах (XML, JSON, текстовые файлы, SQL-запросы)
  • 🛠 Ручные методы поиска без программирования (для бухгалтеров и менеджеров)
  • 💻 Автоматизированные скрипты на встроенном языке и внешние инструменты
  • Типичные источники появления «мусорных» символов и как их предотвратить

Особое внимание уделим символам с кодами 0–31 (управляющие ASCII), неразрывным пробелам (U+00A0), «левым» и «правым» кавычкам (U+201C/U+201D), а также BOM-метке (U+FEFF), которые чаще всего становятся причиной сбоев. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.20+, но подходят и для более ранних версий с минимальными правками.

📊 Как часто вы сталкиваетесь с ошибками из-за недопустимых символов в 1С?
Еженедельно
Раз в месяц
Редко, но метко
Никогда не сталкивался
Не знаю, что это такое

1. Какие символы считаются недопустимыми в 1С?

Понятие «недопустимый символ» зависит от контекста использования данных. Например, в текстовом поле справочника можно хранить почти любой Unicode-символ, но при выгрузке в XML те же данные могут вызвать ошибку. Рассмотрим ключевые категории проблемных символов:

Категория Примеры символов Типичные ошибки Где встречается
Управляющие ASCII (0–31) NUL (0), TAB (9), LF (10), CR (13) Ошибка чтения потока, обрыв строки в XML Копипаст из Excel, старые тексты из DOS
Неразрывные пробелы U+00A0, U+202F Некорректное сравнение строк, ошибки в JSON Тексты из Word, веб-страницы
«Умные» кавычки “ ” (U+201C/U+201D), ‘ ’ (U+2018/U+2019) Ошибка парсинга XML/JSON Копирование из PDF, Word, веб
BOM-метка U+FEFF Ошибка при чтении файла как UTF-8 Файлы, сохранённые в Notepad++ с BOM
Символы вне ASCII € (U+20AC), © (U+00A9) Проблемы с кодировкой при обмене Тексты с валютами, авторскими правами

⚠️ Внимание: Символ TAB (9) и перевод строки (10, 13) допустимы в текстах 1С, но могут вызывать проблемы при формировании SQL-запросов или выгрузке в форматы с жёсткими требованиями к разделителям (например, CSV для банков). Всегда уточняйте требования к данным у получателя файла!

Для проверки символов вручную можно использовать онлайн-сервисы вроде Unicode Table или плагин для браузера Unicode Checker. Однако в корпоративных системах часто блокируются внешние ресурсы — поэтому далее мы рассмотрим методы поиска прямо в .

2. Ручной поиск недопустимых символов (без программирования)

Если вы не программист, но нужно срочно найти «мусор» в данных, воспользуйтесь этими методами:

2.1. Поиск по шаблону в справочниках и документах

Многие недопустимые символы можно обнаружить через стандартный поиск в :

  1. Откройте справочник или журнал документов (например, Справочники → Номенклатура).
  2. Нажмите Ctrl+F (поиск) и введите в поле поиска:
    • 🔹 Для неразрывного пробела: вставьте символ из буфера (скопируйте его из Word: Ctrl+Shift+Пробел)
    • 🔹 Для «умных» кавычек: скопируйте из этого текста: “ ” ‘ ’
    • 🔹 Для символов 0–31: используйте Символ(9) (TAB) или Символ(10) (LF)
  • Если поиск ничего не находит, попробуйте поиск по части строки с подстановочными знаками (например, %“% для кавычек).
  • Скопировать проблемный символ из внешнего источника

    Вставить его в поле поиска 1С (Ctrl+F)

    Использовать подстановочные знаки (%_)

    Проверить наиболее «рискованные» справочники (Номенклатура, Контрагенты, Договоры)

    Экспортировать данные в Excel и использовать функцию =КОДСИМВ()-->

    2.2. Экспорт в Excel и анализ функцией КОДСИМВ()

    Этот метод подходит для массовой проверки:

    1. Выгрузите данные в Excel через Файл → Сохранить как… → Таблица Excel (*.xlsx).
    2. В соседнем столбце используйте формулу:
      =КОДСИМВ(ЛЕВСИМВ(A1;1))

      где A1 — ячейка с вашим текстом.

    3. Протяните формулу на все строки. Коды 0–31, 127, 160 (U+00A0) — потенциально опасные.
    4. Для проверки всех символов в ячейке используйте:
      =МАКС(ЕСЛИОШИБКА(КОДСИМВ(ПСТР(A1;СТРОКА($1:$100);1));0))

      (вводится как формула массива Ctrl+Shift+Enter).

    5. ⚠️ Внимание: Excel может автоматически заменять некоторые символы при открытии файла (например, «умные» кавычки на стандартные). Чтобы избежать этого, открывайте CSV-файлы через Блокнот или используйте LibreOffice Calc с настройкой кодировки UTF-8.

      3. Поиск недопустимых символов с помощью встроенного языка 1С

      Для программистов доступны более мощные инструменты. Ниже приведены готовые функции для поиска проблемных символов в строках, полях справочников и документов.

      3.1. Функция проверки строки на недопустимые символы

      Добавьте этот код в общий модуль или обработайте прямо в консоли отладки (Ctrl+Alt+D):

      Функция НайтиНедопустимыеСимволы(Знач Строка, Знач РазрешенныеСимволы = "") Экспорт
      

      // РазрешенныеСимволы - строка с допустимыми символами (например, для XML: "#x9#xA#xD")

      // Возвращает массив с позициями и кодами недопустимых символов

      Результат = Новый Массив;

      ДлинаСтроки = СтрДлина(Строка);

      Для Индекс = 1 По ДлинаСтроки Цикл

      ТекущийСимвол = Сред(Строка, Индекс, 1);

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

      // Проверяем на управляющие символы (0-31, кроме 9,10,13)

      Если (КодСимвола >= 0 И КодСимвола <= 31) И НЕ (КодСимвола = 9 ИЛИ КодСимвола = 10 ИЛИ КодСимвола = 13) Тогда

      Результат.Добавить(Новый Структура("Позиция,Код,Символ", Индекс, КодСимвола, ТекущийСимвол));

      Продолжить;

      КонецЕсли;

      // Проверяем на неразрывный пробел (160)

      Если КодСимвола = 160 Тогда

      Результат.Добавить(Новый Структура("Позиция,Код,Символ", Индекс, КодСимвола, ТекущийСимвол));

      Продолжить;

      КонецЕсли;

      // Проверяем на "умные" кавычки

      Если КодСимвола = 8220 ИЛИ КодСимвола = 8221 ИЛИ КодСимвола = 8216 ИЛИ КодСимвола = 8217 Тогда

      Результат.Добавить(Новый Структура("Позиция,Код,Символ", Индекс, КодСимвола, ТекущийСимвол));

      Продолжить;

      КонецЕсли;

      // Проверяем на пользовательские ограничения

      Если НЕ ПустаяСтрока(РазрешенныеСимволы) И НЕ Найти(РазрешенныеСимволы, ТекущийСимвол) Тогда

      Результат.Добавить(Новый Структура("Позиция,Код,Символ", Индекс, КодСимвола, ТекущийСимвол));

      КонецЕсли;

      КонецЦикла;

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

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

      Пример использования:

      ТестоваяСтрока = "Пример „текста“ с   неразрывными   пробелами" + Символ(160) + Символ(1);
      

      Результат = НайтиНедопустимыеСимволы(ТестоваяСтрока);

      Для Каждого Нарушение Из Результат Цикл

      Сообщить(СтрШаблон("На позиции %1 найден символ %2 (код %3)",

      Нарушение.Позиция, Нарушение.Символ, Нарушение.Код));

      КонецЦикла;

      💡

      Чтобы быстро протестировать функцию, вызовите её в консоли отладки (Ctrl+Alt+D) с любой строкой. Например: НайтиНедопустимыеСимволы("Тест“")

      3.2. Поиск по всем справочникам и документам

      Для массовой проверки данных в базе используйте этот универсальный код:

      Процедура НайтиНедопустимыеСимволыВоВсехДанных()
      

      // Поиск по справочникам

      Для Каждого Спр Из Метаданные.Справочники Цикл

      Попытка

      Запрос = Новый Запрос;

      Запрос.Текст =

      "ВЫБРАТЬ

      | Ссылка КАК Ссылка,

      | Ссылка.Наименование КАК Наименование

      |ИЗ

      | Справочник." + Спр.Имя + " КАК Ссылка

      |ГДЕ

      | НЕ Ссылка.ПометкаУдаления";

      РезультатЗапроса = Запрос.Выполнить();

      Пока РезультатЗапроса.Следующий() Цикл

      Нарушения = НайтиНедопустимыеСимволы(РезультатЗапроса.Наименование);

      Если Нарушения.Количество() > 0 Тогда

      Сообщить(СтрШаблон("Справочник %1, элемент %2: найдены символы %3",

      Спр.Синоним, РезультатЗапроса.Ссылка, Нарушения.Количество()));

      КонецЕсли;

      КонецЦикла;

      Исключение

      Сообщить(ОписаниеОшибки());

      КонецПопытки;

      КонецЦикла;

      // Аналогично для документов (упрощённо)

      Для Каждого Док Из Метаданные.Документы Цикл

      Попытка

      Запрос = Новый Запрос;

      Запрос.Текст =

      "ВЫБРАТЬ ПЕРВЫЕ 100

      | Ссылка КАК Ссылка,

      | Ссылка.Номер КАК Номер

      |ИЗ

      | Документ." + Док.Имя + " КАК Ссылка";

      РезультатЗапроса = Запрос.Выполнить();

      // ... (аналогичная обработка)

      Исключение

      Сообщить(ОписаниеОшибки());

      КонецПопытки;

      КонецЦикла;

      КонецПроцедуры

      ⚠️ Внимание: Этот код может долго выполняться на больших базах! Для ускорения:

      • 🔹 Ограничьте выборку (например, ПЕРВЫЕ 1000)
      • 🔹 Запускайте проверку в фоновом задании (ФоновыеЗадания.Выполнить())
      • 🔹 Проверяйте только актуальные справочники (Номенклатура, Контрагенты, Договоры)

      4. Автоматизированные инструменты для поиска

      Если ручные методы не помогают или база слишком большая, используйте специализированные инструменты:

      4.1. Обработка «Поиск недопустимых символов»

      Готовые обработки можно найти на:

      • 🔹 Инфостарт (поиск по запросу «недопустимые символы»)
      • 🔹 Портал ИТС (раздел «Обработки»)
      • 🔹 GitHub (репозитории с тегом 1C)

      Популярные обработки:

      • 🔹 «Поиск и замена непечатаемых символов» — ищет символы с кодами 0–31 и 127
      • 🔹 «Чистка данных перед обменом» — удаляет BOM, неразрывные пробелы, «умные» кавычки
      • 🔹 «Анализ строк на Unicode-символы» — показывает все символы с кодами > 127

      4.2. Внешние утилиты

      Для анализа выгруженных данных:

      • 🔹 Notepad++ с плагином Hex-Editor — показывает байтовый код символов
      • 🔹 Sublime Text с пакетом HexViewer
      • 🔹 Python-скрипты с библиотекой chardet для определения кодировки

      Пример Python-кода для анализа файла:

      import chardet
      
      

      with open('выгрузка_из_1с.txt', 'rb') as f:

      result = chardet.detect(f.read())

      print(f"Кодировка: {result['encoding']}, Достоверность: {result['confidence']}")

      💡

      Для массовой очистки данных используйте комбинацию: обработка в 1С → выгрузка в CSV → очистка во внешнем редакторе → загрузка обратно.

      5. Типичные источники недопустимых символов

      Знание источников проблемы помогает предотвратить её повторение. Вот основные «поставщики» мусорных символов:

      Источник Типичные символы Как предотвратить
      Microsoft Word Неразрывные пробелы (U+00A0), «умные» кавычки (U+201C/U+201D), длинное тире (U+2014) Настройте Word: Файл → Параметры → Правописание → Параметры автозамены → Отключить "прямые" кавычки на "парные"
      Excel Символы 0–31 (особенно TAB, LF), непечатаемые символы из CSV Используйте Чист() и ПЕЧСИМВ() перед копированием в 1С
      Веб-страницы HTML-сущности (&nbsp;, &quot;), символы Юникода (€, ©, ®) Копируйте текст через Блокнот (он удаляет форматирование)
      PDF-файлы Символы переноса (U+2028), «мягкие» дефисы (U+00AD) Используйте специализированные PDF-ридеры с функцией «Копировать без форматирования»
      1С:Обмен данными BOM (U+FEFF), неверные разделители в CSV Настройте шаблоны обмена с явным указанием кодировки UTF-8 без BOM

      ⚠️ Внимание: При импорте данных из Excel через ЗагрузкаДанныхИзТабличногоДокумента() символы TAB (9) и LF (10) могут автоматически заменяться на пробелы. Это маскирует проблему, но не решает её для последующих обменов!

      Как проверить настройки автозамены в Word

      1. Откройте Word → Файл → Параметры → Правописание.

      2. Нажмите «Параметры автозамены».

      3. На вкладке «Автоформат при вводе» снимите галочки:

      - ["прямые" кавычки на "парные"]

      - [дефисы (--) на длинное тире (—)]

      - [интервалы на неразрывные пробелы]

      Это предотвратит автоматическую подмену символов при вводе.

      6. Как очистить данные от недопустимых символов

      Найти проблему — половина дела. Теперь нужно её устранить. Вот проверенные методы:

      6.1. Замена вручную через 1С

      Для единичных исправлений:

      // Замена неразрывных пробелов на обычные
      

      Запрос = Новый Запрос;

      Запрос.Текст =

      "ВЫБРАТЬ

      | Ссылка КАК Ссылка

      |ИЗ

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

      |ГДЕ

      | НЕ Ссылка.ПометкаУдаления

      | И НЕ Ссылка.ЭтоГруппа

      | И ВРЕГ(Ссылка.Наименование) ПОДОБНО '%" + Символ(160) + "%'";

      Результат = Запрос.Выполнить();

      Пока Результат.Следующий() Цикл

      Элемент = Результат.Ссылка.ПолучитьОбъект();

      Элемент.Наименование = СтрЗаменить(Элемент.Наименование, Символ(160), " ");

      Элемент.Записать();

      КонецЦикла;

      6.2. Массовая очистка через обработку

      Для больших объёмов данных используйте обработку с таким кодом:

      Процедура ОчиститьСтроку(Знач Строка) Экспорт
      

      // Удаляем управляющие символы (кроме TAB, LF, CR)

      Строка = СтрЗаменить(Строка, Символ(160), " "); // Неразрывный пробел

      Строка = СтрЗаменить(Строка, Символ(8220), """); // Левая кавычка

      Строка = СтрЗаменить(Строка, Символ(8221), """); // Правая кавычка

      Строка = СтрЗаменить(Строка, Символ(8216), "'"); // Левая одинарная кавычка

      Строка = СтрЗаменить(Строка, Символ(8217), "'"); // Правая одинарная кавычка

      // Удаляем все символы с кодами 0-8, 11-12, 14-31

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

      Для Индекс = 1 По СтрДлина(Строка) Цикл

      ТекущийСимвол = Сред(Строка, Индекс, 1);

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

      Если НЕ ((Код >= 0 И Код <= 8) ИЛИ (Код >= 11 И Код <= 12) ИЛИ (Код >= 14 И Код <= 31)) Тогда

      Результат = Результат + ТекущийСимвол;

      КонецЕсли;

      КонецЦикла;

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

      КонецПроцедуры

      Пример использования для справочника:

      Запрос = Новый Запрос;
      

      Запрос.Текст =

      "ВЫБРАТЬ

      | Ссылка КАК Ссылка

      |ИЗ

      | Справочник.Контрагенты КАК Ссылка

      |ГДЕ

      | НЕ Ссылка.ПометкаУдаления";

      Результат = Запрос.Выполнить();

      Пока Результат.Следующий() Цикл

      Объект = Результат.Ссылка.ПолучитьОбъект();

      Объект.Наименование = ОчиститьСтроку(Объект.Наименование);

      Объект.Комментарий = ОчиститьСтроку(Объект.Комментарий);

      Объект.Записать();

      КонецЦикла;

      6.3. Очистка при обмене данными

      Чтобы предотвратить попадание мусора при обмене, добавьте обработку строк в модуль обмена:

      Функция ПодготовитьСтрокуДляОбмена(Знач Строка)
      

      // Удаляем BOM (если есть)

      Если НЕ ПустаяСтрока(Строка) И КодСимвола(Лев(Строка, 1)) = 65279 Тогда

      Строка = Сред(Строка, 2);

      КонецЕсли;

      // Очищаем от недопустимых символов

      Строка = ОчиститьСтроку(Строка);

      Возврат Строка;

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

      💡

      Всегда делайте резервную копию базы перед массовой очисткой данных! Используйте ВыгрузитьДанные() или стандартный бэкап 1С.

      7. Профилактика появления недопустимых символов

      Лучше предотвратить проблему, чем бороться с последствиями. Вот проверенные методы:

      • 🔹 Настройте шаблоны обмена: явное указание кодировки UTF-8 без BOM в параметрах выгрузки/загрузки.
      • 🔹 Используйте обработки-посредники: все данные из внешних источников должны проходить через функцию очистки (см. раздел 6.3).
      • 🔹 Обучение пользователей: запретите копирование данных напрямую из Word/PDF. Вместо этого:
        1. Вставляйте текст в Блокнот (удалит форматирование).
        2. Используйте Ctrl+Shift+V (вставка без форматирования) там, где это поддерживается.
      • 🔹 Контроль ввода: добавьте в формы элементов проверку на недопустимые символы при записи:
        Процедура ПередЗаписью(Отказ)
        

        Если НайтиНедопустимыеСимволы(Объект.Наименование).Количество() > 0 Тогда

        Сообщить("Наименование содержит недопустимые символы!");

        Отказ = Истина;

        КонецЕсли;

        КонецПроцедуры

      • 🔹 Регулярные проверки: запускайте скрипт поиска недопустимых символов (раздел 3.2) раз в квартал.

    ⚠️ Внимание: При настройке обмена с банками (например, выгрузка платежек в формате 1С:Банк-Клиент) требования к символам могут быть жёстче, чем в самой 1С. Всегда уточняйте технические требования к файлам обмена у партнёра!

    FAQ: Частые вопросы по недопустимым символам в 1С

    Как найти символ с кодом 0 (NUL) в 1С? Он не отображается даже в отладчике!

    Символ NUL (0) обрывает строку в большинстве инструментов. Чтобы его обнаружить:

    1. Экспортируйте данные в двоичный файл и анализируйте hex-редактором (например, HxD).
    2. Используйте функцию из раздела 3.1 — она специально обрабатывает символы 0–31.
    3. В крайнем случае напишите обработку, которая проверяет длину строки в байтах vs. в символах:
      Если СтрДлина(Строка) <> БайтДлина(Строка, "UTF-8") Тогда
      

      // В строке есть непечатаемые символы

    При выгрузке в XML появляется ошибка "Неверный символ в позиции X". Как найти проблемное место?

    Алгоритм поиска:

    1. Откройте XML-файл в <