Как исправить некорректную кодировку кириллицы в DBF при переносе данных из 1С 7.7 в 1С 8.3?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При организации обмена данными между устаревшими версиями 1С:Предприятия 7.7 и современными конфигурациями на платформе 1С:Предприятие 8.3 часто используется промежуточный формат файлов DBF (таблицы dBase). Однако при таком обмене разработчики нередко сталкиваются с ситуацией, когда русскоязычный текст превращается в нечитаемый набор символов (так называемые кракозябры). Разберем причины возникновения этой ошибки и выясним, как правильно настроить программный код и операционную систему для корректного чтения данных.

Анализ механизма работы с DBF и причин сбоя кодировки

Проанализируем, почему возникает нарушение отображения символов. Платформа 1С 7.7 является неюникодным приложением (non-Unicode) и использует встроенный движок CodeBase для работы с таблицами DBF. При формировании и чтении таких файлов кодировка жестко завязана на системную кодовую страницу операционной системы Windows.

Основные факторы, приводящие к ошибкам кодировки:

  1. Несовпадение параметров кодовой страницы: файл выгружается в кодировке DOS (CP866), а считывается как Windows (CP1251), или наоборот.
  2. Англоязычная локаль операционной системы: если сервер или рабочая станция, где выполняется выгрузка в 7.7 или загрузка в 8.3, работает под управлением англоязычной ОС без явной настройки кодовой страницы для программ, не поддерживающих Юникод (System Locale), то драйвер перекодировки по умолчанию использует западноевропейские таблицы символов (CP1252/CP437 вместо CP1251/CP866).
  3. Контекст системной службы сервера 1С 8.3: если загрузка в 1С 8.3 выполняется на стороне сервера (в фоновом или регламентном задании), операция выполняется от имени системной учетной записи (например, USR1CV8), чьи региональные параметры могут отличаться от параметров интерактивного пользователя.

Способ 1. Корректная программная настройка кодовых страниц в 1С 7.7 и 1С 8.3

Разберем, как правильно управлять кодировкой на уровне встроенного языка обеих платформ.

В 1С 7.7 для объекта XBASE метод КодоваяСтраница() принимает числовой параметр: 0 — кодировка Windows (ANSI/CP1251), 1 — кодировка DOS (OEM/CP866). Рекомендуется явно выгружать данные в кодировке Windows (0), чтобы избежать лишних преобразований символов.

Посмотрим на пример правильного формирования файла выгрузки в 1С 7.7:


Процедура ВыгрузитьНоменклатуру()
    ДБФ = СоздатьОбъект("XBASE");
    // Устанавливаем кодировку Windows (ANSI)
    ДБФ.КодоваяСтраница(0);
    
    // Проектируем структуру полей таблицы
    ДБФ.ДобавитьПоле("INN", "S", 50, 0);
    ДБФ.ДобавитьПоле("ISGROUP", "S", 5, 0);
    ДБФ.ДобавитьПоле("CODE", "S", 30, 0);
    ДБФ.ДобавитьПоле("NAME", "S", 100, 0);
    ДБФ.ДобавитьПоле("EDIZM", "S", 30, 0);
    ДБФ.ДобавитьПоле("TYPE", "S", 30, 0);
    
    // Создаем файл на диске
    ДБФ.СоздатьФайл(КаталогСохранения + "\Tovar.dbf");
    
    Выборка = СоздатьОбъект("Справочник.Номенклатура");
    Выборка.ВыбратьЭлементы();
    Пока Выборка.ПолучитьЭлемент() = 1 Цикл
        ДБФ.Добавить();
        ДБФ.INN = Константа.ИННОрганизации;
        ДБФ.CODE = Выборка.Код;
        ДБФ.NAME = Выборка.Наименование;
        ДБФ.EDIZM = Строка(Выборка.ЕдиницаИзмерения);
        ДБФ.TYPE = Строка(Выборка.ТипНоменклатуры);
        ДБФ.ISGROUP = Выборка.ЭтоГруппа();
        ДБФ.Записать();
    КонецЦикла;
    
    ДБФ.ЗакрытьФайл();
КонецПроцедуры

На стороне 1С 8.3 при чтении необходимо задать свойство Кодировка объекта XBase до момента вызова метода ОткрытьФайл():


ДБФ = Новый XBase;
// Указываем кодировку, соответствующую выгрузке (ANSI для Windows или OEM для DOS)
ДБФ.Кодировка = КодировкаXBase.ANSI;
ДБФ.ОткрытьФайл(ПутьКФайлу);

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

Способ 2. Настройка региональных стандартов и системной локали ОС Windows

Если программное указание кодовой страницы не решает проблему, значит, внутренний механизм перекодировки упирается в системную локаль операционной системы Windows Server. Выполним настройку по шагам:

  1. Откроем Панель управления (Control Panel) на сервере и перейдем в раздел Региональные стандарты (Region).
  2. Перейдем на вкладку Дополнительно (Administrative).
  3. В блоке Язык программ, не поддерживающих Юникод (Language for non-Unicode programs) нажмем кнопку Изменить язык системы (Change system locale) и выберем Русский (Россия).
  4. Важно: убедимся, что флажок «Бета-версия: Использовать Юникод (UTF-8) для поддержки языка во всем мире» (Beta: Use Unicode UTF-8 for worldwide language support) снят. Если этот флажок включен, неюникодные приложения (включая 1С 7.7) начинают некорректно обрабатывать однобайтовые таблицы CP1251 и CP866.
  5. Нажмем кнопку Копировать параметры (Copy settings) и установим оба флажка внизу окна, чтобы применить русскую локаль к системным учетным записям (экрану приветствия и службам Windows, включая службу сервера 1С 8.3).
  6. Выполним обязательную перезагрузку операционной системы.

Способ 3. Альтернативные способы переноса данных без DBF

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

  1. Прямое COM-подключение: чтение данных напрямую из базы 1С 7.7 в 1С 8.3 через объект COMОбъект("V77.Application"). Вся передача строковых данных в этом случае происходит через стандартный маршалинг COM без использования промежуточных дисковых файлов.
  2. Выгрузка в UTF-8 через ADODB.Stream: формирование текстового файла (CSV или JSON) в 1С 7.7 с помощью COM-объекта ADODB.Stream с явным указанием кодировки UTF-8. Такой файл считывается в 1С 8.3 стандартным объектом ЧтениеТекста с абсолютной гарантией сохранности любых символов.

Посмотрим на пример выгрузки через ADODB.Stream в 1С 7.7:


Поток = СоздатьОбъект("ADODB.Stream");
Поток.Type = 2; // adTypeText
Поток.Charset = "utf-8";
Поток.Open();

Выборка = СоздатьОбъект("Справочник.Номенклатура");
Выборка.ВыбратьЭлементы();
Пока Выборка.ПолучитьЭлемент() = 1 Цикл
    СтрокаCSV = Выборка.Код + ";" + Выборка.Наименование + Символы.CRLF;
    Поток.WriteText(СтрокаCSV);
КонецЦикла;

Поток.SaveToFile(КаталогСохранения + "\Tovar.csv", 2);
Поток.Close();

Применение правильной комбинации параметров КодоваяСтраница(0) / КодировкаXBase.ANSI и установка русской локали для неюникодных программ в Windows полностью устраняют искажения кодировки при обмене через файлы DBF.

← На главную