Имя: Пароль:
1C
1С v8
Мобильная платформа. Как к документу прикрепить фото из галереи?
, , , , , , ,
0 Родионовна
 
03.10.16
16:36
Здравствуйте.
Очень прошу отклика того, кто нашел решение, как к документу прикрепить фото (не сделать, а выбрать из галереи).
1. Действие = "android.intent.action.GET_CONTENT" - без утилиты акоды не взлетело, не получилось преобразовать content в uri. А ставить еще один апк - меня с этой идеей точно отправят.
2. ДиалогВыбораФайла() в 8.3.9 - это неудобный скроллинг списка изображений без разбивки по каталогам. Да и не хотелось пока в работу тестовую платформу внедрять - уже нашли существенные баги.
1 kittystark
 
03.10.16
17:02
на уровне идеи:
своим кодом пробежаться по каталогу, и на лету сгенерировать со вcякими <img src=...> HTML-код, разместив его в поле хтмл на форме
2 kittystark
 
03.10.16
17:04

&НаКлиенте
Процедура ВыбратьФайлСДискаИЗаписать()
    Перем ВыбранноеИмя;
    Перем АдресВременногоХранилища;
    Если ПоместитьФайл(АдресВременногоХранилища, "", ВыбранноеИмя, Истина) Тогда
        Объект.ИмяФайла = ВыбранноеИмя;
        ПоместитьФайлОбъекта(АдресВременногоХранилища);
    КонецЕсли;    
КонецПроцедуры

&НаСервере
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
    ЭлементСправочника = РеквизитФормыВЗначение("Объект");
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    ЭлементСправочника.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
    Файл = Новый Файл(ЭлементСправочника.ИмяФайла);
    ЭлементСправочника.ИмяФайла = Файл.Имя;
    ЭлементСправочника.Подпись = Новый ХранилищеЗначения(Неопределено, Новый СжатиеДанных());
    ЭлементСправочника.Зашифрован = Ложь;
    ЭлементСправочника.Подписан = Ложь;
    ЭлементСправочника.Записать();
    Модифицированность = Ложь;
    УдалитьИзВременногоХранилища(АдресВременногоХранилища);
    ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");    
КонецПроцедуры
3 Родионовна
 
03.10.16
17:21
(1)Спасибо за отклик. Это на крайний случай, т.к. на планшете эта идея отрабатывает очень медленно.
4 kittystark
 
03.10.16
17:25
нема за шо
ПоместитьФайл(...), не оно ?
5 Родионовна
 
03.10.16
17:28
В boss на 8.3.8 эта функция хорошо реализована - удобно и быстро. На первый взгляд через GET_CONTENT.
6 Родионовна
 
03.10.16
18:37
(4) На мобильной платформе параметр <Интерактивно> игнорируется и диалоговое окно выбора файла не отображается никогда
7 lucbak
 
03.10.16
20:41
(6) в 8.3.9 все отображается (ничего не игнорируется)
8 lucbak
 
03.10.16
20:44
Какие баги нашли ? (ХОчется знать чего ждать)
9 kittystark
 
04.10.16
09:25
(6) в (4) код рабочий - взят из реальной конфы и на моб.платформе 8.3.8.58 работает, во всяком случае под андроидом
10 Родионовна
 
04.10.16
12:06
(9) проверила еще раз на 8.3.8.58 - окно выбора не появляется. Моя выдержка в (6) из справки к платформе
(8) Например, приложение вылетает при открытии формы с таблицей типа "Дерево" или "Иерархический список".
11 lucbak
 
04.10.16
12:08
(10) не всегда надо слепо верить СП :)

Вылет а "Иерархический список" тоже заметил, на Дереве вылетов не наблюдаю.
12 newbling
 
04.10.16
12:14
Я недавно делал прикрепление файлов, могу скинуть

&НаКлиенте
Процедура Загрузить(Команда)
    // Тут с помощью НайтиФайлы() достаём один или много

ОписаниеОповещения("ОтветПользователяПродолжитьЗапись",ЭтотОбъект,МассивКартинок), "Найдено "+КолКарт+" картинок. Продолжить?",РежимДиалогаВопрос.ДаНет);
    КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура ЗагрузитьИзображенияСервер(МассивДанных)
    //пустАвтор=Справочники.Пользователи.ПустаяСсылка();
    Для Каждого ЭлемДанных Из МассивДанных Цикл
        спрНом = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",ЭлемДанных.ИмяБезРасширения);
        Если спрНом.Пустая() Тогда
            Сообщить("Не найдена номенклатура с артикулом "+ЭлемДанных.ИмяБезРасширения, СтатусСообщения.Важное);
        Иначе
            Попытка
                ПрисоединеннаяКартинка = ПрисоединенныеФайлы.ДобавитьФайл(спрНом,ЭлемДанных.ИмяБезРасширения,ЭлемДанных.Расширение,ТекущаяДата(),,ЭлемДанных.АдресФайлаВоВременномХранилище);
                ОбНом = спрНом.ПолучитьОбъект();
                ОбНом.ФайлКартинки = ПрисоединеннаяКартинка;
                ОбНом.Записать();
                Сообщить("Добавлени картинка "+ЭлемДанных.ИмяБезРасширения + ЭлемДанных.Расширение + " для номенклатуры "+спрНом.Наименование);
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;    
КонецПроцедуры
13 newbling
 
04.10.16
12:15
Ну и ессно надо накидать обработчик выбора файла чтоб красиво было, но это уже другая тема
14 newbling
 
04.10.16
12:16
ПрисоединенныеФайлы.ДобавитьФайл удобно тем, что там уже учтена возможность хранения файлов в томах на диске или внутри базы.
15 Родионовна
 
04.10.16
12:34
(11) я не доверяю, я проверяю. И на 8.3.8.68 тоже - нет интерактива.
(14) Это функционал из БСП. Меня интересует как организовать выбор изображения в мобильном приложении и получить дв.данные для дальнейшей отправки по Ws.
Через НайтиФайлы() можно вывести форму с полями html док-та для выбора пользователем нужного, но отрисовываться она будет ппц как долго
16 lucbak
 
04.10.16
13:09
(15) на 8.3.9 есть, хотя  в СП написано, что нет.
Можешь воспользоваться вот этим: http://catalog.mista.ru/public/155226/ (в принципе работает, но есть небольшая проблема с отрисовкой)
17 arsik
 
гуру
05.10.16
15:33
(0) Вообще то у меня вот такой кусок работает без всякого ACODE, т.к. он использует стандартные методы мобильной платформы и андроида.


    НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие = "android.intent.action.GET_CONTENT";
    НовВз.Тип = "image/*";
    НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY",Истина);
    РезультатРаботы = НовВз.Запустить(Истина);
    Если НЕ РезультатРаботы Тогда
        Сообщить("Файл не выбран!");
        Возврат
    иначе
        Сообщить(НовВз.Данные);
    КонецЕсли;

18 arsik
 
гуру
05.10.16
15:47
+(17) Только не найду как в дополнительных параметрах передать, что нужен множественный выбор.
19 arsik
 
гуру
05.10.16
16:12
+(18)

НовВз.ДополнительныеДанные.Добавить("android.intent.extra.ALLOW_MULTIPLE",Истина);

Никакого эффекта
20 arsik
 
гуру
05.10.16
16:20
+ (19)  Все понятно. Это ограничение стандартной галереи в андроиде.
http://stackoverflow.com/questions/31002388/android-intent-extra-allow-multiple-allows-only-single-picking
21 DitriX
 
06.10.16
12:48
(17) не вводите людей в заблуждение. В данном случае - это работает именно у ВАС, и далеко не факт, что работать будет у других.
Так как есть разные версии прошивки, есть разные версии тех же приложений и т.д.
22 arsik
 
гуру
06.10.16
14:55
(21) Ну яж почитал чуток :)
Интенты - намерения не предназначены приложению, они в систему кидаются. Там же и ищется соответствие Намерение + миме тип. И выдается список приложений какими я могу воспользоватся.
Это все работает на уровне андроида, и не важно какие приложения у меня стоят. Если есть подходящее по фильтру я его увижу в списке выбора.
23 Родионовна
 
06.10.16
16:50
(17) Я неточно изложила проблему: фото выбрать можно и оно отображается в поле типа Html документ, а вот сохранить его в двоичные данные и передать в центральную базу - увы.
НовВз.Данные- это ссылка типа content и ее в двоичные данные не преобразовать.
24 arsik
 
гуру
07.10.16
08:42
(23) Странно. У меня в
НовВз.Данные - строка типа "file:///storage/emulated/0/DCIM/Camera/IMG_20161003_151055_HDR.jpg"
Ниже приведенный код вполне себе работает.

&НаСервере
Процедура ОткрытьГалереюНаСервере(ИмяФайла)
    ДвД = Новый ДвоичныеДанные(ИмяФайла);
    хрЗначений = Новый ХранилищеЗначения(ДвД);
    Сообщить(ДвД.Размер());
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьГалерею(Команда)
    НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.intent.action.GET_CONTENT");
    НовВз.Тип = "image/*";
    НовВз.ДополнительныеДанные.Добавить("android.intent.extra.LOCAL_ONLY",Истина);
    РезультатРаботы = НовВз.Запустить(Истина);
    
    Если НЕ РезультатРаботы Тогда
        Сообщить("Файл не выбран!");
        Возврат
    иначе
        ОткрытьГалереюНаСервере(НовВз.Данные);
    КонецЕсли;
КонецПроцедуры
25 arsik
 
гуру
07.10.16
08:42
Покажи свой кусок
26 DitriX
 
07.10.16
19:51
(22) потому что ваше приложение фотографий возвращает прямой линк к файлу, а у других - через контент првайдера, а 1с не может в них.
Тут дело не в коде, а в приложениях.
27 arsik
 
гуру
07.10.16
19:58
(26) О том что проблема в обработке результата я только в (23) узнал.
Понятно что приложение может разный результат вернуть.
(23) Может поиграться с ДополнительныеДанные? Туда возможно можно передать параметр, для приложения, что бы оно возвращало ури. Но это опять затыкание дыр, т.к. на разных устройствах разные приложения могут стоять.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn