Разработка и Конфигурация · 10 мин
Как узнать кодировку файла в 1С
Как определить кодировку текстового файла при работе в 1С: чтение через ЧтениеТекста, признаки UTF-8, ANSI и UTF-16, обработка ошибок и перекодирование данных.
При обмене данными 1С регулярно сталкивается с текстовыми файлами, созданными в других системах: выгрузки из банков, прайсы поставщиков, файлы обмена с сайтами. Если кодировка определена неверно, вместо русского текста появляются «кракозябры» — и загруженные данные становятся бесполезными или, что хуже, частично испорченными.
Универсальной функции «определить кодировку» во встроенном языке 1С нет. Платформа требует, чтобы разработчик сам указал кодировку при чтении файла, либо полагался на автоопределение, которое работает не всегда. Поэтому задача решается комбинацией приёмов: анализ служебных маркеров в начале файла, пробное чтение и проверка результата.
Ниже разобраны рабочие способы: от чтения BOM-маркера до программного перебора кодировок с контролем результата. Материал применим к платформе 1С:Предприятие 8.3 и большинству типовых и самописных конфигураций.
Что такое кодировка и почему 1С не определяет её сама
Кодировка — это правило, по которому байты файла превращаются в символы. Один и тот же набор байт в кодировке Windows-1251 даст русский текст, а в UTF-8 или KOI8-R — бессмысленный набор знаков. Сам файл, как правило, не хранит имя своей кодировки; исключение — служебный маркер BOM в начале некоторых файлов.
Объект ЧтениеТекста умеет автоматически распознавать кодировку только по BOM. Если маркера нет, платформа использует кодировку по умолчанию (обычно UTF-8), и текст в ANSI (Windows-1251) прочитается с ошибками. Поэтому надёжная схема всегда включает явную проверку.
Способ 1. Определение кодировки по маркеру BOM
Самый надёжный программный способ — прочитать первые байты файла как двоичные данные и сравнить их с известными сигнатурами. Для этого используется объект ДвоичныеДанные или потоковое чтение.
Функция ОпределитьКодировкуПоBOM(ИмяФайла)
ДД = Новый ДвоичныеДанные(ИмяФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
Буфер = Новый БуферДвоичныхДанных(3);
Поток.Прочитать(Буфер, 0, 3);
Поток.Закрыть();
Байт1 = Буфер.ПрочитатьЦелое8(0);
Байт2 = Буфер.ПрочитатьЦелое8(1);
Байт3 = Буфер.ПрочитатьЦелое8(2);
Если Байт1 = 239 И Байт2 = 187 И Байт3 = 191 Тогда
Возврат "UTF-8 с BOM";
ИначеЕсли Байт1 = 255 И Байт2 = 254 Тогда
Возврат "UTF-16 LE";
ИначеЕсли Байт1 = 254 И Байт2 = 255 Тогда
Возврат "UTF-16 BE";
Иначе
Возврат "BOM отсутствует — нужна проверка чтением";
КонецЕсли;
КонецФункции
Если функция вернула «BOM отсутствует», файл, скорее всего, в UTF-8 без BOM или в однобайтовой кодировке (Windows-1251, KOI8-R, DOS/866). Различить их по первым байтам невозможно — переходите к пробному чтению.
Способ 2. Пробное чтение через ЧтениеТекста
Практический приём: открыть файл дважды — в UTF-8 и в Windows-1251 — и оценить, какой вариант дал осмысленный текст. Для оценки используют простые эвристики: наличие русских букв, отсутствие характерных «мусорных» символов.
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Чтение.Закрыть();
Если СтрНайти(Строка, "Р") > 0 Или СтрНайти(Строка, "�") > 0 Тогда
// UTF-8 не подошла — пробуем ANSI
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.ANSI);
КонецЕсли;
Признак неудачного чтения UTF-8 — символ замены «�» (U+FFFD) или типичные сочетания вида «РџСЂРёРІРµС‚». Признак того, что ANSI-файл прочитали как UTF-8, — как раз такие последовательности. Обратная ситуация (UTF-8 прочитан как ANSI) даёт «РїСЂРёРІРµС‚» из букв «Р» и «С».
Читайте файл с КодировкаТекста.UTF8
Читайте с КодировкаТекста.ANSI
Проверьте DOS-кодировку (OEM, 866)
Используйте КодировкаТекста.UTF16
Способ 3. Определение кодировки внешними инструментами до загрузки
Если файл нужно разобрать один раз, программировать ничего не требуется. Откройте файл в редакторе, который показывает кодировку: Notepad++, Visual Studio Code или аналогичный. В строке состояния такие редакторы отображают текущую кодировку и позволяют пересохранить файл в нужной.
Этот способ удобен при разовой загрузке: узнали кодировку, пересохранили файл в UTF-8 и загрузили стандартной обработкой. Для регулярного обмена ручная операция не подходит — нужен программный механизм из предыдущих разделов.
Какие значения принимает КодировкаТекста в 1С
Системное перечисление КодировкаТекста содержит предопределённые значения, которыми покрываются практически все встречающиеся ситуации. Кроме того, конструктор ЧтениеТекста и ЗаписьТекста принимает строковое имя кодировки, поддерживаемой операционной системой (например, "windows-1251", "koi8-r", "cp866").
| Значение | Когда применять | Особенности |
|---|---|---|
| UTF8 | Файлы из веб-систем, Linux, современных обменов | Может быть с BOM и без |
| UTF16 | Выгрузки некоторых Windows-программ | Почти всегда с BOM |
| ANSI | Старые Windows-программы, банк-клиенты | Зависит от региональных настроек ОС |
| OEM | Файлы эпохи DOS, некоторые кассовые выгрузки | Обычно cp866 |
| Строковое имя | Экзотика: koi8-r, iso-8859-5 | Зависит от поддержки ОС |
Учтите: ANSI и OEM привязаны к региональным настройкам сервера, где выполняется код. На сервере с английской локалью ANSI может не совпасть с Windows-1251, и русский текст прочитается неверно. В таких случаях надёжнее указывать строковое имя "windows-1251" явно.
Универсальный алгоритм определения кодировки
Для автоматической обработки файлов из разных источников удобно собрать последовательность проверок в одну процедуру. Логика такая: сначала BOM, затем пробное чтение UTF-8 с поиском «мусора», затем ANSI как вариант по умолчанию для старых систем.
- 1Прочитайте первые 3 байта файла и сравните с сигнатурами BOM
- 2Если BOM найден — используйте соответствующую кодировку UTF
- 3Если BOM нет — прочитайте первые строки как UTF-8 и проверьте на символы замены и «Р»-последовательности
- 4Если UTF-8 не подошёл — прочитайте как windows-1251 и проверьте наличие читаемой кириллицы
- 5Если текст всё равно нечитаем — проверьте cp866 и koi8-r
- 6Перед полной загрузкой выведите пользователю фрагмент текста для визуального контроля
Такой каскад покрывает подавляющее большинство реальных файлов. Эвристика не даёт стопроцентной гарантии: короткий файл только с латиницей и цифрами одинаково читается в любой кодировке, и это нормально — для такого содержимого выбор кодировки не влияет на результат.
Если файл приходит регулярно от одного и того же контрагента или системы, не определяйте кодировку каждый раз — зафиксируйте её в настройках обмена один раз после проверки. Автоопределение оставьте как запасной вариант для новых источников.
Перекодирование файла после определения
Когда кодировка известна, файл часто нужно привести к виду, который ожидает дальнейшая обработка, — обычно к UTF-8. Для этого файл читается в исходной кодировке и записывается заново в целевой.
Чтение = Новый ЧтениеТекста(ИмяФайла, "windows-1251");
Текст = Чтение.Прочитать();
Чтение.Закрыть();
Запись = Новый ЗаписьТекста(ИмяФайла + ".utf8", КодировкаТекста.UTF8);
Запись.Записать(Текст);
Запись.Закрыть();
Работайте с копией файла, а не с оригиналом: если в процессе выбрана неверная исходная кодировка, перезаписанный файл восстановить будет неоткуда. Оригиналы выгрузок от банков и контрагентов сохраняйте до подтверждения корректной загрузки.
Проверка результата и частые вопросы
Итоговый критерий правильности прост: русский текст читается, спецсимволы и переносы строк на месте, структура файла (разделители, заголовки колонок) соответствует ожиданиям формата. Если хотя бы часть строк содержит «кракозябры», кодировка определена неверно либо файл повреждён при передаче.
Как проверить результат
Осмысленные русские слова
«РџСЂРёРІРµС‚», «�» или пустые места
Колонки и разделители на месте
Лишние пустые строки, съехавшие колонки
Сопоставима с размером файла
Текст вдвое короче или длиннее — возможен UTF-16, прочитанный неверно
Может ли 1С сама определить кодировку без программирования?
Только частично. ЧтениеТекста распознаёт кодировку по BOM-маркеру. Если маркера нет, платформа применяет кодировку по умолчанию, и гарантии корректного чтения нет — нужна проверка вручную или программная эвристика.
Чем отличается UTF-8 с BOM от UTF-8 без BOM?
Содержимое текста идентично, разница только в трёх служебных байтах в начале файла. BOM упрощает автоопределение, но некоторые системы (особенно старые парсеры CSV и XML) воспринимают его как лишний символ в данных.
Файл от банка читается «кракозябрами» во всех кодировках. Что делать?
Проверьте cp866 (OEM) — старые банк-клиенты часто выгружают в DOS-кодировке. Если и она не помогла, файл мог быть повреждён при передаче или уже перекодирован дважды. Запросите выгрузку повторно и сравните первые байты.
Как узнать кодировку XML-файла?
У XML кодировка обычно указана в первой строке: атрибут encoding в объявлении <?xml version="1.0" encoding="windows-1251"?>. Прочитайте первую строку как есть и посмотрите это значение — оно имеет приоритет над эвристиками.
Почему на клиенте файл читается нормально, а на сервере — нет?
Кодировки ANSI и OEM зависят от региональных настроек операционной системы. Если сервер работает под Linux или с английской локалью, замените ANSI на явное строковое имя, например "windows-1251", — тогда результат будет одинаковым везде.
Можно ли определить кодировку файла со стопроцентной точностью?
Нет. BOM даёт точный ответ только для Unicode-файлов с маркером. Для файлов без BOM любой метод — эвристика: она надёжна на файлах с достаточным объёмом кириллицы, но принципиально может ошибаться. Поэтому финальный визуальный контроль фрагмента текста остаётся обязательным шагом.
Что важно запомнить
Кодировку файла в 1С определяют по BOM-маркеру или пробным чтением с проверкой кириллицы. Не полагайтесь на автоопределение без BOM, указывайте кодировку явно, работайте с копией файла и проверяйте фрагмент текста перед полной загрузкой.