Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Вопрос по объекту BinaryData (число прочтений - 5840 )
ZOOBR
Junior Member
**
Отсутствует



Сообщений: 22
Зарегистрирован: 17. Апреля 2008
Вопрос по объекту BinaryData
29. Апреля 2008 :: 14:11
Печать  
В своей конфе юзаю компоненту BinFiles, для хранения бинарных файлов в базе 1С. Покурив доку по 1С++ наткнулся на объект BinaryData.
Так вот может кто-нибудь подсказать возможно ли с помощью этого объекта загонять бинарные файлы в базу 1С или нет! То есть чтобы не юзать лишнюю компоненту! Я попробовал, у меня ничего не вышло! Пробовал так:
Код
Выбрать все
ФС.УстТекКаталог("C:\");
Файл = СоздатьОбъект("BinaryData");
Имя = "";
Стр = "";
Если ФС.ВыбратьФайл(0, Имя, НачКаталог, "Выбор файла для загрузки", "Все файлы (*.*) |*.*", "zip") = 1 Тогда
ИмяФайла = ?(Прав(НачКаталог, 1) = "\", НачКаталог, НачКаталог + "\") + Имя;
Файл.ЗагрузитьИзФайла("1189.zip", 1);
КонецЕсли;
 


Что делать дальше точно не знаю, пробовал извлечь данные по разному но ничего не вышло? Отпишитесь кто работал с этой функцией!
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #1 - 29. Апреля 2008 :: 14:32
Печать  
Код
Выбрать все
//_____________________________________________________________________________
//
Процедура Сформировать()
	Перем BinData;
	Перем стрФайл; // C:\somewhere\file1.ept
	Перем стрЗапрос;
	Перем rs;

	BinData = СоздатьОбъект("BinaryData");
	Попытка
		BinData.ПодключитьсяКФайлу(стрФайл, 1, 1);
	Исключение
		Сообщить("Не удалось подключиться к файлу " + стрФайл, "!");
		Возврат;
	КонецПопытки;

	rs = СоздатьОбъект("ODBCRecordSet");

	стрЗапрос = "IF OBJECT_ID(N'tempdb.dbo.#TempTblForSample') IS NOT NULL DROP TABLE #TempTblForSample";
	Если rs.Выполнить(стрЗапрос) = 0 Тогда
		Сообщить("Не удалось выполнить запрос!" + РазделительСтрок + "---> описание ошибки: " + rs.ПолучитьОписаниеОшибки(), "!");
		Возврат;
	КонецЕсли;

	стрЗапрос = "
	|CREATE TABLE #TempTblForSample (
	|	ROW_ID int IDENTITY(1, 1) NOT NULL,
	|	FNAME varchar(255) NOT NULL,
	|	FIMAGE image NULL
	|)";

	Если rs.Выполнить(стрЗапрос) = 0 Тогда
		Сообщить("Не удалось выполнить запрос!" + РазделительСтрок + "---> описание ошибки: " + rs.ПолучитьОписаниеОшибки(), "!");
		Возврат;
	КонецЕсли;

	стрЗапрос = "INSERT INTO #TempTblForSample (FNAME, FIMAGE) VALUES (?, ?)";

	Если rs.Подготовить(стрЗапрос) = 0 Тогда
		Сообщить("Не удалось подготовить запрос!" + РазделительСтрок + "---> описание ошибки: " + rs.ПолучитьОписаниеОшибки(), "!");
		Возврат;
	КонецЕсли;

	rs.ДобПараметр(1, 15, 255, 0); // FNAME
	rs.ДобПараметр(1, 19, 0, 0); // FIMAGE

	rs.УстПараметр(1, стрФайл);
	rs.УстПараметр(2, BinData);

	Если rs.Выполнить() = 0 Тогда
		Сообщить("Не удалось выполнить запрос!" + РазделительСтрок + "---> описание ошибки: " + rs.ПолучитьОписаниеОшибки(), "!");
		Возврат;
	КонецЕсли;
КонецПроцедуры // Сформировать()
 

  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #2 - 29. Апреля 2008 :: 14:43
Печать  
Хотя, наверно, поторопился... У тебя ведь база SQL? Улыбка
  
Наверх
ICQ  
IP записан
 
ZOOBR
Junior Member
**
Отсутствует



Сообщений: 22
Зарегистрирован: 17. Апреля 2008
Re: Вопрос по объекту BinaryData
Ответ #3 - 29. Апреля 2008 :: 14:51
Печать  
По моему меня не так поняли???!! Я хотел спросить, можно ли использовать объект "BinaryData" вместо компоненты BinFiles. Я хочу хранить файлы в в длинных строках базы 1С. Вышеприведенный кусок кода этого явно не поясняет!

P.S. База у меня КОНЕЧНО не SQL! В Скулевских базах у меня свой механизм и такой проблемы не стоит!
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #4 - 29. Апреля 2008 :: 15:27
Печать  
ZOOBR писал(а) 29. Апреля 2008 :: 14:51:
По моему меня не так поняли???!! Я хотел спросить, можно ли использовать объект "BinaryData" вместо компоненты BinFiles. Я хочу хранить файлы в в длинных строках базы 1С. Вышеприведенный кусок кода этого явно не поясняет!

P.S. База у меня КОНЕЧНО не SQL! В Скулевских базах у меня свой механизм и такой проблемы не стоит!

не боишься 2 гб-айтного ограничения???  Круглые глаза
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ZOOBR
Junior Member
**
Отсутствует



Сообщений: 22
Зарегистрирован: 17. Апреля 2008
Re: Вопрос по объекту BinaryData
Ответ #5 - 29. Апреля 2008 :: 16:05
Печать  
vandalsvq писал(а) 29. Апреля 2008 :: 15:27:
не боишься 2 гб-айтного ограничения???  Круглые глаза


Да нет, не тот случай! Конфа не слишком объемистая! Может лучше чего скажешь по моему вопросу????

P.S. Странно! Неужели никто не может прояснить ситуацию??
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #6 - 29. Апреля 2008 :: 16:14
Печать  
Когда игрался с хранением бинарных данных в базе, то использовал ВК для кодирования в UUE и обратно. Возможно, BinaryData с кодировкой UTF8 как-то удасться прикрутить, хотя сомневаюсь. Но, вроде бы, для ДБФ уже где-то были готовые решения? Можно поискать на проклубе и инфостарте.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #7 - 29. Апреля 2008 :: 16:17
Печать  
Хотя, наверное, можно использовать BinaryData для побайтового (или по 2 или 4 байта) методами ПрочитатьДанные/ЗаписатьДанные. Но, ИМХО, это будет слишком медленно.
  
Наверх
 
IP записан
 
ZOOBR
Junior Member
**
Отсутствует



Сообщений: 22
Зарегистрирован: 17. Апреля 2008
Re: Вопрос по объекту BinaryData
Ответ #8 - 29. Апреля 2008 :: 19:52
Печать  
Uzhast писал(а) 29. Апреля 2008 :: 16:17:
Хотя, наверное, можно использовать BinaryData для побайтового (или по 2 или 4 байта) методами ПрочитатьДанные/ЗаписатьДанные. Но, ИМХО, это будет слишком медленно.


Ну вот уже что-то проясняется! Подмигивание Я тоже так думал! Спасибо что подтвердили мои предположения! Этим методом данные записываются только побайтово в цикле (опровергните если это не так). Всё-таки компоненту BinFiles как я понял 1С++ пока заменить видимо не может! Печаль
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #9 - 29. Апреля 2008 :: 20:24
Печать  
ZOOBR писал(а) 29. Апреля 2008 :: 19:52:
Ну вот уже что-то проясняется! Подмигивание Я тоже так думал! Спасибо что подтвердили мои предположения! Этим методом данные записываются только побайтово в цикле (опровергните если это не так). Всё-таки компоненту BinFiles как я понял 1С++ пока заменить видимо не может! Печаль

По видимому, не может. Впрочем BinFiles, ИМХО, тоже не слишком удачный вариант для реализации хранения бинарных файлов в 1С. Сложноватый алгоритм и, скорее всего, не самый быстрый. Но по сравнению с использованием BinaryData будет летать. Потому что читает бОльшими порциями, да и числа, полученные из BinaryData, нужно как-то еще, дополнительно, обрабатывать.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вопрос по объекту BinaryData
Ответ #10 - 30. Апреля 2008 :: 13:09
Печать  
Uzhast писал(а) 29. Апреля 2008 :: 20:24:
По видимому, не может. Впрочем BinFiles, ИМХО, тоже не слишком удачный вариант для реализации хранения бинарных файлов в 1С. Сложноватый алгоритм и, скорее всего, не самый быстрый.

У меня осталось воспоминание, что алгоритм там удачный, быстрее попавшихся мне BASE64.

Цитата:
Но по сравнению с использованием BinaryData будет летать. Потому что читает бОльшими порциями, да и числа, полученные из BinaryData, нужно как-то еще, дополнительно, обрабатывать.

А смысл чтения по словам, можно же залить весь объем через ЗагрузитьИзФайла().
Или ты имеешь в виду реализацию преобразования в строку на языке 1С?..

Было в свое время предложение добавить сериализацию в строку типа BinFiles, но до реализации не дошло.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Вопрос по объекту BinaryData
Ответ #11 - 30. Апреля 2008 :: 23:43
Печать  
kms писал(а) 30. Апреля 2008 :: 13:09:
Uzhast писал(а) 29. Апреля 2008 :: 20:24:
По видимому, не может. Впрочем BinFiles, ИМХО, тоже не слишком удачный вариант для реализации хранения бинарных файлов в 1С. Сложноватый алгоритм и, скорее всего, не самый быстрый.

У меня осталось воспоминание, что алгоритм там удачный, быстрее попавшихся мне BASE64.

Ага, блин. Дофига как удачный алгоритм. Сначала радостно превращаем строку в hex-коды, а потом радостно жмем ее архиватором. Сначала насоздавали себе трудностей, а потом бодро их преодолеваем.

Вот ЗАЧЕМ нужно сначала вытягивание hex-строки из ВК, а потом впендюривание ее обратно? А? А если еще учесть, что ВК сделана не по типу Rainbow, а по штатной технологии, то в этих перекидываниях строк туды-сюды , как пить дать, есть пара преобразований в юникод и обратно. Фактически через ВК прокачивается объем данных больше чем В ВОСЕМЬ раз превышающий размер исходного объема файла. До хрена как удачный алгоритм. Да-да. Трындец просто.

Правильная ВК должна предоставлять три простых метода:
1) ОткрытьФайл (чтение или запись)
2) ПрочитатьUUEДанные (длина). длина должна быть такова, чтобы получить целое количество закодированных байтов
3) ЗаписатьUUEДанные (СтрокаUUE)

Чтение при этом происходит поблочно (а не весь файл в строку). Файл пишется не в строку неограниченной длины а в специальный справочник поблочно - одна порция UUE-кодированных данных в одну запись. В результате нет больших затрат по памяти и не засоряется одинэсная блоб-таблица. Если в справочнике перелезли лимит в 2Гб, то без проблема создаем справочник нумер два и нас будет еще 2Гб, куда можно гадить.

Количество взаимодействий с ВК минимально, объем перекачиваемых данных невелик. Оверхед - 30% объема исходного файла. UUE заменить на Base64 по вкусу.

При этом ВК лучше делать по типу Rainbow, чтобы исключить преобразования в Юникод. Иначе оверхед будет сразу больше 100%.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать