Имя: Пароль:
1C
1С v8
Диалог выбора файла в веб-клиенте
,
0 vadymdymdym
 
09.12.17
17:12
Доброго времени суток, форумчане. Столкнулся с интересной проблемой. Имеется табличный документ и кнопка "Сохранить как". Задача: по нажатию кнопки вывести диалоговое окно сохранения файла со всеми возможными форматами, в какие только можно сохранить табличный документ и... собственно, сохранить. Казалось бы - задача элементарная. Загвоздка в том, что хочется сделать красиво. Чтобы это к тому же еще и в веб-клиенте работало. А там, как вы все прекрасно понимаете не работают синхронные методы (про подключение расширения работы с файлами молчу, т.к. это не проблема. Подключил). Т.е. метод Выбрать() ДиалогаВыбораФайла не работает. Вместо него работает метод Показать(). Ну и какая разница - спросите Вы? А разница вот в чем. Дело в том, что сохраняемые форматы табличного документа очень обширны. Так например, сохранить в формате html можно аж тремя способами (HTML3, 4 и 5), а расширение у всех одно. Т.е. когда я на выходе функции получу МассивИменФайлов (а я получу только его), то получив первый элемент массива (мой сохраняемый файл) я буду иметь ТОЛЬКО ЛИШЬ РАСШИРЕНИЕ файла (допустим, тот же htm), но я никак не смогу узнать какой же тип файла выбрал пользователь (HTML3, 4 или 5). Когда я использовал метод Выбрать() я просто на выходе проверял индекс фильтра и по нем определял тип. Но сейчас на выходе я имею только лишь имена сохраняемых файлов. Вопрос - как решить эту головоломку.
Я нашел частично решение. В дополнительные параметры обработки оповещения я передаю САМ ДИАЛОГВЫБОРАФАЙЛА. В обработке оповещения считываю индекс фильтра и вроде как все ОК. Так вот - ни хрена не работает это в веб-клиенте. ДиалогВыбораФайла считывается в обработке оповещения, но индекс фильтра ВСЕГДА РАВЕН НУЛЮ, ХОТЬ ТЫ ТРЕСНИ. Кто-нибудь сталкивался? Если нет - придется поступить как в БСП - самому рисовать форму сохранения файла
1 Сияющий в темноте
 
09.12.17
17:41
в веб клиенте код 1с транслируется в джаваскипт,и некоторые вещи могут теряться,т.к.реально показывается не диалог выбора файла,а его некоторое подобие,написанное в отдельной форме,и никто не заботился,чтобы передавать обратно параметры,используемые при вызове диалога
2 Cyberhawk
 
09.12.17
17:45
"В дополнительные параметры обработки оповещения я передаю САМ ДИАЛОГВЫБОРАФАЙЛА. В обработке оповещения считываю индекс фильтра" // Ну так в ДП передавай не ДВФ, а то, что ты из него потом планируешь использовать
3 vadymdymdym
 
09.12.17
17:48
(1) Да понятно, что транслируется, однако, диалог выбора файла - это все-таки окно операционной системы, которое можно вызвать практически из любого языка программирования. Что собственно и делает метод Выбрать() или Показать(). А асинхронность метода заключается в том, что срабатывает некий триггер по окончании, куда можно передать любой параметр. Этот параметр даже никуда не транслируется, не переходит на сервер, а остается в памяти в виде некой объектной переменной, которая потом может быть считана в вышеуказанном триггере (ну как там в переводе на JavaScript будет не знаю. Я не спец. в веб-мастерстве). Может это глюк веб-клиента, или глюк браузера (испробовано в Google Chrome)
4 vadymdymdym
 
09.12.17
17:49
(2) Я планирую использовать индекс фильтра. Вы предлагаете мне передать индекс фильтра из диалога выбора файла, который еще НЕ ПОКАЗАН ПОЛЬЗОВАТЕЛЮ? И что я получу на выходе? Тот же индекс фильтра, что и передал))
5 Cyberhawk
 
09.12.17
17:52
(4) Давай демо-пример
6 vadymdymdym
 
09.12.17
17:59
(5) Давайте, очень жду. Самому интересно, как это будет выглядеть))))
7 Сияющий в темноте
 
09.12.17
18:45
в веб клиенте диалог выбора файла реализован по-другому,и никто не обещал,что в асинхронном методе все будет сохраняться
попробуй поменять индекс до открытия диалога
очень похоже,что структура просто копируется и используется,а назад не возвращается
8 Сияющий в темноте
 
09.12.17
18:51
если взять windows структуру openfilename,то она кардинально отличается от того,что предлагает 1с,поэтому,обратно,в структуру 1с никто и ничего не транслирует
а вызов функции выбора файла возвращается после того,как диалог закрыт,правда,там есть возможность получения данных через обратный вызов,но это уже сложнее,чем в 1с
9 Cyberhawk
 
09.12.17
20:02
(6) Сливаешься или прикалываешься?
10 vadymdymdym
 
08.01.18
13:20
(9) Не сливаюсь и не прикалываюсь. Я просто не понимаю что вы от меня хотите?))
11 vadymdymdym
 
08.01.18
13:22
(7) Менял. На выходе получаю тот же индекс, что был и до открытия, как я предполагал. Похоже, что Вы правы. ДиалогВыбораФайла копируется, используется а назад не возвращается. Я получаю тот же ДВФ, что был и до открытия
12 vadymdymdym
 
08.01.18
13:25
(8) Да это понятное дело, 1С сама использует openfilename, а нам сует несколько другой объект или тот же, но обернутый в свою одежку, так сказать. Но то, что это окно операционной системы а не 1С-ное не оставляет сомнений никаких))
13 Cyberhawk
 
08.01.18
14:01
(10) Чтоб ты выложил обработку, а лучше ссылку на веб-базу, где будет видно, чего ты там хочешь
14 Мимохожий Однако
 
08.01.18
14:05
Посмотри в типовой бухгалтерии 3.0 общую форму Печать документов.
15 vadymdymdym
 
09.01.18
09:34
(14)Хорошая идея. Однако, это первое, что мне пришло в голову и что, собственно говоря, я сделал)). 1С-ники просто обошли эту проблему тем, что они сами нарисовали диалоговую форму сохранения файла, где они предлагают разные расширения, которые даже подсвечены пиктограмками, а вместо выбора файла предлагают выбор каталога (там-то проблем с расширением нет). Эта сторона фокуса мне понятна. Если совсем приспичит - конечно я так и сделаю. Но дело в том, что во-первых, я уже настроился, нарисовал код, который мне предлагает диалог выбора файла, во-вторых, форму ради этого рисовать лень (признаюсь честно). Пока что я обошел проблему так: я предлагаю РАЗЛИЧНЫЕ варианты расширения, а когда пользователь выбирает спорное расширение (ну тот же самый htm допустим), я высвечиваю выбор из списка вариантов на это расширение (HTML3, 4 или 5). Не очень хорошее решение, и если закидаете камнями - пойму))
16 vadymdymdym
 
09.01.18
09:43
(13) Я вроде бы описал мою проблему достаточно подробно. Описание не нуждается в коде)). Ну хорошо, я сейчас попробую воссоздать вам ситуацию кодом:

&НаКлиенте
Процедура СохранитьФайл()
    ДВФ = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    //описываю разные свойства ДВФ
    ДВФ.ИндексФильтра="HTML3|*.htm|HTML4|*.htm|HTML5|*,htm";
    ДВФ.Показать(Новый ОписаниеОповещения("СохранитьФайлЗавершение",ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура СохранитьФайлЗавершение(МассивФайлов,ДополнительныеПараметры) Экспорт
    Если МассивФайлов<>Неопределено Тогда
        ИмяФайла=МассивФайлов.Получить(0);
        //итак, я получил имя файла и даже расширение, но я хрен его знает какой именно тип файла выбрал пользователь. HTML3, 4 или 5. Как мне узнать???
    КонецЕсли;
КонецПроцедуры

Надеюсь, достаточно понятно теперь?))
17 patya
 
09.01.18
13:37
(16) > ДВФ.ИндексФильтра="HTML3|*.htm|HTML4|*.htm|HTML5|*,htm";

ИндексФильтра - число. Неудивительно, что у тебя не работает.