Имя: Пароль:
1C
1C 7.7
v7: Загрузка вложений с почты
,
0 Ogonechek
 
06.10.16
08:59
База 7.7 Торговля и склад, 7.70.938
Есть обработка, которая загружает заявки с почты при помощи компоненты ROM-Mail. Раньше файлы в почте хранились в формате dbf, теперь поставщик присылает данные в xls. Но не просто в xls, а в zip. Если заходить на почту через веб-интерфейс, то при нажатии на файл вложения он скачивается уже в xls. А когда делаешь это через обработку, то файл скачивается в непонятном формате такого вида. QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNjMzMi54bHM=_=.
Если на почте просто лежит файл xls, без архива, обработка скачивает файл правильно, распознает как xls.
Предположила, что проблема в кодировке, но если даже в коде обработке устанавливать кодировку, она вне зависимости от кода ставится "koi8-r". Пробовала через эту ссылку http://www.artlebedev.ru/tools/decoder/advanced/ распознать тип файл - все равно всегда набор символов пишет.
Может быть кто-то знает, как решить такую проблему? Или придется просить поставщиков присылать в xls без архива?
1 Lokli
 
06.10.16
09:23
Так скачать файл в каталог, разархивировать и открыть в Excel'е обработкой?
2 Ogonechek
 
06.10.16
09:27
В том-то и дело, что не получается скачать файл как архив.
Кусок процедуры где считывается файлик :
    Сп = СоздатьОбъект("СписокЗначений");
    
    Для Сч = 1 По ТЗ.КоличествоСтрок() Цикл
                    
        ТЗ.ПолучитьСтрокуПоНомеру(Сч);
        Если ТЗ.Пометка = 2 Тогда

            Если ВК.ПолучитьСообщение(ТЗ.НомерПисьма) = 0 Тогда
                Продолжить;
            КонецЕсли;
            
            Если ВК.КоличествоФайлов() = 0 Тогда
                Сообщить("---------------------------------");
                Сообщить("Обработано: " + Вк.Тема + ". Не обнаружен заказ в письме!!!");
            КонецЕсли;
            
            Для Инд=1 По ВК.КоличествоФайлов() Цикл
                
                ИмяФайла = ВК.ПолучитьФайл(Инд);
                Если Прав(ВРег(СокрЛП(ИмяФайла)),3) = "XLS" Тогда
                    ВК.СохранитьФайл(Инд,"");
                    
                    Конт = СокрЛП(КаталогПользователя() + ИмяФайла);
                    Сп.ДобавитьЗначение(Конт);
                    Сп.ДобавитьЗначение(ВК.АдресОтправителя);
                    Сп.ДобавитьЗначение(ВК.ДатаОтправки);
                    Сп.ДобавитьЗначение(ВК.Тема);
                    ОткрытьФормуМодально("Отчет", Сп, КаталогИБ() + "ExtForms\ЗагрузкаЗаявокГулливераИзПочтыITMaster.ert");
                    
                    Конт = Сп.ПолучитьЗначение(5);
                    
                    Сп.УдалитьВсе();                    
                    Если Конт = 1 Тогда
                        ЗаписатьВСправочник(ВК.АдресОтправителя, ВК.Тема, ВК.ДатаОтправки);
                    КонецЕсли;
                    Сообщить(?(Конт = 1, "Успешно обработан! <<", "Ошибка! Исправьте ошибки! Повторите загрузку. <<")+ Вк.Тема + ">>");
                    
                КонецЕсли;
            КонецЦикла;
            
        КонецЕсли;
    КонецЦикла;
3 Ogonechek
 
06.10.16
09:27
И если перед фразой ИмяФайла = ВК.ПолучитьФайл(Инд); посмотреть, как выглядит поле Вложения, то там будет написано именно QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNjMzMi54bHM=_=.
4 Lokli
 
06.10.16
10:01
Так у тебя там условие стоит:
....
Если Прав(ВРег(СокрЛП(ИмяФайла)),3) = "XLS" Тогда
....

т.е. у тебя обработка не качает ни какой файл кроме *.xls
5 Ogonechek
 
06.10.16
10:16
Это понятно, но если это условие убрать, то он считывает остальные файлы криво, которые на самом деле архивы. Во всяком случае, в веб интерфейсе почты около файла стоит значок ZIP.
6 Lokli
 
06.10.16
10:19
Конечно будет криво читать. ZIP - это ведь архив. К существующему условию добавь проверку на расширение zip. Если оно есть, то скачивай файл, разархивируй в файл xls и после этого открывай его в ExtForms\ЗагрузкаЗаявокГулливераИзПочтыITMaster.ert.
7 Ogonechek
 
06.10.16
10:19
В любом случае, если бы файл прочитывался нормально, то у него было бы его имя  расширением .zip.
Если бы он грузился архивом, дальше я бы просто команду системы с разархивацией запустила и все. А так-то у меня даже архива нет. А вместо него какая-то чушь.
8 Ogonechek
 
06.10.16
10:19
(6) Как я его проверю на zip?
9 Ogonechek
 
06.10.16
10:20
В конце имени файла нет ".zip".
10 Ogonechek
 
06.10.16
10:21
Я просто убрала все проверки на имя и грузила только те заявки, в которых точно есть архив и команда системы выдавала, что архив не обнаружен
11 Lokli
 
06.10.16
10:23
Ну так анализируй расширение имени файла.
...
Если Прав(ВРег(СокрЛП(ИмяФайла)),3) = "XLS" Тогда
...
...
ИначеЕсли Прав(ВРег(СокрЛП(ИмяФайла)),3) = "ZIP" Тогда
...
...
КонецЕсли;
12 Lokli
 
06.10.16
10:25
+(11) Распаковать zip можно с помощью ВК, например raruslib. 1С 7.7 это делать не умеет.
13 пипец
 
06.10.16
10:25
14 Ogonechek
 
06.10.16
10:25
Файл=ВК.КаталогВложений+ВК.ПолучитьФайл(Инд);
                Сообщить("Получен файл: "+Инд);
                //сохранение
                ВК.СохранитьФайл(Инд,);  
                Кавычка="""";
                КомандаСистемы(Кавычка+"C:\Program Files\WinRAR\WinRar.exe"+Кавычка+" x "+"-o+ "+" -IBCK "+Файл+" *.xls F:\ITMaster");
15 Это_mike
 
06.10.16
10:30
(12) это вполне может делать dialmail или 1c++ (BinaryData)
16 Ogonechek
 
06.10.16
10:32
Т.е. хотите сказать, что просто файл всегда нормально считывается, а архив нет? Практически аналогичная обработка, которая скачивает архив с почты, работает без проблем. Отличия только в том, что там почты нормальная, mail. А тут это веб-почта или как она там называется. И файл был в архиве rar. И руками тоже скачивался как архив, а тут если вручную скачиваешь, сразу xls.
17 Lokli
 
06.10.16
10:34
(16) Хотим сказать что всё нормально считывается. Не смотри поле "Вложения".
В цикле
Для Инд=1 По ВК.КоличествоФайлов() Цикл
            ИмяФайла = ВК.ПолучитьФайл(Инд);
.....
КонецЦикла;

После получения имени файла сделай Сообщить(ИмяФайла);
И посмотри какие файлы тебе покажутся.
18 Lokli
 
06.10.16
10:36
(15) Согласен, dialmail удобнее. Скачал с почты, тут же распаковал. ))
19 Ogonechek
 
06.10.16
10:42
Вот такие файлы загружаются с почты:
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNzk4NS54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+Xzc5ODYueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzYwNjUueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNzA0NS54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNjA2NC54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzcwNDYueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzEyNTQ1Lnhscw==_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfMTI1NDQueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNzA1My54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNjkyNS54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfMTQ5MjcueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNjQ2NS54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzY1NDEueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfNzU3NC54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzE0OTI4Lnhscw==_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfMTQ3NDYueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzE0NzQ3Lnhscw==_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfMTM0NTcueGxz_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNfMjc2NC54bHM=_=
Получен файл: QlNGD0YDQvNCw0L3QvtCyX9CS0JNf0KjQvg==_=_=_utf-8_B_0LrQmtC+XzEzNDU4Lnhscw==_=
=====================
Загрузка завершена!!!
20 Ogonechek
 
06.10.16
10:44
Я просто не уверена, что если я все перепишу под Dialmail, у меня файлы будут правильно считываться...
21 Lokli
 
06.10.16
10:45
(19) Кусок кода дай, который эти сообщения пишет.
22 Ogonechek
 
06.10.16
10:46
(21) Ну так тот же, что ты сказал
            Для Инд=1 По ВК.КоличествоФайлов() Цикл
                
                Файл=ВК.ПолучитьФайл(Инд);
                
                Сообщить("Получен файл: "+Файл);
23 Lokli
 
06.10.16
10:53
Ни разу не сталкивался с таким. У меня таких проблем ни когда не возникало. Список файлов всегда был правильным, вне зависимости от типов файлов (xls, mxl, xml, pdf, zip и пр.).

В СП про кодировку написано следующее:
"...автоматическое кодирование/декодирование средствами внешней компоненты доступно только для следующих кодировок: "windows-1251", "koi8-r", "koi8-u", "ibm866", "x-mac-cyrillic", "iso-8859-1"..."iso-8859-9"..."
24 Ogonechek
 
06.10.16
10:58
В том-то и дело, что все остальные файлы с почты читаются правильно... И dbf, и xls.
25 Это_mike
 
06.10.16
10:59
(20) попробовать-то? никак?
26 Lokli
 
06.10.16
11:00
Такое ощущение, что он тебе список файлов архива подсовывает в BASE64.
27 Ogonechek
 
06.10.16
11:01
(25) В процессе)
28 Lokli
 
06.10.16
11:01
(24) а можешь это же письмо прочитать с другой почты? (корпоративная, mail.ru...)
29 Ogonechek
 
06.10.16
11:02
(26) И как с этим бороться?
Декодер, который я вначале скидывала, тоже ссылался на BASE64.
30 Ogonechek
 
06.10.16
11:03
(28) Попробую на свою личную переслать и оттуда считать.
31 Lokli
 
06.10.16
11:04
(29) возникают у меня смутные подозрения, что это особенность данного почтового сервера...
32 varelchik
 
06.10.16
11:58
(0)Параллельное обсуждение в соседней ветке.
У меня оно ужо давно было реализовано с dialmail.
Там все и почта и фтп и zip.
стучись ченить придумаем.
33 Ogonechek
 
06.10.16
13:35
Спасибо всем, кто откликнулся)
Переделала обработку под Dialmail и вложения писем, которые в веб почте отображались как zip, сразу стали читаться как xls.
34 Lokli
 
06.10.16
13:55
А что за веб почта? Какой домен?
35 Ogonechek
 
06.10.16
14:08
Ну сама почта вот : http://mail.gulliver-ul.ru/
А вид интерфейса выбран RoundCube WebMail
36 Ogonechek
 
21.10.16
13:44
И снова проблемы с этой загрузкой. Переписанная обработка загружает письма, которые лежит в архиве, а обычные файлы не грузит. Код загрузки писем :

    Для Сч = 1 По ТЗ.КоличествоСтрок() Цикл
        
        ТЗ.ПолучитьСтрокуПоНомеру(Сч);
        Если ТЗ.Пометка = 2 Тогда
            
            Если ПолучениеПочты.ПолучитьПисьмо(ТЗ.НомерПисьма,0,0) = 0 Тогда
                Продолжить;
            КонецЕсли;
            
            ПолучениеПочты.РаспаковатьПисьмо();
            Если Число(ПолучениеПочты.КоличествоПрисоединенныхФайлов) = 0 Тогда
                Сообщить("---------------------------------");
            КонецЕсли;
            
            Для ф=0 по Число(ПолучениеПочты.КоличествоПрисоединенныхФайлов) цикл
                Ф2=Ф;
                
                ИмяФайла = ПолучениеПочты.ПолучитьИмяПрисоединенногоФайла(ф2);
                
                Если Прав(ВРег(СокрЛП(ИмяФайла)),3) = "XLS" Тогда
                    
                    ПолучениеПочты.СохранитьПрисоединенныйФайл(ф2);  
                    ПолучениеПочты.УдалитьПисьмоИзРабочегоКаталога();                    
                    
                КонецЕсли;                
            КонецЦикла;                
        КонецЕсли;
    КонецЦикла;
37 Ogonechek
 
21.10.16
13:53
При распаковке всегда есть 2 файла : один файл называется main.hdr, второй mail1.txt.
Те письма, где файл лежит в архиве, при распаковке содержат еще файл XLS, а в письмах, где просто присоединен файл XLS, при распаковке только 2 файла, без XLS. Думала, что это из-за того, что я их распаковываю, но без функции распаковки нельзя узнать количество файлов...
Не знаю, что и делать...=\