Имя: Пароль:
1C
 
Как получить корректный файл из чата задачи Bitrix24 в Документ Документооборота 8
0 Howaitokira
 
24.12.25
17:25
Добрый день, при получении файла в НовыйОтвет при КодСостояние = 200 файл добавляется в документ, но данные файла некорректные ( https://iimg.su/i/RruDrj ) пробовал получить ПолучитьТелоКакДвоичныеДанные() из ответа, но тогда уходит в ошибку.Я еще не особо понимаю работу с файлом и его двоичными данными, читал документацию, вроде все корректно, по одному из способов получения. За основу взял старую процедуру добавления файла и переписал под новые функции запроса битрикса чтобы получить файл из чата.

Загруженный файл в чат весит 82кб, а при получении 50кб
https://iimg.su/i/tHZBFa


Процедура ПолучитьФайлИзЗадачиНовый(ЗадачаСсылка, ЗадачаКод, Соединение, Вложения)
    
    Если Вложения = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если ЗадачаСсылка.БизнесПроцесс.Предметы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ВладелецФайла = ЗадачаСсылка.БизнесПроцесс.Предметы[0].Предмет;
    
    Если Не (ТипЗнч(ВладелецФайла)     = Тип("СправочникСсылка.ВнутренниеДокументы")
        Или ТипЗнч(ВладелецФайла)     = Тип("СправочникСсылка.ВходящиеДокументы")
        Или ТипЗнч(ВладелецФайла)     = Тип("СправочникСсылка.ИсходящиеДокументы")) Тогда
        
        ВладелецФайла = ЗадачаСсылка.БизнесПроцесс;
        
    КонецЕсли;
    
    Для Каждого Вложение Из Вложения Цикл        
        Если ТипЗнч(Вложение) = Тип("Соответствие") Тогда  
            
            ВложенныйФайл = Новый Структура;
            ВложенныйФайл.Вставить("ФайлКод",         Вложение.Получить("id"));
            ВложенныйФайл.Вставить("ФайлИмя",         Вложение.Получить("name"));
            ВложенныйФайл.Вставить("ФайлСсылка",    Вложение.Получить("urlDownload"));
        КонецЕсли;
    
        ПутьДляСохранения = КаталогВременныхФайлов() + ВложенныйФайл.ФайлИмя;
            
        Ответ = Соединение.Получить(ВложенныйФайл.ФайлСсылка, ПутьДляСохранения);
        
        Если Ответ.Кодсостояния = 302 Тогда    

            URI = ОбщегоНазначенияКлиентСервер.СтруктураURI(Ответ.Заголовки.Получить("Location"));
            
            SSL = Новый ЗащищенноеСоединениеOpenSSL();    
            Соединение = Новый HTTPсоединение(URI.Хост, URI.Порт,,,,, SSL);
            Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
            НовыйОтвет = Соединение.Получить(Запрос, ПутьДляСохранения);
            
        КонецЕсли;
        
            Если Ответ.Кодсостояния = 200 Или НовыйОтвет.Кодсостояния = 200 Тогда
                ВременныйФайл = Новый Файл(ПутьДляСохранения);    
                
                Если ВременныйФайл.Существует() Тогда
                      
                    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьДляСохранения);
                    
                    СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ВременныйФайл);
                    СведенияОФайле.АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
                    
                    Файл = РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(ВладелецФайла, СведенияОФайле);
                    
                    СоздатьЗаписьПоФайлу(ЗадачаСсылка, ЗадачаКод, Файл, ВложенныйФайл.ФайлКод);
                    
                КонецЕсли;
                
            КонецЕсли;
            
                
    КонецЦикла;
    
КонецПроцедуры


Процедура СоздатьЗаписьПоФайлу(ЗадачаСсылка, ЗадачаКод, Файл, ФайлКод)
    
    Запись = РегистрыСведений.BitrixAPI_Файлы.СоздатьМенеджерЗаписи();
    
    Запись.ЗадачаИсполнителя = ЗадачаСсылка;
    Запись.Файл = Файл;
    Запись.Код = ФайлКод;
    Запись.ЗадачаКод = ЗадачаКод;
    
    Запись.Записать(Истина);
    
КонецПроцедуры
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший