Имя: Пароль:
1C
1C 7.7
v7: Пример использования FILESTREAM SQL 2008 r2 для хранения картинок
, ,
0 mvk
 
15.04.16
12:26
Доброго времени суток.
Покажите, плиз, пример кода (1С 7.7 & 1С++) по добавлению и чтению файла.
Нужно для:
Задача1. Хранить фото брака в привязке к акту ТОРГ-2 в 1С.
Задача2. Хранить сканы первички в привязке к документу в 1С.
На самом деле это одна и та же задача.
Включил FILESTREAM на сервере, создал базу данных, создал таблицу:
CREATE TABLE [dbo].[DocsImg](
    [ID] [uniqueidentifier] ROWGUIDCOL DEFAULT (newid()) NOT NULL,
    [IDDOC] [char](9) NOT NULL,
    [IDDOCDEF] [int] NOT NULL,
    [ImgNo] [int] NOT NULL,
    [ImgType] [char](9) NOT NULL,
    [Img] [varbinary](max) FILESTREAM  NULL,
CONSTRAINT [PK_Docs] PRIMARY KEY CLUSTERED ([IDDOC] ASC, [ImgNo] ASC)
Поля IDDOC, IDDOCDEF - связка с _1sjourn, ImgType - ссылка на справочник с описательными типами файла.
Как добавлять файл в таблицу и читать файл из таблицы в 1С7.7-обработке?
1 mvk
 
15.04.16
12:40
Можно и на 8.х код. Думаю, отличия будут небольшие.
2 Злопчинский
 
15.04.16
12:42
Именно в базе надо хранить? почему не юзать хранение обычными файлами?
3 mvk
 
15.04.16
12:47
1) Очень много файлов.
2) Мне кажется, что так удобнее.
3) Хочется освоить технологию.
4 Злопчинский
 
15.04.16
12:49
(3) понял.
чисто интересно - очень много - это сколько? - всегда можно сделать иерархию по датам и т.д.

впрочем не суть важно.
5 Serginio1
 
15.04.16
12:52
6 Serginio1
 
15.04.16
12:54
7 mvk
 
15.04.16
12:54
8 mvk
 
15.04.16
12:55
Хотя тоже вариант. )) Спасибо. Только не останавливайтесь, друзья! ))
9 mvk
 
15.04.16
12:57
(4) За 3 года, которые требует налоговая насобиралось 4644843 документа. Каждый на 2 страницы минимум.
10 Злопчинский
 
15.04.16
13:03
~6500 документов в день...
кто их у вас там сканирует? ;-)
11 ДенисЧ
 
15.04.16
13:05
(10) О потоковом сканере, ты, разумеется, никогда не слышал?
12 ADirks
 
15.04.16
13:09
вот, нашёл в свалочке.  работает или нет - не помню :)

Процедура ВБазу(ИмяФайла)
    Данные = СоздатьОбъект("BinaryData");
    Данные.ЗагрузитьИзФайла(ИмяФайла, 1);
    Запрос = СоздатьОбъект("ODBCRecordSet");
    Запрос.Подготовить("Insert БинарныеДанные (Данные, Дата, Имя) Values (?, GetDate(), '"+ИмяФайла+"')");
    Запрос.ДобПараметр(1,19,0,0);
    Запрос.УстПараметр(1,Данные);
    Запрос.Выполнить();
КонецПроцедуры

Процедура ИзБазы(ИмяФайла)
    Перем Данные;//:BinaryData
    
    Данные = СоздатьОбъект("BinaryData");
    Данные = ЗапросСКЛ.ВыполнитьСкалярный("SELECT Данные FROM БинарныеДанные WHERE ID = 4");
    Данные.СохранитьВФайл(ИмяФайла, 1);
КонецПроцедуры



табличка:
CREATE TABLE БинарныеДанные (
    ID bigint IDENTITY(1,1) Not Null,
    Дата DateTime Not Null,
    ТипОбъекта int,
    Объект char(13),
    Имя varchar(256),
    Данные image Not Null
)
13 Злопчинский
 
15.04.16
13:10
(11) типа поиздевался? ;-)
14 Stepa86
 
15.04.16
13:11
на 8ке как то давно делал так. Откуда изначально "подсмотрел" код уже не помню.

Процедура ПоместитьФайлВХранилище(СоединениеАДО, УникальныйИдентификаторФайла, ПолноеИмяФайла)
    
    КомандаSQL = Новый COMObject("ADODB.Command");
    КомандаSQL.ActiveConnection = СоединениеАДО;
    КомандаSQL.CommandText = "DELETE FROM FileTable WHERE (FileID='" + УникальныйИдентификаторФайла + "')";
    КомандаSQL.CommandType = 1;
    КомандаSQL.Execute();
    
    //создаем набор записей АДО
    НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
    НаборЗаписей.CursorLocation = 2;
    НаборЗаписей.Open("FileTable", СоединениеАДО, 0, 4, 2);
    НаборЗаписей.AddNew();
    НаборЗаписей.Fields("FileID").Value = УникальныйИдентификаторФайла;
    
    //создаем АДО поток для чтения файла
    Поток = Новый COMОбъект("ADODB.Stream");
    Поток.Type = 1;
    Поток.Open();
    Поток.LoadFromFile(ПолноеИмяФайла);
    НаборЗаписей.Fields("Object").Value = Поток.Read();
    
    //обновляем набор записей и закрываем его                    
    НаборЗаписей.UpdateBatch();
    НаборЗаписей.Close();

КонецПроцедуры //ПоместитьФайлВХранилище

Процедура УдалитьФайлИзХранилища(СоединениеАДО, УникальныйИдентификаторФайла, ПолноеИмяФайла)
    
    КомандаSQL = Новый COMObject("ADODB.Command");
    КомандаSQL.ActiveConnection = СоединениеАДО;
    КомандаSQL.CommandText = "DELETE FROM FileTable WHERE (FileID='" + УникальныйИдентификаторФайла + "')";
    КомандаSQL.CommandType = 1;
    КомандаSQL.Execute();

КонецПроцедуры //ПоместитьФайлВХранилище

//забирает файл из хранилища и сохраняет его по указанному пути
Процедура ПолучитьФайлИзХранилища(СоединениеАДО, УникальныйИдентификаторФайла, ПолноеИмяФайла)
    
    НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
    НаборЗаписей.Open("select Object from FileTable where FileID='" + УникальныйИдентификаторФайла + "'", СоединениеАДО);
    Пока (НаборЗаписей.EOF = 0) Цикл
        Изображение = НаборЗаписей.Fields("Object").Value;
        Поток = Новый COMОбъект("ADODB.Stream");
        Поток.Type = 1;
        Поток.Open();
        Поток.Write(Изображение);
        Поток.SaveToFile(ПолноеИмяФайла);
        НаборЗаписей.MoveNext();
    КонецЦикла;    
    
КонецПроцедуры //ПолучитьФайлИзХранилища
15 mvk
 
15.04.16
13:21
(12,14) Спасибо.
(11) Придется не просто потоковый ставить, а еще и штрихкодирование документов постраничное делать. Эта тема еще предстоит ))) Вопрос будет типа "какой софтиной, желательно активх, читать ШК на скане"
16 Mikeware
 
15.04.16
13:23
(15) покойный Душелов делал распознование ШК на сканах еще году в 2005-м...
17 mvk
 
15.04.16
13:27
(16) Я ж не спорю. Покажите, как )))
18 Serginio1
 
15.04.16
13:41
(17) Хочешь интеграции смотри в сторону .Net http://catalog.mista.ru/public/238584/
19 Serginio1
 
15.04.16
13:46