Задача: необходимо передавать некоторую информацию из 1С в DBF-формате включая индексный файл (.CDX) для дальнейшего ее использования в иных информационных подсистемах предприятия.
Проблема: ПО некоторых подсистем разработано на FoxPro 2.6 или Visual FoxPro. И как оказалось эти системы не видят индексного файла идущего в паре с DBF сформированным в 1С.
Решение: после анализа DBF-файла и изучения спецификации формата (например вот здесь: http://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm) была найдена причина, а именно то, что 1С не проставляет 28-й байт заголовка DBF-файла равным 1, что свидетельствовало бы о связке с индексным файлом.
После этого осталось лишь программно проставить целевой байт в нужное значение.
Для работы с байтами заголовка была выбрана компонента Microsoft ADODB.Stream (ссылка на описание компоненты http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms675032%28v=vs.85%29.aspx).
&НаСервере
Процедура Выгрузка()
//Создаем тестовый пример выгрузки данных в DBF с индексами на базе справочника "Номенклатура"
Путь = "E:\temp\";
БД = Новый XBase;
БД.Поля.Добавить("CODE", "S", 11);
БД.Поля.Добавить("NAME", "S", 40);
БД.СоздатьФайл(Путь + "start.dbf", Путь + "start.cdx");
БД.Индексы.Добавить("IDXCODE", "CODE");
БД.Индексы.Добавить("IDXNAME", "NAME");
ФлИБД = БД.СоздатьИндексныйФайл(Путь + "start.cdx");
Выборка = Справочники.Номенклатура.ВыбратьИерархически();
Пока Выборка.Следующий() Цикл
БД.Добавить();
БД.CODE = Выборка.Код;
БД.NAME = Выборка.Наименование;
БД.Записать();
КонецЦикла;
БД.ЗакрытьФайл();
//Читаем DBF-файл и корректируем 28-й байт
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Type = 1;
Поток.Mode = 3;
Поток.Open();
Поток.LoadFromFile(Путь + "start.dbf");
ДвоичнаяСтрока = Поток.Read(29);
ДвоичнаяСтрока.SetValue(28, 1);
Поток.Position = 0;
Поток.Write(ДвоичнаяСтрока);
Поток.SaveToFile(Путь + "start.dbf", 2);
Поток.Close();
КонецПроцедуры
Вот этот несложный код корректирует 28-й байт заголовка DBF-файла и позволяет внешним приложениям увидеть и идущий в связке индексный файл.