Неверно указана кодировка при чтении текстового документа в 1С — Решение
- Исключение:
Неверно указана кодировка при чтении текстового документа. - Чтение файла возвращает нечитаемые символы («кракозябры», , иероглифы).
- Сбой методов
ЧтениеТекста.Открыть(),ТекстовыйДокумент.Прочитать(). - Наличие скрытого маркера последовательности байтов (BOM — Byte Order Mark).
1. Корректное указание кодировки через объект ЧтениеТекста
Всегда явно задавайте стандартную кодировку при открытии файлового потока:
// Чтение файла в кодировке UTF-8 с автоматическим распознаванием BOM
Чтение = Новый ЧтениеТекста;
Попытка
Чтение.Открыть("C:\Data\import.csv", КодировкаТекста.UTF8, Символы.ПС, , Истина);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
// Обработка строки
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Исключение
ВызватьИсключение "Ошибка открытия файла: " + ОписаниеОшибки();
Фиксировать
Чтение.Закрыть();
КонецПопытки;2. Таблица сопоставления кодировок в 1С
| Кодировка в 1С | Имя / Стандарт | Применение |
|---|---|---|
КодировкаТекста.UTF8 | UTF-8 | Современные REST API, JSON, XML, веб-интеграции |
КодировкаТекста.ANSI | windows-1251 (CP1251) | Файлы выгрузки из 1С 7.7, старые банковские выписки |
КодировкаТекста.OEM | CP866 (DOS) | Файлы обмена систем Клиент-Банк формата 1CClientBankExchange |
КодировкаТекста.UTF16 | UTF-16LE / BE | Системные журналы Windows, выгрузки Active Directory |
3. Обработка файлов с неизвестной кодировкой через ДвоичныеДанные
// Определение кодировки по сигнатуре первых байт (BOM)
Двоичные = Новый ДвоичныеДанные("C:\Data\file.txt");
ЧтениеБайт = Новый ЧтениеДанных(Двоичные.ОткрытьПотокДляЧтения());
ПервыеБайты = ЧтениеБайт.Прочитать(3);
// Анализ BOM: EF BB BF -> UTF-8, FF FE -> UTF-16LE Частые вопросы (FAQ)
Что делать, если файл Клиент-Банка читается иероглифами?
Большинство выписок формата 1CClientBankExchange создаются в DOS-кодировке CP866. При чтении укажите КодировкаТекста.OEM или строку 'windows-1251'.
Как удалить BOM (Byte Order Mark) из начала файла при выгрузке?
При создании ЗаписьТекста используйте параметр ИспользоватьBOM = Ложь: Запись.Открыть(Путь, КодировкаТекста.UTF8, , , Ложь).
Почему кодировка ANSI по-разному работает на Windows и Linux серверах?
На Windows ANSI соответствует Windows-1251, а на Linux сервер 1С использует системную локаль (по умолчанию UTF-8). Всегда явно указывайте строку 'windows-1251' вместо перечисления ANSI.
Как прочитать текстовый файл в нестандартной кодировке (например, KOI8-R)?
Передайте строковое наименование кодировки вторым параметром метода Открыть(): Чтение.Открыть(Путь, 'koi8-r').