gifts2017

Конвертация файла ДБФ со строковыми полями длиной > 254 байт в обычный ДБФ

Опубликовал Алексей Бобылкин (alex_bob) в раздел Администрирование - Сервисные утилиты

В 1С 7.7 под ДБФ возможно хранение строковых реквизитов справочников и документов с длиной более 255 символов. Попробуйте открыть такой файл через, например в FoxPro и увидите кашу... Предлагаемая обработка решает только одну специфическую задачу - превращает такую таблицу в стандартный ДБФ-файл.

В 1С 7.7 под ДБФ возможно хранение строковых реквизитов справочников и документов с длиной более 255 символов. Я понял это случайно, пытаясь выбрать данные из такой таблицы прямым запросом через VFPOLEDB. Долго не мог понять, почему вместо результата получается каша...

Предлагаемая обработка решает только одну специфическую задачу - превращает такую таблицу в стандартный ДБФ-файл. При этом длинные строковые поля делятся на несколько более коротких с длиной менее 254 байт.

Также обработка может служить примером работы с бинарными файлами из 1С8 с использованием ADODB.Stream.

Обработка под версию 8.2!!

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Обработка конвертации ДБФ
.epf 10,32Kb
29.09.10
23
.epf 10,32Kb 23 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Аркадий Кучер (Abadonna) 29.09.10 20:03
Попробуйте открыть такой файл через объект XBase восьмерки и увидите кашу...

Попробовал.
Вот код на 7.7 для заполнения реквизита на 500 символов:
Процедура Сформировать()
Спр=СоздатьОбъект("Справочник.Тест");
Спр.НайтиПоКоду("1");
Стр="";
Для А=1 По 125 Цикл
Стр=Стр+"Test";
КонецЦикла;
Спр.Реквизит=Стр;
Спр.Записать();
КонецПроцедуры
А на картинке - результат на объекте XBase восьмерки
P.S. И листер cdbfview от Тотала - без базаров
P.P.S. Я даже догадываюсь, какие именно поля тебя смутили: которые имеют в 7.7 тип "неорганиченная длина", но это уже не строковые поля ;)
Прикрепленные файлы:
2. Алексей Бобылкин (alex_bob) 30.09.10 16:18
(1) Картинками не убедил. Реквизит на 500 символов в XBase восьмерки обрезается до 244 символов. На картинке видно меньше 200. Если после этого реквизита есть еще реквизиты, то в них то каша и начинается. Попробуй сделать длину 260 символов и потом еще 10 реквизитов по 10 символов.
Про Total ничего не могу сказать...
3. Аркадий Кучер (Abadonna) 30.09.10 16:44
(3) Тогда считай, что ниже -- фотомонтаж :D :D
Процедура КнопкаСформироватьНажатие(Кнопка)
База= Новый XBase;
База.ОткрытьФайл("c:\MiracleV8_TestBase77\SC16.DBF");
База.Первая();
Стр=База.ПолучитьЗначениеПоля("SP18");
Сообщить("Длина поля SP18= "+СтрДлина(Стр));
КонецПроцедуры

Прикрепленные файлы:
4. Аркадий Кучер (Abadonna) 30.09.10 16:53
На даже больше:
заполняем
Процедура Сформировать()
Спр=СоздатьОбъект("Справочник.Тест");
Спр.ВыбратьЭлементы();
Спр.НайтиПоКоду("1");
Стр="";
Для А=1 По 490 Цикл
Стр=Стр+"F";
КонецЦикла;
Стр=Стр+"А_ТутКонец";
Спр.Реквизит=Стр;
Спр.Записать();
КонецПроцедуры
А этим кодом будем смотреть
Процедура КнопкаСформироватьНажатие(Кнопка)
База= Новый XBase;
База.ОткрытьФайл("c:\MiracleV8_TestBase77\SC16.DBF");
База.Первая();
Стр=База.ПолучитьЗначениеПоля("SP18");
Сообщить("Длина поля SP18= "+СтрДлина(Стр));
Право=Прав(Стр,10);
Сообщить(Право);
КонецПроцедуры
И результат (фотомонтаж, конечно :D )
____________
Да! И dbf-ку не пожалею. Лови
Прикрепленные файлы:
SC16.DBF
5. Аркадий Кучер (Abadonna) 30.09.10 17:05
А в следующий раз загляни в базу 7.7 и обрати внимание на такие интересные файлы, как
1SBLOB.DBF (вот они как раз для полей BLOB - реквизит неограниченной длины)
6. Алексей Бобылкин (alex_bob) 30.09.10 17:26
(3),(4) Хорошо, c XBase убедил, получается я напутал. :( Остается VFPOLEDB. Фразу про XBASE из описания уберу...
Abadonna; +1 Ответить
7. Владимир (hogik) 30.09.10 18:07
(0)
Для информации.
Вот текст из описания CodeBase ("движка" 1C 7.7):
Appendix D: CodeBase Limits
Field Width
65517 bytes
254 for FoxPro or dBASE compatibility
32767 for Clipper compatibility
8. Алексей Бобылкин (alex_bob) 01.10.10 08:15
(7) Спасибо за информацию. Хорошо бы еще понять, насколько объект XBase из восьмерки совместим с CodeBase. Кстати, если говорить о реквизитах объектов 1С77, то их длину не удастся сделать больше, чем 999 символов.
(5) BLOB здесь не при чём. Речь именно о строковых реквизитах ограниченной длины, но больше 254 символов.
9. Владимир (hogik) 01.10.10 16:41
(8)
Ограничение на 999 не имеет отношение к CodeBase. Это ограничение самой 1С 7.7. Аналогичные ограничения могут быть и в 8.х. Надо писать тесты или искать в документациях.
А формально имеет смысл посмотреть заголовок DBF-а, пользуясь материалом из http://www.realcoding.net/article/view/222 , пропустив страницу с рекламой. ;-)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа