Корректировка заголовка DBF-файла, сформированного в 1С, для его связи с индексным файлом для дальнейшей работы с ним из внешних приложений (FoxPro 2.6, Visual FoxPro и пр.)

18.03.13

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Программный код, корректирующий заголовок DBF-файла, сформированного в 1С, для его связи с индексным файлом для далнейшей работы с ним из внешних приложений (FoxPro 2.6, Visual FoxPro и пр.)

Задача: необходимо передавать некоторую информацию из 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-файла и позволяет внешним приложениям увидеть и идущий в связке индексный файл.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    160480    967    317    

482

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 37800 руб.

15.12.2021    34084    257    64    

194

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    188092    357    289    

417

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    62699    82    132    

81

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Перенос данных из БП 2 в БП 3 готовые правила конвертации данных (КД 2), сэкономьте свое время! | Выполнить переход с БП 2 на БП 3 в ситуациях, когда простым обновлением перейти не получается | Переносится вся справочная информация, документы за выбранный период, а также начальные остатки на выбранную дату (то есть можно еще и свертку базы сделать при переносе) | Есть фильтр по организациям при выгрузке данных | Перенос можно проверить перед покупкой прямо на вашем сервере! Обращайтесь за проверкой!

50600 руб.

21.05.2019    57901    80    131    

73

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    13380    15    8    

16

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

58000 руб.

15.04.2019    83908    224    175    

161
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. hogik 447 18.03.13 17:09 Сейчас в теме
(0)
Михаил (iRounder).
При использовании этого CDX файла другими "внешними приложениями" могут возникнуть проблемы с порядком сортировки вплоть до зацикливания функций "движения" по индексу при чтении. Про обновление такого индекса и говорить не хочется... ;-)
Т.е. рекомендуется создавать индексный файл средствами "внешнего приложения" заново, а не передавать готовый из 1С.
v.l.; Ёпрст; andrewks; +3 Ответить
2. andrewks 1383 18.03.13 17:18 Сейчас в теме
(1) hogik, полностью поддерживаю
3. iRounder 104 18.03.13 17:43 Сейчас в теме
(1) Вы пробовали так делать?

У меня подобных проблем не возникло.
Опишите, пжл, ситуацию когда вы столкнулись с подобной проблемой.
На какой платформе формировали таким образом индексный файл и каким "внешним приложением" с ним работали.
4. andrewks 1383 18.03.13 18:26 Сейчас в теме
(3) Вам же написали про подводные камни в ветке на мисте.
однако в публикации о них - ни слова
5. iRounder 104 18.03.13 19:14 Сейчас в теме
(4) О каких подводных камнях Вы говорите? Насколько я помню там просто было предположение, что создавать сам DBF-файл через ADO проще.

"Перечитал" мисту. Единственное, что подходит под определение "подводные камни": Тем более, что кроме заголовка там и сортировка не полностью совпадает (для экзотических знаков).

Никаких доводов или перечисления о каких экзотических символах речь не было. Что по Вашему я должен был быть указывать еще в публикации?
Ну, и если Вы заметили, публикация не в виде обработки, за которые я получаю $m, а просто "дележка" опытом. Кроме применения для замены байта в DBF эта методика показывает общий принцип работы с двоичными данными, когда нужно заменить часть файла.

Ну, и за любую критику благодарен. А если еще будут доводы или факты, которые подтвердят "глючность" метода, то я обязательно напишу об этом в описании публикации, а возможно и вообще ее закрою.
6. andrewks 1383 18.03.13 19:53 Сейчас в теме
(5) ни в коем разе не добиваюсь закрытия публикации. наоборот, нужно больше разных тайных знаний.

просто в данном случае, мне кажется, нельзя утверждать о полной совместимости индексного файла, созданного 1с, с любыми сторонними приложениями.
7. iRounder 104 18.03.13 20:02 Сейчас в теме
(6) Так поэтому ж я и прошу примеры. Потому как в моем случае все работает :)
8. hogik 447 18.03.13 20:59 Сейчас в теме
(3)
"Вы пробовали так делать?"(с)
Михаил (iRounder).
И пробовать не буду, т.к. имел "удовольствие" пялиться на исходные тексты и общаться с разработчиками. В том числе и по поводу "русификации" индексных файлов. Занимаясь вот этим: http://infostart.ru/public/14664/ И еще вот этим: http://infostart.ru/public/85748/
Вот, читайте с 31-ого сообщения тему: http://www.forum.mista.ru/topic.php?id=434036
А т.к. DBF-движки в 1С-продуктах сделаны на "платформе" ;-) разработчика
http://www.codebase.com/ ,то особенности индексов для "семерки" можно распространить и на "восьмерку".
9. iRounder 104 18.03.13 21:05 Сейчас в теме
(8) Найду время - попробую.
10. iRounder 104 19.03.13 15:19 Сейчас в теме
(8) Почитал. Создал пустой справочник. Заполнил его:
A lat
B lat
N lat
O lat
P lat
А рус
Б рус
В рус
№ рус
Показать


Дальше по описанной в публикации методике создал индексный файл и установил в DBF 28-й байт равным 1.

Открыл DBF-ку в Visual FoxPro.
Далее буду приводить команды выполненные из командного окна и полученные результаты:

SET INDEX TO start ORDER idxname
BROWSE LAST
----------------
A lat
B lat
N lat
O lat
P lat
№ рус
А рус
Б рус
В рус
Показать


SET FILTER TO UPPER(Name) > "Z"
BROWSE LAST
----------------
№ рус
А рус
Б рус
В рус



SET FILTER TO UPPER(Name) < "Z"
BROWSE LAST
----------------
A lat
B lat
N lat
O lat
P lat
Показать


Что не так с сортировкой или что я не так делаю?
11. hogik 447 19.03.13 20:04 Сейчас в теме
(10)
"... что я не так делаю?"(с)
Всё не так. :-)
Михаил (iRounder).
Даю текст на "семерке". Перепишите его на "восьмерку". Сделайте файлы.
Выполните в FoxPro команды:
USE d:\test.dbf NOUPDATE EXCLUSIVE
SET INDEX TO d:\test.cdx
SET ORDER TO NAME
BROWSE LAST
Делайте движение по списку стрелкой вниз.
Для проверки различий "семерка"/"восьмерка" прикрепил свои файлы в тему.
Отпишите о результатах. Обсудим ... ;-)


Перем DBF,Кат,Ном;   
	Кат="D:\";
	DBF=СоздатьОбъект("xBase"); 
	DBF.КодоваяСтраница(0);
	DBF.ДобавитьПоле("NAME","C",1,0);
	DBF.ДобавитьПоле("CODE","N",3,0); 
	DBF.ДобавитьИндекс("NAME","UPPER(NAME)",0,0,"");
	DBF.СоздатьФайл(Кат+"Test.dbf",Кат+"Test.cdx");   
	Для Ном=1 По 255 Цикл    
		DBF.Добавить();
		DBF.NAME=Симв(Ном);
		DBF.CODE=Ном;	   
	    DBF.Записать();
	КонецЦикла;
	DBF.ЗакрытьФайл();
Показать
Прикрепленные файлы:
Test.zip
12. iRounder 104 19.03.13 20:16 Сейчас в теме
Если Симв() в 7-ке это Символ() в 8-ке, то тогда не совсем корректный пример. Эти символы форма списка не отображает и выдает ошибку (я о тонком клиенте). Поэтому, по идее, эти символы в базе могут появиться только искусственно. Если можно - то более реальный контрольный пример?
13. hogik 447 19.03.13 20:23 Сейчас в теме
(12)
"эти символы в базе могут появиться только искусственно"(с)
Не возражаю. ;-)
Заполняйте DBF только отображаемыми символами.
14. iRounder 104 19.03.13 20:56 Сейчас в теме
(13) Приведите реальный пример появления этих символов в базе если их сама 1С не может отобразить?
Я ж не ради придраться - я хочу разобраться и благодарен за дискуссию.
15. hogik 447 19.03.13 21:58 Сейчас в теме
(14)
"я хочу разобраться "(с)
Михаил (iRounder).
А мы чем занимаемся? Спокойно разбираемся.
Вроде, уже написал в (13) сообщении. :-(
Организуйте цикл от пробела. Если есть символы в интервале от 0x20 до 0xFF которые не могут быть в "восьмерке", то поставьте условие-ограничение в цикле на их игнорирование.
16. hogik 447 19.03.13 23:07 Сейчас в теме
(14)
Михаил (iRounder).
Вот, сделал выгрузку DBF файла в формате SDF с использованием индекса.
Два варианта:
1) Сразу после создание в 1С-е.
2) После REINDEX в Visual FoxPro.
Можно глазами "отследить" большую разницу. ;-)
Понимаете. ;-) Если стоит задача только смотреть на файл в неком (логичном порядке) записей, то на различия можно не обращать внимание. А если требуется обрабатывать записи последовательным просмотром и/или поиском по ключу, то получим картину аналогичную примеру про запрос от Александра (orefkov). Т.е. приложение должно иметь возможность сравнивать байты в оперативной памяти аналогично порядку следования информации в индексе. Например, запрос от Александра получает последовательно в порядке индекса записи таблицы, а сравнение на "Z" применяется уже к полю самой таблицы. По индексу символ "№"<"Z", а по информации из поля "№">"Z". И запрос прекращает просмотр таблицы. Кроме этого само движение по индексу сУБД делает сравнением на основании таблицы, которая сидит в её кишках (разная для разных программ). Т.е. не во внешней таблице "связанной" с базой данных, а не программой. Как это сделано во взрослых СУБД.
Вот. Очень примерно - так...
Прикрепленные файлы:
Test.zip
17. iRounder 104 20.03.13 09:43 Сейчас в теме
(16) Спасибо. Буду пробовать разбираться.
18. Ленкина 17.05.13 11:44 Сейчас в теме
спасибо, возможно пригодится
Для отправки сообщения требуется регистрация/авторизация