Как правильно настроить кодировку (ANSI/OEM) при работе с DBF-файлами в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Работа с форматом DBF в 1С:Предприятии часто сопровождается трудностями, связанными с кодировкой. Типичная ситуация: в специализированных программах (DBFViewer) данные отображаются корректно, а при открытии в Microsoft Excel вместо текста видны непонятные символы («крокозябры»). Это происходит из-за несоответствия фактической кодировки данных и метки в заголовке файла.

В этой статье мы подробно разберем, как управлять кодировками с помощью встроенного объекта 1С XBase, выясним разницу между форматами и научимся правильно подготавливать файлы для передачи внешним потребителям.

Понятие кодировок в формате DBF: ANSI vs OEM

Прежде чем переходить к коду, проанализируем, какие стандарты используются в мире DBF:

  1. OEM (Original Equipment Manufacturer) — это кодировка семейства DOS (для русского языка это CP866). Она исторически является основной для файлов формата dBase. Большинство старых систем и программ обмена данными ожидают именно её.
  2. ANSI (American National Standards Institute) — кодировка Windows (для русского языка — Windows-1251). Она стала применяться позже, с появлением визуальных систем управления базами данных.

Основная проблема заключается в том, что Excel при простом открытии файла двойным кликом часто пытается интерпретировать данные в кодировке Windows (ANSI), даже если файл записан в DOS (OEM). И наоборот, если файл не имеет четкого идентификатора языка в заголовке, софт может ошибиться с выбором кодировки.

Правильная последовательность создания файла DBF

Рассмотрим по шагам критически важный нюанс: свойство Кодировка объекта XBase должно быть установлено строго до вызова метода СоздатьФайл(). Если вы сначала создадите файл, а потом попытаетесь изменить кодировку, заголовок файла может сформироваться некорректно, что приведет к ошибкам чтения в стороннем ПО.

Разберем пример кода для создания файла в кодировке OEM (которая лучше всего подходит для Excel в большинстве случаев):


КаталогВыгрузки = "C:\Export\";
ФайлДБФ = Новый XBase;

// 1. Сначала определяем кодировку
ФайлДБФ.Кодировка = КодировкаXBase.OEM;

// 2. Определяем структуру полей
ФайлДБФ.Поля.Добавить("ID", "N", 10);
ФайлДБФ.Поля.Добавить("NAME", "S", 50);

// 3. Создаем файл на диске
ФайлДБФ.СоздатьФайл(КаталогВыгрузки + "data_oem.dbf");

// 4. Добавляем данные
ФайлДБФ.Добавить();
ФайлДБФ.ID = 1;
ФайлДБФ.NAME = "Пример текста в OEM";
ФайлДБФ.Записать();

ФайлДБФ.ЗакрытьФайл();

Как программно определить кодировку существующего файла

Если вам прислали файл и вы не знаете, как его правильно прочитать, можно воспользоваться возможностью 1С автоматически определять кодировку при открытии. Рассмотрим, как это сделать:


ФайлДБФ = Новый XBase;
// Открываем файл в режиме «только чтение» для проверки
Попытка
    ФайлДБФ.ОткрытьФайл(ПутьКФайлу, , Истина);
    Если ФайлДБФ.Открыта() Тогда
        Сообщить("Кодировка файла: " + ФайлДБФ.Кодировка);
    КонецЕсли;
    ФайлДБФ.ЗакрытьФайл();
Исключение
    Сообщить("Не удалось открыть файл: " + ОписаниеОшибки());
КонецПопытки;

Стоит отметить, что объект XBase при открытии считывает так называемый Language Driver ID (29-й байт заголовка DBF). Если этот байт равен 0x65, 1С определит кодировку как ANSI. Если 0x26 — как OEM. Если же там стоит 0x00 (не задано), могут начаться проблемы с автоматическим определением.

Особенности чтения данных из 7.7 в 8.x

Выгрузки из старых конфигураций на платформе 1С 7.7 почти всегда используют OEM-кодировку. При написании обработки загрузки в 1С 8.3 крайне важно явно указывать это при открытии. Проанализируем стандартный алгоритм чтения:


ПутьКФайлу = "C:\Import\from_77.dbf";
ФайлДБФ = Новый XBase;

// Явно указываем, что ожидаем DOS-кодировку
ФайлДБФ.Кодировка = КодировкаXBase.OEM;

ФайлДБФ.ОткрытьФайл(ПутьКФайлу);

Если НЕ ФайлДБФ.Открыта() Тогда
    Предупреждение("Файл не найден или поврежден!");
    Возврат;
КонецЕсли;

ФайлДБФ.Первая();
Пока НЕ ФайлДБФ.ВКонце() Цикл
    // Чтение данных
    ТекИмя = ФайлДБФ.NAME; 
    // Если кодировка указана верно, 1С сама преобразует текст в Unicode для внутреннего использования
    Сообщить(ТекИмя);
    ФайлДБФ.Следующая();
КонецЦикла;

ФайлДБФ.ЗакрытьФайл();

Почему Excel все равно показывает «крокозябры»?

Даже если вы установили КодировкаXBase.OEM, клиент может жаловаться на некорректное отображение. Выясним основные причины:

  1. Отсутствие метки в заголовке: Некоторые версии 1С или методы записи могут не прописывать идентификатор кодировки в 29-й байт заголовка. В этом случае Excel игнорирует содержимое и открывает файл в системной кодировке Windows.
  2. Версия Excel: Современные версии Excel (начиная с 2013) стали хуже поддерживать DBF. Рекомендуется научить пользователя открывать такие файлы не через «Файл -> Открыть», а через вкладку «Данные» -> «Из текста/CSV». Там можно вручную выбрать источник файла «866: Кириллица (DOS)» или «1251: Кириллица (Windows)».
  3. Поврежденный заголовок: Если файл был создан некорректно (например, прервана запись), заголовок может быть «битым». В сообщении 21 на форуме упоминается, что программы просмотра могут ругаться на повреждение структуры. В таком случае поможет только восстановление файла специальными утилитами (DBF Recovery).

Советы по разработке универсальных выгрузок

Чтобы ваша обработка была профессиональной, предусмотрите на форме выбор кодировки для пользователя. Рассмотрим, как это реализовать через элементы формы:

В процедуре ПриОткрытии заполните список выбора для реквизита «Кодировка»:


ЭлементыФормы.КодировкаВыбора.СписокВыбора.Добавить(КодировкаXBase.ANSI, "Windows (ANSI)");
ЭлементыФормы.КодировкаВыбора.СписокВыбора.Добавить(КодировкаXBase.OEM, "DOS (OEM)");
// Установим значение по умолчанию
КодировкаВыбора = КодировкаXBase.OEM;

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


Файл = Новый XBase;
Файл.Кодировка = КодировкаВыбора; // Значение из формы
// Далее создание файла и запись полей...

Важный момент: Если вы столкнулись с файлом, который не читается ни в OEM, ни в ANSI (сообщения 18 и 20), возможно, данные в нем зашифрованы или используются нестандартные кодовые страницы (например, драйверы старых бухгалтерских систем типа «Эпсилон»). В таких редких случаях стандартный XBase может не справиться, и потребуется использование внешних компонент или прямое чтение файла как двоичных данных с ручной конвертацией байтов.

← На главную