Имя: Пароль:
1C
1С v8
Хранение картинки в реквизите справочника, типа "ХранилищеЗначения"
0 Zhuravlik
 
11.06.14
10:55
Добрый день, помогите разобраться?
Необходимо выбирать картинку, и отображать ее до записи. Хранить двумя способами (на выбор пользователя) - в ИБ как двоичные данные, либо строкой (путь к файлу).
- Создал реквизит справочника, типа "ХранилищеЗначения"
- На форму поместил декорацию, поставил галку "Гипперсылка", чтобы отрабатывать событие по нажатию.
Вот код:

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

//======================================================================================================================
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОбновитьФотоНаСервере();    
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ

//======================================================================================================================
&НаКлиенте
Процедура ФотоНажатие(Элемент)
// Выбираем фото:
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    
    ИмяФайла = "";
    Если ПолучитьИмяФайлНаСервере(ИмяФайла) Тогда
        Диалог.ПолноеИмяФайла = ИмяФайла;
    КонецЕсли;
    
    Ответ = 0;
    Если Диалог.Выбрать() Тогда
        сп = Новый СписокЗначений;
        сп.Добавить(1, "На жестком диске");
        сп.Добавить(2, "В ИБ");
        сп.Добавить(0, "Отмена");
        
        Ответ =  Вопрос("Выберите вариант хранения файла", сп,,2);
    КонецЕсли;
    
    Если Ответ = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ПоместитьДанныеВХранилищеНаСервере(Диалог.ПолноеИмяФайла, Ответ);
    ОбновитьФотоНаСервере();
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

//======================================================================================================================
&НаСервере
Функция ПолучитьИмяФайлНаСервере(ИмяФайла)
    Данные = РеквизитФормыВЗначение("Объект").Фото.Получить();
    Если ТипЗнч(Данные) = Тип("Строка") Тогда
        ИмяФайла = Данные;
        Возврат Истина;
    КонецЕсли;
    Возврат Ложь;
КонецФункции

//======================================================================================================================
&НаСервере
Процедура ПоместитьДанныеВХранилищеНаСервере(ПутьКФайлу, Тип)
    
    ОбъектФормы = РеквизитФормыВЗначение("Объект");
    Если Тип = 1 Тогда // Храню фото на жд
        ОбъектФормы.Фото = Новый ХранилищеЗначения(ПутьКФайлу);
    ИначеЕсли Тип = 2 Тогда // Храню фото в ИБ
        ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
        ОбъектФормы.Фото = Новый ХранилищеЗначения(ДвоичныеДанные);
    КонецЕсли;
    ЗначениеВРеквизитФормы(ОбъектФормы, "Объект");

КонецПроцедуры

//======================================================================================================================
&НаСервере
Процедура ОбновитьФотоНаСервере()
    Элементы.Фото.Картинка = Новый Картинка(РеквизитФормыВЗначение("Объект").Фото.Получить());
КонецПроцедуры

Почему у меня в процедуре "ФотоНажатие()", после вызова "ПоместитьДанныеВХранилищеНаСервере(Диалог.ПолноеИмяФайла, Ответ);" хранилище все-равно имеет тип "Неопределено"?.. Я просмотрел сходные темы, все советует использовать отдельный справочник для таких нужд, это понятно, но почему нельзя сделать так?
1 holls
 
11.06.14
13:41
в процедуре ПоместитьДанныеВХранилищеНаСервере() надо записать объект
ОбъектФормы.Записать();
2 Zhuravlik
 
11.06.14
13:47
(1) Не хочу) Картинка должна отображаться до записи. Но у меня вопрос не в том, как сделать, а почему не работает?
3 holls
 
11.06.14
13:51
реквизиты объектов типа ХЗ не доступны в формах
4 GROOVY
 
11.06.14
13:53
5 holls
 
11.06.14
13:55
если нужно только отображать картинку, используйте временное хранилище
6 Zhuravlik
 
11.06.14
13:56
(4) Спасибо, разберу вечером
7 Надо работать
 
16.06.14
18:39
(4) не открывается, а что там?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн