В 1С 7.7 под ДБФ возможно хранение строковых реквизитов справочников и документов с длиной более 255 символов. Я понял это случайно, пытаясь выбрать данные из такой таблицы прямым запросом через VFPOLEDB. Долго не мог понять, почему вместо результата получается каша…
Предлагаемая обработка решает только одну специфическую задачу — превращает такую таблицу в стандартный ДБФ-файл. При этом длинные строковые поля делятся на несколько более коротких с длиной менее 254 байт.
Также обработка может служить примером работы с бинарными файлами из 1С8 с использованием ADODB.Stream.
Обработка под версию 8.2!!
Попробовал.
Вот код на 7.7 для заполнения реквизита на 500 символов:
Процедура Сформировать()
Спр=СоздатьОбъект(«Справочник.Тест»);
Спр.НайтиПоКоду(«1»);
Стр=»»;
Для А=1 По 125 Цикл
Стр=Стр+»Test»;
КонецЦикла;
Спр.Реквизит=Стр;
Спр.Записать();
КонецПроцедуры
А на картинке — результат на объекте XBase восьмерки
P.S. И листер cdbfview от Тотала — без базаров
P.P.S. Я даже догадываюсь, какие именно поля тебя смутили: которые имеют в 7.7 тип «неорганиченная длина», но это уже не строковые поля 😉
(1) Картинками не убедил. Реквизит на 500 символов в XBase восьмерки обрезается до 244 символов. На картинке видно меньше 200. Если после этого реквизита есть еще реквизиты, то в них то каша и начинается. Попробуй сделать длину 260 символов и потом еще 10 реквизитов по 10 символов.
Про Total ничего не могу сказать…
(3) Тогда считай, что ниже — фотомонтаж 😀 😀
Процедура КнопкаСформироватьНажатие(Кнопка)
База= Новый XBase;
База.ОткрытьФайл(«c:MiracleV8_TestBase77SC16.DBF»);
База.Первая();
Стр=База.ПолучитьЗначениеПоля(«SP18»);
Сообщить(«Длина поля SP18= «+СтрДлина(Стр));
КонецПроцедуры
На даже больше:
заполняем
Процедура Сформировать()
Спр=СоздатьОбъект(«Справочник.Тест»);
Спр.ВыбратьЭлементы();
Спр.НайтиПоКоду(«1»);
Стр=»»;
Для А=1 По 490 Цикл
Стр=Стр+»F»;
КонецЦикла;
Стр=Стр+»А_ТутКонец»;
Спр.Реквизит=Стр;
Спр.Записать();
КонецПроцедуры
А этим кодом будем смотреть
Процедура КнопкаСформироватьНажатие(Кнопка)
База= Новый XBase;
База.ОткрытьФайл(«c:MiracleV8_TestBase77SC16.DBF»);
База.Первая();
Стр=База.ПолучитьЗначениеПоля(«SP18»);
Сообщить(«Длина поля SP18= «+СтрДлина(Стр));
Право=Прав(Стр,10);
Сообщить(Право);
КонецПроцедуры
И результат (фотомонтаж, конечно 😀 )
____________
Да! И dbf-ку не пожалею. Лови
А в следующий раз загляни в базу 7.7 и обрати внимание на такие интересные файлы, как
1SBLOB.DBF (вот они как раз для полей BLOB — реквизит неограниченной длины)
(3),(4) Хорошо, c XBase убедил, получается я напутал. 🙁 Остается VFPOLEDB. Фразу про XBASE из описания уберу…
(0)
Для информации.
Вот текст из описания CodeBase («движка» 1C 7.7):
Appendix D: CodeBase Limits
Field Width
65517 bytes
254 for FoxPro or dBASE compatibility
32767 for Clipper compatibility
(7) Спасибо за информацию. Хорошо бы еще понять, насколько объект XBase из восьмерки совместим с CodeBase. Кстати, если говорить о реквизитах объектов 1С77, то их длину не удастся сделать больше, чем 999 символов.
(5) BLOB здесь не при чём. Речь именно о строковых реквизитах ограниченной длины, но больше 254 символов.
(8)
http://www.realcoding.net/article/view/222 , пропустив страницу с рекламой. 😉
Ограничение на 999 не имеет отношение к CodeBase. Это ограничение самой 1С 7.7. Аналогичные ограничения могут быть и в 8.х. Надо писать тесты или искать в документациях.
А формально имеет смысл посмотреть заголовок DBF-а, пользуясь материалом из