Работа с данными в 1С:Предприятие часто сталкивается с проблемой недопустимых символов — скрытых знаков, которые ломают обмены, выгрузки в XML/JSON или приводят к ошибкам при загрузке в внешние системы. Эти символы могут попадать в базу через копипаст из Word, Excel, веб-страниц или даже при ручном вводе с клавиатуры (например, «кавычки-ёлочки» вместо стандартных). В отличие от очевидных опечаток, недопустимые символы зачастую невидимы в интерфейсе 1С, но вызывают критическую ошибку Неверный символ в позиции X или Ошибка при чтении потока.
Эта статья поможет как программистам 1С, так и обычным пользователям найти и устранить проблемные символы. Мы рассмотрим:
- 🔍 Какие символы считаются недопустимыми в разных контекстах (XML, JSON, текстовые файлы, SQL-запросы)
- 🛠 Ручные методы поиска без программирования (для бухгалтеров и менеджеров)
- 💻 Автоматизированные скрипты на встроенном языке 1С и внешние инструменты
- ⚡ Типичные источники появления «мусорных» символов и как их предотвратить
Особое внимание уделим символам с кодами 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. Однако в корпоративных системах часто блокируются внешние ресурсы — поэтому далее мы рассмотрим методы поиска прямо в 1С.
2. Ручной поиск недопустимых символов (без программирования)
Если вы не программист, но нужно срочно найти «мусор» в данных, воспользуйтесь этими методами:
2.1. Поиск по шаблону в справочниках и документах
Многие недопустимые символы можно обнаружить через стандартный поиск в 1С:
- Откройте справочник или журнал документов (например,
Справочники → Номенклатура). - Нажмите
Ctrl+F(поиск) и введите в поле поиска:- 🔹 Для неразрывного пробела: вставьте символ из буфера (скопируйте его из Word:
Ctrl+Shift+Пробел) - 🔹 Для «умных» кавычек: скопируйте из этого текста:
“ ” ‘ ’ - 🔹 Для символов 0–31: используйте
Символ(9)(TAB) илиСимвол(10)(LF)
- 🔹 Для неразрывного пробела: вставьте символ из буфера (скопируйте его из Word:
%“% для кавычек).Скопировать проблемный символ из внешнего источника
Вставить его в поле поиска 1С (Ctrl+F)
Использовать подстановочные знаки (%_)
Проверить наиболее «рискованные» справочники (Номенклатура, Контрагенты, Договоры)
Экспортировать данные в Excel и использовать функцию =КОДСИМВ()-->
2.2. Экспорт в Excel и анализ функцией КОДСИМВ()
Этот метод подходит для массовой проверки:
- Выгрузите данные в Excel через
Файл → Сохранить как… → Таблица Excel (*.xlsx). - В соседнем столбце используйте формулу:
=КОДСИМВ(ЛЕВСИМВ(A1;1))где
A1— ячейка с вашим текстом. - Протяните формулу на все строки. Коды 0–31, 127, 160 (U+00A0) — потенциально опасные.
- Для проверки всех символов в ячейке используйте:
=МАКС(ЕСЛИОШИБКА(КОДСИМВ(ПСТР(A1;СТРОКА($1:$100);1));0))(вводится как формула массива
Ctrl+Shift+Enter). - 🔹 Ограничьте выборку (например,
ПЕРВЫЕ 1000) - 🔹 Запускайте проверку в фоновом задании (
ФоновыеЗадания.Выполнить()) - 🔹 Проверяйте только актуальные справочники (Номенклатура, Контрагенты, Договоры)
- 🔹 Инфостарт (поиск по запросу «недопустимые символы»)
- 🔹 Портал ИТС (раздел «Обработки»)
- 🔹 GitHub (репозитории с тегом
1C) - 🔹 «Поиск и замена непечатаемых символов» — ищет символы с кодами 0–31 и 127
- 🔹 «Чистка данных перед обменом» — удаляет BOM, неразрывные пробелы, «умные» кавычки
- 🔹 «Анализ строк на Unicode-символы» — показывает все символы с кодами > 127
- 🔹 Notepad++ с плагином Hex-Editor — показывает байтовый код символов
- 🔹 Sublime Text с пакетом HexViewer
- 🔹 Python-скрипты с библиотекой
chardetдля определения кодировки - 🔹 Настройте шаблоны обмена: явное указание кодировки
UTF-8 без BOMв параметрах выгрузки/загрузки. - 🔹 Используйте обработки-посредники: все данные из внешних источников должны проходить через функцию очистки (см. раздел 6.3).
- 🔹 Обучение пользователей: запретите копирование данных напрямую из Word/PDF. Вместо этого:
- Вставляйте текст в Блокнот (удалит форматирование).
- Используйте
Ctrl+Shift+V(вставка без форматирования) там, где это поддерживается.
- 🔹 Контроль ввода: добавьте в формы элементов проверку на недопустимые символы при записи:
Процедура ПередЗаписью(Отказ)Если НайтиНедопустимыеСимволы(Объект.Наименование).Количество() > 0 Тогда
Сообщить("Наименование содержит недопустимые символы!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
- 🔹 Регулярные проверки: запускайте скрипт поиска недопустимых символов (раздел 3.2) раз в квартал.
⚠️ Внимание: Excel может автоматически заменять некоторые символы при открытии файла (например, «умные» кавычки на стандартные). Чтобы избежать этого, открывайте CSV-файлы через Блокнот или используйте LibreOffice Calc с настройкой кодировки UTF-8.
3. Поиск недопустимых символов с помощью встроенного языка 1С
Для программистов 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
| Ссылка КАК Ссылка,
| Ссылка.Номер КАК Номер
|ИЗ
| Документ." + Док.Имя + " КАК Ссылка";
РезультатЗапроса = Запрос.Выполнить();
// ... (аналогичная обработка)
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
⚠️ Внимание: Этот код может долго выполняться на больших базах! Для ускорения:
4. Автоматизированные инструменты для поиска
Если ручные методы не помогают или база слишком большая, используйте специализированные инструменты:
4.1. Обработка «Поиск недопустимых символов»
Готовые обработки можно найти на:
Популярные обработки:
4.2. Внешние утилиты
Для анализа выгруженных данных:
Пример 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-сущности ( , "), символы Юникода (€, ©, ®) | Копируйте текст через Блокнот (он удаляет форматирование) |
| 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. Профилактика появления недопустимых символов
Лучше предотвратить проблему, чем бороться с последствиями. Вот проверенные методы:
⚠️ Внимание: При настройке обмена с банками (например, выгрузка платежек в формате 1С:Банк-Клиент) требования к символам могут быть жёстче, чем в самой 1С. Всегда уточняйте технические требования к файлам обмена у партнёра!
FAQ: Частые вопросы по недопустимым символам в 1С
Как найти символ с кодом 0 (NUL) в 1С? Он не отображается даже в отладчике!
Символ NUL (0) обрывает строку в большинстве инструментов. Чтобы его обнаружить:
- Экспортируйте данные в двоичный файл и анализируйте hex-редактором (например, HxD).
- Используйте функцию из раздела 3.1 — она специально обрабатывает символы 0–31.
- В крайнем случае напишите обработку, которая проверяет длину строки в байтах vs. в символах:
Если СтрДлина(Строка) <> БайтДлина(Строка, "UTF-8") Тогда// В строке есть непечатаемые символы
При выгрузке в XML появляется ошибка "Неверный символ в позиции X". Как найти проблемное место?
Алгоритм поиска:
- Откройте XML-файл в <