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


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

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

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

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

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

9 Comments

  1. Abadonna
    Попробуйте открыть такой файл через объект XBase восьмерки и увидите кашу…

    Попробовал.

    Вот код на 7.7 для заполнения реквизита на 500 символов:

    Процедура Сформировать()

    Спр=СоздатьОбъект(«Справочник.Тест»);

    Спр.НайтиПоКоду(«1»);

    Стр=»»;

    Для А=1 По 125 Цикл

    Стр=Стр+»Test»;

    КонецЦикла;

    Спр.Реквизит=Стр;

    Спр.Записать();

    КонецПроцедуры

    А на картинке — результат на объекте XBase восьмерки

    P.S. И листер cdbfview от Тотала — без базаров

    P.P.S. Я даже догадываюсь, какие именно поля тебя смутили: которые имеют в 7.7 тип «неорганиченная длина», но это уже не строковые поля 😉

    Reply
  2. alex_bob

    (1) Картинками не убедил. Реквизит на 500 символов в XBase восьмерки обрезается до 244 символов. На картинке видно меньше 200. Если после этого реквизита есть еще реквизиты, то в них то каша и начинается. Попробуй сделать длину 260 символов и потом еще 10 реквизитов по 10 символов.

    Про Total ничего не могу сказать…

    Reply
  3. Abadonna

    (3) Тогда считай, что ниже — фотомонтаж 😀 😀

    Процедура КнопкаСформироватьНажатие(Кнопка)

    База= Новый XBase;

    База.ОткрытьФайл(«c:MiracleV8_TestBase77SC16.DBF»);

    База.Первая();

    Стр=База.ПолучитьЗначениеПоля(«SP18»);

    Сообщить(«Длина поля SP18= «+СтрДлина(Стр));

    КонецПроцедуры

    Reply
  4. Abadonna

    На даже больше:

    заполняем

    Процедура Сформировать()

    Спр=СоздатьОбъект(«Справочник.Тест»);

    Спр.ВыбратьЭлементы();

    Спр.НайтиПоКоду(«1»);

    Стр=»»;

    Для А=1 По 490 Цикл

    Стр=Стр+»F»;

    КонецЦикла;

    Стр=Стр+»А_ТутКонец»;

    Спр.Реквизит=Стр;

    Спр.Записать();

    КонецПроцедуры

    А этим кодом будем смотреть

    Процедура КнопкаСформироватьНажатие(Кнопка)

    База= Новый XBase;

    База.ОткрытьФайл(«c:MiracleV8_TestBase77SC16.DBF»);

    База.Первая();

    Стр=База.ПолучитьЗначениеПоля(«SP18»);

    Сообщить(«Длина поля SP18= «+СтрДлина(Стр));

    Право=Прав(Стр,10);

    Сообщить(Право);

    КонецПроцедуры

    И результат (фотомонтаж, конечно 😀 )

    ____________

    Да! И dbf-ку не пожалею. Лови

    Reply
  5. Abadonna

    А в следующий раз загляни в базу 7.7 и обрати внимание на такие интересные файлы, как

    1SBLOB.DBF (вот они как раз для полей BLOB — реквизит неограниченной длины)

    Reply
  6. alex_bob

    (3),(4) Хорошо, c XBase убедил, получается я напутал. 🙁 Остается VFPOLEDB. Фразу про XBASE из описания уберу…

    Reply
  7. hogik

    (0)

    Для информации.

    Вот текст из описания CodeBase («движка» 1C 7.7):

    Appendix D: CodeBase Limits

    Field Width

    65517 bytes

    254 for FoxPro or dBASE compatibility

    32767 for Clipper compatibility

    Reply
  8. alex_bob

    (7) Спасибо за информацию. Хорошо бы еще понять, насколько объект XBase из восьмерки совместим с CodeBase. Кстати, если говорить о реквизитах объектов 1С77, то их длину не удастся сделать больше, чем 999 символов.

    (5) BLOB здесь не при чём. Речь именно о строковых реквизитах ограниченной длины, но больше 254 символов.

    Reply
  9. hogik

    (8)

    Ограничение на 999 не имеет отношение к CodeBase. Это ограничение самой 1С 7.7. Аналогичные ограничения могут быть и в 8.х. Надо писать тесты или искать в документациях.

    А формально имеет смысл посмотреть заголовок DBF-а, пользуясь материалом из http://www.realcoding.net/article/view/222 , пропустив страницу с рекламой. 😉

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *