Гость
Форумы / [игнор отключен] [закрыт для гостей] / Прямой доступ к файлам в БД (УТ 11) / 21 сообщений из 21, страница 1 из 1
26.06.2013, 11:20
    #38310841
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Возникла казуальная задача - необходимо извлекать хранимые в БД 1С файлы (напрямую, без ком), определённым образом обрабатывать их и записывать обратно.
Обратботка остаётся за скобками, проблема в извлечении-записи файлов. Хранятся они в блобе предположительно то ли со сжатием, то ли ещё как (шифрование и подписи отключено, проверял), потому что тупо из блоба в файл оно сохраняется некорректно. Предположительно какое-то примитивное сжатие, так как размер сохраняемого файла почти всегда меньше оригинала, но какой алгоритм? Или где в самой 1с копать как она сохраняет файл в свой "регистрсведений.присоединенныефайлы"?
...
Рейтинг: 0 / 0
26.06.2013, 11:24
    #38310851
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Доставай в 1С, зачем напрямую то лезть? читай про объект "ДвоичныеДанные" в справке
...
Рейтинг: 0 / 0
26.06.2013, 11:37
    #38310884
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
badboychikДоставай в 1С, зачем напрямую то лезть? читай про объект "ДвоичныеДанные" в справке
Спасибо конечно за совет, но задача состоит _именно_ в прямом обращении к БД MS SQL и чтении-записи файлов оттуда-туда.
...
Рейтинг: 0 / 0
26.06.2013, 11:50
    #38310918
Титов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballer,

в Sql пишите запрос и достаете из базы данные которые вам нужны!
...
Рейтинг: 0 / 0
26.06.2013, 11:50
    #38310919
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
этож нарушение лицензии, на минуточку )
Чем обосновано прямое обращение к скулю?
Обычно задачу ставят - решить такую то проблему. А каким способом решить, не должно быть принципиальным, главное быстро и не через Ж

А вообще 1Сный тип "ХранилищеЗначения" в скуле соответствует типу IMAGE
...
Рейтинг: 0 / 0
26.06.2013, 11:56
    #38310933
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Титовfootballer,

в Sql пишите запрос и достаете из базы данные которые вам нужны!
Внезапно, но именно так и делаю. Проблема в том, что данные в файл сохраняются некорректно.
...
Рейтинг: 0 / 0
26.06.2013, 11:57
    #38310934
Титов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballerТитовfootballer,

в Sql пишите запрос и достаете из базы данные которые вам нужны!
Внезапно, но именно так и делаю. Проблема в том, что данные в файл сохраняются некорректно.

извлекаете не правильно
...
Рейтинг: 0 / 0
26.06.2013, 11:59
    #38310939
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballerТитовfootballer,

в Sql пишите запрос и достаете из базы данные которые вам нужны!
Внезапно, но именно так и делаю. Проблема в том, что данные в файл сохраняются некорректно.
Это отдельные два вопроса)

badboychikА вообще 1Сный тип "ХранилищеЗначения" в скуле соответствует типу IMAGE
покурю в этом направлении.
...
Рейтинг: 0 / 0
26.06.2013, 12:00
    #38310942
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Титовfootballerпропущено...

Внезапно, но именно так и делаю. Проблема в том, что данные в файл сохраняются некорректно.

извлекаете не правильно
И как же извлекать правильно?
Только можно без общих слов, а с конкретикой?
...
Рейтинг: 0 / 0
26.06.2013, 12:04
    #38310950
Титов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballer,

при извлечении должно быть все просто примерно так я делал в Оракле
Код: sql
1.
2.
3.
4.
5.
6.
7.
procedure open_scr(in_id in number, out_image out blob) is
  begin
    select rs.image_data
      into out_image
      from sk_req_scr rs
     where rs.req_id = in_id;
  end;
...
Рейтинг: 0 / 0
26.06.2013, 12:05
    #38310955
Титов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballer,

а обрабатываете вы как и где?
...
Рейтинг: 0 / 0
26.06.2013, 12:39
    #38311030
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Титовfootballer,

а обрабатываете вы как и где?
в дельфи (хотя это и не принципиально) через ado запрос.
Стандартный TBlobField().SaveToFile(), как и прочие варианты через стримы выдают совершенно идентичные друг-другу результаты, отличающиеся от исходника (откуда, собственно, мысль про сжатие и родилась, к тому же из dbo.files, к примеру, таким образом всё прекрасно извлекается).
...
Рейтинг: 0 / 0
26.06.2013, 12:45
    #38311046
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Да, во всех выгруженных файлах совершенно идентичный заголовок, возможно это не сжатие, а 1С при сохранении подставляет какую-то служебную информацию.
...
Рейтинг: 0 / 0
26.06.2013, 13:42
    #38311197
badboychik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
Я все равно не понимаю, зачем такой гемор, если в 1С можно вытащить и записать в файл одной строкой
Код: vbnet
1.
2.
//запросом отбираем нужную запись и потом..
ЗаписьРегистраСведенийПрисоединенныеФайлы.ХранимыйФайл.Получить().Записать(ИмяФайлаНаДиске);
...
Рейтинг: 0 / 0
26.06.2013, 13:52
    #38311223
footballer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
badboychikЯ все равно не понимаю, зачем такой гемор, если в 1С можно вытащить и записать в файл одной строкой
Код: vbnet
1.
2.
//запросом отбираем нужную запись и потом..
ЗаписьРегистраСведенийПрисоединенныеФайлы.ХранимыйФайл.Получить().Записать(ИмяФайлаНаДиске);


Мне видимо ещё не один раз придётся повторить, что это. требуется. сделать. без. участия. 1С.
...
Рейтинг: 0 / 0
26.06.2013, 15:31
    #38311436
Дмитрий_777
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballer,

Что платформа дописывает в blob при формировании ХранилищаЗначений - кто его знает, это надо исходники платформы, или человека из головной конторы из отдела разработки платформы, но поэкспериментировать можно, попробуй для записи подпихнуть пустой файл, либо файл в котором будет только 1-2 байта и посмотри что прочитаешь.
...
Рейтинг: 0 / 0
26.06.2013, 16:56
    #38311631
ALKIR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
(в браузере отключена ява, не работают теги, админы поправьте плз)

файлик в хранилище сохраняется в base64 ничего не добавялется

пример рабочего кода:

USE [DataExchange]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getFileFromStorage]
@_SimpleKey binary(16) --ID файлика
,@OutputDirectory varchar(1024) --каталог для временного сохранения файлов из SQL
AS
Begin

print 'getFileFromStorage переданы параметры:'
print @_SimpleKey
print @OutputDirectory

declare
@Stream integer,
@Buffer varbinary(4096),
@Size integer,
@Pos integer,
@BufSize integer,
@HR varbinary(4096),
@FileName varchar(1024)

SET @BufSize = 4096

--проверять инициализацию объекта Stream не будем
--полагаем что объект ADODB.Stream работает безошибочно
--:) иначе бы Windows не работала

EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT
EXEC @HR = sp_OASetProperty @Stream,'Type',1 -- binary
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 -- write|read
EXEC @HR = sp_OAMethod @Stream,'Open'

--Получаем информацию о файле
select @Size = DATALENGTH(_Fld194), @FileName =@OutputDirectory+'\'+_Fld193 from _InfoReg191 where _SimpleKey = @_SimpleKey

print 'размер создаваемого файла:' --режим тестирования
print @Size --режим тестирования
print 'имя файла:' --режим тестирования
print @FileName --режим тестирования

Set @Pos=0

WHILE @Pos < @Size BEGIN
SET @BufSize = CASE WHEN @Size - @Pos < 4096 THEN @Size - @Pos ELSE 4096 END

select @Buffer = substring(_Fld194 ,@Pos+1, @BufSize) from _InfoReg191 where _SimpleKey = @_SimpleKey

EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer

SET @Pos = @Pos + @BufSize
END


EXEC @HR = sp_OAMethod @Stream,'SaveToFile',null,@FileName,2

EXEC @HR = sp_OAMethod @Stream,'Close'
EXEC @HR = sp_OADestroy @Stream

--метод SaveToFile возвращает НЕ одназначно ответ - создали мы файл или нет
--чтобы понять это, попробуем получить размер созданного нами файлика
declare @hr_ int, @FSO int, @file int, @Size_Сreated int
exec @hr_ = sp_oacreate 'Scripting.FileSystemObject', @FSO output
exec @hr_ = sp_oamethod @FSO , 'GetFile', @file output, @FileName
exec @hr_ = sp_oagetproperty @file, 'Size', @Size_Сreated output
--exec @hr = sp_oadestroy @FSO
print 'Размер созданного файла:'
print @Size_Сreated --режим тестирования
If isNull(@Size_Сreated,0) <> @Size
Begin
print 'ERROR: ошибка при создании файла: '
print @FileName
Return 1
End

print 'файл создан' --режим тестирования
Return 0

END
...
Рейтинг: 0 / 0
26.06.2013, 18:05
    #38311729
baclanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
footballer,

Файлы 1С-ка хранит в сжатом виде, вроде использует zlib, вытащенный из базы файл нужно будет разжимать.
Мы файлы из 1С-ки получаем через веб-сервисы - даже на диск писать ничего не надо :-)
...
Рейтинг: 0 / 0
27.06.2013, 10:49
    #38312256
Прямой доступ к файлам в БД (УТ 11)
1с использует алгоритм сжатия DEFLATE

System.IO.Compression.DeflateStream
Вас спасет. например в виде clr сборки сдля скл сервер 2005 и выше
...
Рейтинг: 0 / 0
30.06.2013, 20:07
    #38315167
Nick Perelyaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
"footballer" <nospam@sql.ru>; сообщил(а) в новостях
следующее:14486294@sql.ru...
> Автор: footballer
> badboychik
> Я все равно не понимаю, зачем такой гемор, если в 1С можно
> вытащить и записать в файл одной строкой
>
> //запросом отбираем нужную запись и потом..
> ЗаписьРегистраСведенийПрисоединенныеФайлы.ХранимыйФайл.Получить().Записать(ИмяФайлаНаДиске);
>
>
> Мне видимо ещё не один раз придётся повторить, что это. требуется.
> сделать. без. участия. 1С.
> Тема Ответить Сообщение
Тебе дельно говорят. Используй com из дельфи - это несколько строк - 5-6
от силы на дельфи.
1С при чем тут?


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.06.2013, 20:10
    #38315168
Nick Perelyaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямой доступ к файлам в БД (УТ 11)
"footballer" <nospam@sql.ru>; сообщил(а) в новостях
следующее:14485521@sql.ru...
> Автор: footballer
> Да, во всех выгруженных файлах совершенно идентичный заголовок,
> возможно это не сжатие, а 1С при сохранении подставляет какую-то служебную
> информацию.
> Тема Ответить Сообщение
А зачем гадать? И как это будет изменяться от версии к версии платформы? Не
беспокоят такие дела?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Прямой доступ к файлам в БД (УТ 11) / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]