Работа с форматом DBF в 1С:Предприятии часто сопровождается трудностями, связанными с кодировкой. Типичная ситуация: в специализированных программах (DBFViewer) данные отображаются корректно, а при открытии в Microsoft Excel вместо текста видны непонятные символы («крокозябры»). Это происходит из-за несоответствия фактической кодировки данных и метки в заголовке файла.
В этой статье мы подробно разберем, как управлять кодировками с помощью встроенного объекта 1С XBase, выясним разницу между форматами и научимся правильно подготавливать файлы для передачи внешним потребителям.
Прежде чем переходить к коду, проанализируем, какие стандарты используются в мире DBF:
Основная проблема заключается в том, что Excel при простом открытии файла двойным кликом часто пытается интерпретировать данные в кодировке Windows (ANSI), даже если файл записан в DOS (OEM). И наоборот, если файл не имеет четкого идентификатора языка в заголовке, софт может ошибиться с выбором кодировки.
Рассмотрим по шагам критически важный нюанс: свойство Кодировка объекта 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 (не задано), могут начаться проблемы с автоматическим определением.
Выгрузки из старых конфигураций на платформе 1С 7.7 почти всегда используют OEM-кодировку. При написании обработки загрузки в 1С 8.3 крайне важно явно указывать это при открытии. Проанализируем стандартный алгоритм чтения:
ПутьКФайлу = "C:\Import\from_77.dbf";
ФайлДБФ = Новый XBase;
// Явно указываем, что ожидаем DOS-кодировку
ФайлДБФ.Кодировка = КодировкаXBase.OEM;
ФайлДБФ.ОткрытьФайл(ПутьКФайлу);
Если НЕ ФайлДБФ.Открыта() Тогда
Предупреждение("Файл не найден или поврежден!");
Возврат;
КонецЕсли;
ФайлДБФ.Первая();
Пока НЕ ФайлДБФ.ВКонце() Цикл
// Чтение данных
ТекИмя = ФайлДБФ.NAME;
// Если кодировка указана верно, 1С сама преобразует текст в Unicode для внутреннего использования
Сообщить(ТекИмя);
ФайлДБФ.Следующая();
КонецЦикла;
ФайлДБФ.ЗакрытьФайл();
Даже если вы установили КодировкаXBase.OEM, клиент может жаловаться на некорректное отображение. Выясним основные причины:
Чтобы ваша обработка была профессиональной, предусмотрите на форме выбор кодировки для пользователя. Рассмотрим, как это реализовать через элементы формы:
В процедуре ПриОткрытии заполните список выбора для реквизита «Кодировка»:
ЭлементыФормы.КодировкаВыбора.СписокВыбора.Добавить(КодировкаXBase.ANSI, "Windows (ANSI)");
ЭлементыФормы.КодировкаВыбора.СписокВыбора.Добавить(КодировкаXBase.OEM, "DOS (OEM)");
// Установим значение по умолчанию
КодировкаВыбора = КодировкаXBase.OEM;
А при самой выгрузке используйте выбранное значение:
Файл = Новый XBase;
Файл.Кодировка = КодировкаВыбора; // Значение из формы
// Далее создание файла и запись полей...
Важный момент: Если вы столкнулись с файлом, который не читается ни в OEM, ни в ANSI (сообщения 18 и 20), возможно, данные в нем зашифрованы или используются нестандартные кодовые страницы (например, драйверы старых бухгалтерских систем типа «Эпсилон»). В таких редких случаях стандартный XBase может не справиться, и потребуется использование внешних компонент или прямое чтение файла как двоичных данных с ручной конвертацией байтов.