При организации обмена данными между устаревшими версиями 1С:Предприятия 7.7 и современными конфигурациями на платформе 1С:Предприятие 8.3 часто используется промежуточный формат файлов DBF (таблицы dBase). Однако при таком обмене разработчики нередко сталкиваются с ситуацией, когда русскоязычный текст превращается в нечитаемый набор символов (так называемые кракозябры). Разберем причины возникновения этой ошибки и выясним, как правильно настроить программный код и операционную систему для корректного чтения данных.
Проанализируем, почему возникает нарушение отображения символов. Платформа 1С 7.7 является неюникодным приложением (non-Unicode) и использует встроенный движок CodeBase для работы с таблицами DBF. При формировании и чтении таких файлов кодировка жестко завязана на системную кодовую страницу операционной системы Windows.
Основные факторы, приводящие к ошибкам кодировки:
USR1CV8), чьи региональные параметры могут отличаться от параметров интерактивного пользователя.Разберем, как правильно управлять кодировкой на уровне встроенного языка обеих платформ.
В 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;
// Обработка полученных данных
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецЕсли;
Если программное указание кодовой страницы не решает проблему, значит, внутренний механизм перекодировки упирается в системную локаль операционной системы Windows Server. Выполним настройку по шагам:
Если ограничения форматов DBF создают регулярные проблемы в работе распределенных систем, рассмотрим более надежные альтернативные варианты:
COMОбъект("V77.Application"). Вся передача строковых данных в этом случае происходит через стандартный маршалинг 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.