Имя: Пароль:
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) Может поиграться с ДополнительныеДанные? Туда возможно можно передать параметр, для приложения, что бы оно возвращало ури. Но это опять затыкание дыр, т.к. на разных устройствах разные приложения могут стоять.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.