Имя: Пароль:
1C
1С v8
Хранение изображений jpg в базе 1с 8.1
,
0 Den Romanoff
 
10.07.11
03:30
Есть самописная конфигурация для учёта заезда/выезда автомобилей. При заезде автомобиля создается документ со следующими реквизитами:
-Марка
-Модель
-Номер кузова
-Транзит

Также, данные сохраняются в регистре сведений "Архив машин" с похожими измерениями.

В процессе проведения делается снимок с веб-камеры (через ActiveX), который сохраняется на диск. В связи с этим вопрос - как сохранять сделанное изображение в базу (вместе с документом или в архив машин), а не на диск. Чтобы при открытии документа заезда за какую-либо дату можно было сразу посмотреть снимок заезжающей машины?
1 alex-pro
 
10.07.11
03:37
Дык, храни через ХранилищеЗначения.
2 Den Romanoff
 
10.07.11
03:42
Расскажите поподробнее, пожалуйста. Вообще, я программист на С, PHP и Python. Знания по особенностям 1с-программирования в зачаточном состоянии, вот пришлось связаться. Хотя бы с чего начать реализацию моей задачи? Можно ссылки на статейки по теме.
3 Den Romanoff
 
10.07.11
03:47
Видите ли, прикрутить activex и заставить его сохранять фотографии с камеры я осилил, а вот структура хранения данных в 1С для меня темный лес.
4 IronDemon
 
10.07.11
03:55
5 Den Romanoff
 
10.07.11
06:08
Помещаю в хранилище:

Движение = Движения.АрхивМашин.Добавить();
Движение.Период = ТекущаяДата();
//-------//
ФотоМашины= Новый Картинка("C:\carfoto.jpg");
ХранилищеФото = новый ХранилищеЗначения(ФотоМашины);
Движение.Фото = ХранилищеФото;


А когда пытаюсь достать:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
                |    АрхивМашин.Фото
                |ИЗ
                |    РегистрСведений.АрхивМашин КАК АрхивМашин
                |ГДЕ
                |    АрхивМашин.ШтрихКод = &ШК";
                                       
Запрос.УстановитьПараметр("ШК",ЭтаФорма.Штрих);
Результ = Запрос.Выполнить();
Хранилище = Новый ХранилищеЗначения(Результ.Выбрать().Получить(0));
ЭлементыФормы.Фото.Картинка = Хранилище.Получить();

Ругается на несоответствие типов

Где жук?
6 Grusswelle
 
10.07.11
06:24
(5) Посмотри, каких типов может быть измерение у регистра.
7 Den Romanoff
 
10.07.11
06:33
А это и не измерение. У них нельзя выбрать тип ХранилищеЗначения. Я пробовал и ресурсы и реквизиты.
8 Den Romanoff
 
10.07.11
06:38
Блин... Как же быть-то?
9 Либерал
 
10.07.11
11:39
не надо тебе в регистр через движения картинку..
сделай у самого документа реквизит "фото" с типом ХранилищеЗначения.
в запросе получишь Ссылку на документ, потом вытащишь картинку по ссылке примерно так:

Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1

                |    АрхивМашин.Ссылка //!!!!!!!!!
                |ИЗ
                |    Документ.АрхивМашин КАК АрхивМашин
                |ГДЕ
                |    АрхивМашин.ШтрихКод = &ШК";


Результ = Запрос.Выполнить();
Если НЕ Результ.Пустой() Тогда
Выборка = Результ.Выбрать();
Выборка.Следующий();
Хранилище = Новый ХранилищеЗначения(Выборка.Ссылка.Фото);
ЭлементыФормы.Фото.Картинка = Хранилище.Получить();
10 Либерал
 
10.07.11
11:40
если все же очень надо регистр - лучше фото в справочник, а элементы справочника уже в регистр.
11 vde69
 
10.07.11
11:42
сделай справочник с 1 реквизитом куда записывай картинку а в регист добавь ссылку на этот справочник

это нужно для того что-бы запросы по регистру не тормазили
12 milan
 
10.07.11
12:24
у меня в рс хранится строка неограниченной длины сжатая, мож я что- то не так сделал?
13 milan
 
10.07.11
12:28
(11) а чего запросы должны тормозить? регистр 2м записей несколько гигов весит, ни списки ни запросы ни формы записи не тормозят
14 Den Romanoff
 
14.07.11
02:18
Всё равно, блин, не растет кокос... :(

Вот я сохраняю снимок с камеры на диск:

ЭтаФорма.ЭлементыФормы.вк.SaveJPG("C:\carfoto.jpg");
ЭтаФорма.ЭлементыФормы.вк.PreviewStop();

Вот я помещаю его в реквизит документа "заезд"

ФотоМашины= Новый Картинка("C:\carfoto.jpg");
ХранилищеФото = Новый ХранилищеЗначения (ФотоМашины);
ЭтотОбъект.Фото= ХранилищеФото;

Вот пытаюсь его оттуда достать. Но опять возникает несоответствие типов:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
            |    Заезд.Ссылка
            |ИЗ
            |    Документ.Заезд КАК Заезд
            |ГДЕ
            |    Заезд.ШтрихКод = &ШК";
                                       
Запрос.УстановитьПараметр("ШК",ЭтаФорма.Штрих);
Результ = Запрос.Выполнить();
Если НЕ Результ.Пустой() Тогда
Выборка = Результ.Выбрать();
Выборка.Следующий();
Хранилище = Новый ХранилищеЗначения(Выборка.Ссылка.Фото);
ФотоМашины = Новый Картинка (Хранилище.Получить()); //тут несоответствие
ЭлементыФормы.Фото.Картинка = ФотоМашины;
КонецЕсли

Как только не пробовал: и с использованием Двоичных Данных и в BMP сохранял. Несоответствие, и всё тут. Как же его правильно достать оттуда?
15 Den Romanoff
 
14.07.11
04:14
Ура! Проблема решилась.

Сохраняю:

Фото = Справочники.Фотографии.СоздатьЭлемент();
Фото.Фотография = Новый ХранилищеЗначения(Новый картинка("C:\carfoto.jpg"));
Фото.ШтрихКод = Движение.ШтрихКод;
Фото.Записать();



Достаю:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
                |    Фотографии.Ссылка
                |ИЗ
                |    Справочник.Фотографии КАК Фотографии
                |ГДЕ
                |    Фотографии.ШтрихКод = &ШК";
                                       
Запрос.УстановитьПараметр("ШК",ЭтаФорма.Штрих);
Результ = Запрос.Выполнить();
Если НЕ Результ.Пустой() Тогда
Выборка = Результ.Выбрать();
Выборка.Следующий();
ЭлементыФормы.Фото.Картинка = Выборка.Ссылка.Фотография.получить();


Спасибо всем за помощь!
16 Маленький Вопросик
 
14.07.11
05:58
(0) а я делал нечто подобное - в году аж 2007-ом!
только я в базе хранил ссылки на фотографии авто, а фотографии хранились в определенном каталоге

ну и веб-интерфейс к базе был привязан...
17 Ювелир
 
14.07.11
08:31
а зачем картинки в базу пихать? Я на файл сервер складываю. Связь либо по ключу составному либо по индексу.

Просто. Надежно. Дешево.
18 Восточный Парень
 
14.07.11
08:40
У меня в базе даже ссылки не хранятся, а вот при открытии документа есть кнопка, по которой открывается обработка показывающая, а есть ли в специальной базе СКЛ на эту ссылку документа привязанные файлы. Файлы хранятся в базе СКЛ отдельной. При добавлении файла в СКЛ базу загружается файл, ссылка на объект базы 1С, дата вставки, имя пользователя, имя файла.
19 Den Romanoff
 
15.07.11
01:02
Машин в день заезжает порядка трёх тысяч. Мне кажется, при таком количестве, хранение в каталоге быстро бы начало глючить.
20 i_rodionov
 
15.07.11
04:30
(19) ИМХО, при таком количестве двоичных данных (три тысячи снимков в день) нужно делать отдельную SQL базу. Туда грузить картинки.
(18) Правильное решение.

НО!!! Возникает вопрос целостности данных. При архивировании 1С-базы что делать со старыми снимками? Нужна соответствующая обработка, чтобы их тоже удалять или переносить куда-то еще.
При удалении отдельного документа из 1С, что делать со снимком к ниму привязанным? Нужна процедура, которая все почистит.
Кроме этого нужна отдельная асинхронная задача в 1С, которая периодически проверяет целостность данных.