Передача файлов и данных на веб-сервер средствами 1С:Предприятие 8.X методом POST

06.11.15

Интеграция - WEB-интеграция

В данной статье собран мой опыт по передаче данных на веб-сервер.

В ходе реализации одного проекта потребовалось организовать автоматическую передачу данных на веб-сервер посредством регламентного задания.
Покопавшись прежде всего в мануалах, синтаксис-помощнике 1С Предприятия, порыскав в Сети, я с удивлением обнаружил наличие отсутствия каких-либо вменяемых материалов по теме. Вернее, материалы в Сети есть, но там больше вопросы с абстрактными ответами.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Отправка данных, загрузка файлов на веб-сервер, скачивание файла 8.3.epf
.epf 33,21Kb
479
479 Скачать (1 SM) Купить за 1 850 руб.
ПросмотрИнфостарт.epf
.epf 11,76Kb
112
112 Скачать (1 SM) Купить за 1 850 руб.
Загрузка файлов на веб-сервер.epf
.epf 15,68Kb
287
287 Скачать (1 SM) Купить за 1 850 руб.

 

В статье собран мой опыт по передаче данных на веб-сервер.

В ходе реализации одного проекта потребовалось организовать автоматическую передачу данных на веб-сервер посредством регламентного задания.
Покопавшись прежде всего в мануалах, синтаксис-помощнике 1С Предприятия, порыскав в Сети, с удивлением обнаружил наличие отсутствия каких-либо вменяемых материалов по теме. Вернее, материалы в Сети есть, но там больше вопросы с абстрактными ответами.

Все нижеприведённые примеры кода всего лишь примеры, хоть и взяты из рабочей конфигурации.

Для передачи данных на сервер методом POST в 1С Предприятии 8.X применяется метод HTTPСоединение

ОтправитьДляОбработки(<Источник>, <Адрес ресурса>, <Имя выходного файла>, <Заголовки>)

(подробнее см. СП)

Прежде всего необходимо создать файл отправки данных (собственно содержимое POST-запроса) и, при необходимости, подготовить двоичные данные.
Определяем разделитель разделов — границу boundary в POST-запросе в формате RFC (подробнее MIME: Организация данных ). В качестве границы может быть использована строка, состоящая из латинских букв и цифр.
Чтобы ничего не выдумывать, воспользуемся штатным классом 1С Предприятия УникальныйИдентификатор.

   

//Подготовка переменных 
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); 

//Определяем имя файла ответа от веб-сервера. 
ИмяФайлаОтвета = КаталогВременныхФайлов() + "answer.tmp"; 



Содержимое файла ответа будет представлять собой какой-либо контент, отданный скриптом на стороне веб-сервера агенту пользователя. Подробнее смотрите пример скрипта php ниже.

Подготавливаем двоичные данные. В моём случае это файл архива zip, но может быть что угодно, хоть изображение.

//Какой-то ранее созданный файл с двоичными данными. 
ИмяФайлаДляЗагрузки = "data.zip"; 




Передача содержимого файла
В 1С Предприятии отсутствуют средства чтения двоичных файлов в обычную строку, как в PHP или PERL.
Одним из способов формирования строкового содержимого двоичного файла является кодирование с помощью штатных функций Base64Строка() или XMLСтрока().
!! Имейте в виду, кодирование по Base64 увеличивает размер передаваемых данных примерно на 30%.
Декодировать содержимое файла на сервере можно при помощи функции php base64_decode() или аналогичных для используемого вами серверного ПО.

Другой способ состоит в использовании штатной функции ОбъединитьФайлы(, ) (подробнее см. в СП). В этом случае формирование файла POST-запроса будет происходить немного сложнее.
Оба способа описаны ниже.

Впрочем, двоичные данные лучше закодировать, иначе при приёме на веб-сервере файл может быть повреждён или не принят вовсе, если он будет содержать URL-значащие символы.

Следует также помнить об ограничениях хостинга и контролировать размер передаваемых данных. Как правило, для php это 2Мб. (см. файл /usr/local/php5/php.ini)
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M


В противном случе, на веб-сервере вы получите пустой POST-запрос.

   

//Если файл кодируется 
    //Закодируем содержимое файла по Base64, то есть преобразуем его к URL-неактивному виду. 
    //Base64 - специальный формат хранения данных в текстовом формате 
    СодержимоеФайла = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДляЗагрузки)); 

    //Проверка размера кодированного файла. 
    Если СтрДлина(СодержимоеФайла) > ДопустимыйРазмерФайлаВБайтах Тогда 
        //Какие-то ваши действия, возможно 
        Возврат; 
    КонецЕсли; 

    //Если файл не кодируется 
    //Проверка размера обычного файла. 
    Файл = Новый Файл(ИмяФайлаДляЗагрузки); 
    Если Файл.Размер() > ДопустимыйРазмерФайлаВБайтах Тогда 
        //Какие-то ваши действия, возможно 
        Возврат; 
    КонецЕсли; 

    ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt"; 



Создаём файл отправки или содержимое POST-запроса.

Вариант с передачей кодированного файла.


    

КодироватьФайл = Истина; 
    ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь); 
    //Определяем раздел двоичных данных 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
    //Указываем имя файла для передачи 
    //На сервере оно появится в массиве $_FILES['datafile']['name'] 
    ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""datafile""; filename=""" + ИмяФайлаДанных + """"); 
    //Указываем тип передаваемых данных. 
    //С таким же успехом в Content-Type можно указать application/x-octet-stream 
    ФайлОтправки.ЗаписатьСтроку("Content-Type: application/x-zip-compressed" + Символы.ПС + Символы.ПС); 
    //Записываем кодированные двоичные данные 
    ФайлОтправки.ЗаписатьСтроку(СодержимоеФайла); 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 

    //Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы. 

    //Соответствует полю HTML-формы input type="submit" name="submit" value="Submit" / 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС); 
    ФайлОтправки.ЗаписатьСтроку("1"); 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 

    //Соответствует полю HTML-формы input type="checkbox" name="decode" value="decode" / 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""decode""" + Символы.ПС); 
    ФайлОтправки.ЗаписатьСтроку(?(КодироватьФайл, "1", "0")); 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 

    //Соответствует полю HTML-формы input type="text" name="some_field" value="Some text" / 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
    ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""message""" + Символы.ПС); 
    ФайлОтправки.ЗаписатьСтроку("Передача файла из базы данных 1С Предприятия"); 

    //Завершение сообщения для сервера 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--"); 

    ФайлОтправки.Закрыть(); 




Вариант с передачей обычного файла.


    

КодироватьФайл = Ложь; 
    //Определяем массив для процедуры ОбъединитьФайлы 
    МассивФайловДляОбъединения = Новый Массив; 

    //Формируем начальный фрагмент файла POST-запроса 
    ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt"); 
    ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь); 
    //Определяем раздел двоичных данных 
    ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary); 
    //Указываем имя файла для передачи 
    //На сервере оно появится в массиве $_FILES['datafile']['name'] 
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""datafile""; filename=""" + ИмяФайлаДляЗагрузки + """"); 
    //Указываем тип передаваемых данных. 
    //С таким же успехом в Content-Type можно указать application/x-octet-stream или application/x-zip-compressed 
    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: application/x-octet-stream"); 
    ФайлОтправкиНачало.ЗаписатьСтроку(""); 
    ФайлОтправкиНачало.Закрыть(); 

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало); 

    //Копируем файл для загрузки во временный и добавляем в массив файлов для объединения 
    ИмяФайлаДляЗагрузкиВременный = ПолучитьИмяВременногоФайла("tmp"); 
    КопироватьФайл(ИмяФайлаДляЗагрузки, ИмяФайлаДляЗагрузкиВременный); 
    МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременный); 

    //Формируем конечный фрагмент файла POST-запроса 
    ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt"); 
    ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь); 

    //Завершение раздела двоичных данных 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 

    //Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы. 

    //Соответствует полю HTML-формы input type="submit" name="submit" value="Submit" / 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 
    ФайлОтправкиКонец.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС); 
    ФайлОтправкиКонец.ЗаписатьСтроку("1"); 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 

    //Соответствует полю HTML-формы input type="checkbox" name="decode" value="decode" / 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 
    ФайлОтправкиКонец.ЗаписатьСтроку("Content-disposition: form-data; name=""decode""" + Символы.ПС); 
    ФайлОтправкиКонец.ЗаписатьСтроку(?(КодироватьФайл, "1", "0")); 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 

    //Соответствует полю HTML-формы input type="text" name="some_field" value="Some text" / 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 
    ФайлОтправкиКонец.ЗаписатьСтроку("Content-disposition: form-data; name=""message""" + Символы.ПС); 
    ФайлОтправкиКонец.ЗаписатьСтроку("Передача файла из базы данных 1С Предприятия"); 
    //Завершение сообщения для сервера 
    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--"); 
    ФайлОтправкиКонец.Закрыть(); 

    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец); 

    //Теперь сформированные фрагменты сообщения для сервера объединяем в один файл POST-запроса 
    ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки); 




Формируем заголовок POST-запроса.


    

ЗаголовокHTTP = Новый Соответствие(); 
   //Обязательные поля заголовка      
   //Укажем формат данных Content-Type 
    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary); 

    //Укажем длину POST-запроса Content-Length 
    ФайлОтправки = Новый Файл(ИмяФайлаОтправки); 
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); 
    ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
    //При необходимости зададим Referer, например таким образом 
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы(); 
    СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref"); 
    ЗаголовокHTTP.Вставить("Referer", СерверИсточник);



Если вы получите ошибку сервера вида Failed sending data to the peer, попробуйте убрать параметр Referer из заголовка.

Инициализируем HTTPСоединение. При необходимости задаём параметры прокси. 


    

СерверПриемник = "www.some_site.ru"; //Естественно, следует указать свой адрес. 
    Порт = "80"; //Это общепринятый порт. Возможно, для вашего сервера применяется другой. Конкретное значение уточните у хостера. 

    //ИспользоватьПрокси - какая-то логическая переменная, может быть значение флажка на форме или переключатель 
    Если ИспользоватьПрокси Тогда 
        Прокси = Новый ИнтернетПрокси; 
        Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; 
        Прокси.Пароль = "ПарольПрокси"; // укажите своё значение 
        Прокси.Пользователь = "ПользовательПрокси"; // укажите своё значение 
        НТТР = Новый HTTPСоединение( СерверПриемник , Порт, , , Прокси); 
    Иначе 
        НТТР = Новый HTTPСоединение( СерверПриемник , Порт); 
    КонецЕсли; 




Собственно, отправка данных серверу.


    

АдресСкрипта = "some_script.php"; //Естественно, следует указать имя своего скрипта. 
    Попытка 
        НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСкрипта, ИмяФайлаОтвета, ЗаголовокHTTP); 
    Исключение 
        //Пример обработки ошибки соединения. 
        #Если Клиент Тогда 
            Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки()); 
        #Иначе 
            ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Неудачная попытка соединения: " + ОписаниеОшибки()); 
        #КонецЕсли 
        Возврат; 
    КонецПопытки; 

    //Удаляем файлы POST-запроса и фрагменты сообщения. Больше они не нужны 
    УдалитьФайлы(ИмяФайлаОтправки); 
    Если НЕ КодироватьФайл Тогда 
        Для каждого ЭлементМассива Из МассивФайловДляОбъединения Цикл 
            УдалитьФайлы(ЭлементМассива); 
        КонецЦикла; 
    КонецЕсли; 



Отправили данные, анализируем ответ сервера. 


    

ФайлОтвета = Новый Файл(ИмяФайлаОтвета); 
    Если ФайлОтвета.Существует() Тогда 
        ТекстОтвета = Новый ТекстовыйДокумент(); 
        ТекстОтвета.Прочитать(ИмяФайлаОтвета); 
        Если ТекстОтвета.КоличествоСтрок() > 0 Тогда 
            ОтветСервера = ТекстОтвета.ПолучитьТекст(); 
            #Если Клиент Тогда 
                Сообщить(ОтветСервера); 
            #КонецЕсли 
        Иначе 
            #Если Клиент Тогда 
                Сообщить("Отправка файла на сервер: Получен пустой ответ сервера."); 
            #Иначе 
                ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Получен пустой ответ сервера."); 
            #КонецЕсли 
        КонецЕсли; 

        //Удалим файл ответа. Больше он нам не нужен. 
        УдалитьФайлы(ИмяФайлаОтвета); 
    Иначе 
        #Если Клиент Тогда 
            Сообщить("Отправка файла на сервер: Ответ сервера не получен."); 
        #Иначе 
            ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера не получен."); 
        #КонецЕсли 
КонецЕсли; 



Подробную реализацию отправки файла с кодированием и без кодирования смотрите в приложенной обработке Загрузка файлов на веб-сервер.epf. 

И наконец, примерное содержимое скрипта-приёмника данных на веб-сервере "some_script.php". Скрипт вы также можете извлечь из макета обработки.

//Coded by Sergey aka Porutchik http://forum.aeroion.ru
//http://forum.aeroion.ru/topic446.html

//Читаем текстовые данные POST-запроса
$submit = ( isset($_POST['submit']) ) ? intval($_POST['submit']) : false;
$decode = ( isset($_POST['decode']) ) ? intval($_POST['decode']) : false;
$message = ( isset($_POST['message']) ) ? htmlspecialchars($_POST['message']) : '';

//Проверим user-agent, хотя большого толку от такой проверки нет. См. статью.
if ( $_SERVER['HTTP_USER_AGENT'] != '1C+Enterprise/8.1' )
{
    @
header('HTTP/1.0 403 Forbidden');
    die(
'Hacking attempt');
}

if ( 
$submit )
{
    
//Здесь работаем с содержимым переданного файла.
    
$uploadFile $_FILES['datafile'];
    
$tmp_name $uploadFile['tmp_name'];
    
$data_filename $uploadFile['name'];
    if ( !
is_uploaded_file($tmp_name) ) 
    {
        die(
'Ошибка при загрузке файла ' $data_filename);
    } 
    else 
    {
        
//Считываем файл в строку
        
$data file_get_contents($tmp_name);

        if (
$decode)
        {
            
//При необходимости декодируем данные
            
$data base64_decode($data);
        }
        
//Теперь нормальный файл можно сохранить на диске
        
if ( !empty($data) && ($fp = @fopen($data_filename'wb')) )
        {
            @
fwrite($fp$data);
            @
fclose($fp);
        }
        else
        {
            die(
'Ошибка при записи файла ' $data_filename);
        }
        @
header('HTTP/1.1 200 Ok');
        @
header('Content-type: text/html; charset=windows-1251');
        
$answer "\n" 'Файл $data_filename ' успешно загружен. ' "\n" 'Переданное сообщение: ' $message;
        print (
$answer);
    }
}
?>

В завершение статьи процитирую. 

Обращаю ваше внимание, что указанная здесь методика освещает возможность загрузки файлов на сервер. Использование их "в чистом виде" без доработки может быть небезопасным, и является потенциальной возможностью для взлома вашего сайта. А именно, отсутствие обработки имени файла, который пришел на сервер, отсутствие авторизации, определения источника, посылающего файл, может дать злоумышленнику возможность загрузить и выполнить вредоносный код на вашем сайте. Рассмотрение способов защиты не входит в данную статью и остается на ваше усмотрение.

Список использованной литературы:

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    17780    19    22    

16

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    19845    13    17    

16

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    14421    42    8    

18

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    1169    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. support 4453 16.05.09 15:53 Сейчас в теме
Хорошая и полезная статья.
2. Serj1C 483 18.05.09 08:44 Сейчас в теме
А как отправить простой POST запрос без файла?
Например, авторизация на infostart.
3. Поручик 4692 18.05.09 09:39 Сейчас в теме
Вот так и отправить. Выкидываешь из файла отправки или содержимого POST-запроса лишнее, то что относится к двоичным данным или файлам, и отправляешь.

Изучай матчасть по генерации HTTP запросов, ссылки я для чего дал?
4. Поручик 4692 18.05.09 18:04 Сейчас в теме
От нечего делать, пока у нас сервер лежал, накатал обработку, иллюстрирующую пример POST-запроса без файлов.

В качестве сайта - подопытного кролика выбран инфостарт
Скачать http://forum.aeroion.ru/download.php?id=165
korablev64; Asdam; Serj1C; +3 Ответить
5. Serj1C 483 18.05.09 20:50 Сейчас в теме
(4) Спасибо, теперь можно изучать
6. ValentinV 25.05.09 11:29 Сейчас в теме
Почему таким сложным путем?
7. Поручик 4692 25.05.09 19:54 Сейчас в теме
Лёгкие пути в студию. Про передачу по ftp знаю, не тот в данном случае путь.
8. мх 16 11.08.09 14:33 Сейчас в теме
Можно ли как-то передать файл на сервер из 7.7 ?
84. пользователь 05.04.21 12:58
Сообщение было скрыто модератором.
...
9. Поручик 4692 11.08.09 14:39 Сейчас в теме
Можно. Только я от клюшек давно отошёл, забыл её как страшный сон, и даже искать что-то по ней неохота. Гугл вам поможет.
10. lsp71 10.09.09 15:47 Сейчас в теме
Спасибо за доходчивое объяснение
11. Gabi 29.10.09 11:01 Сейчас в теме
Спасибо вам большое за POST запрос.
Но у меня не получается отправить этот POST запрос вроде сделала все как описано выше. Запрос доходит, но без файла.
Все выглядит так :

СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(АрхивФайлаZIP));

ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ);

ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""key""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("11111");
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""dump""; filename=""" + СчетчикВыгрузок+".zip" + """");
ФайлОтправки.ЗаписатьСтроку("Content-Type: application/x-zip-compressed" + Символы.ПС + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(СодержимоеZIP);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);

ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("Загрузить");
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.Закрыть();

Пожалуйста помогите что не так?
12. Поручик 4692 29.10.09 16:51 Сейчас в теме
Сделать именно так, как в примере формирования содержимого POST-запроса. Имейте в виду, этот код практически полностью приведён из рабочей конфигурации.
Посмотреть содержимое массива $_FILES, $_POST на сервере.
В конце концов, проверить размер передаваемых данных.
13. Mopnex03 3 05.11.09 05:45 Сейчас в теме
Ошибка работы с Интернет: server returned nothing (no headers, no data)
Такая ошибка вылетает... В чем проблема? Код взят из этой статьи.
 Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); 
   Содержимое = Base64Строка(Новый ДвоичныеДанные(Каталог+"upload.xml")); 

   ИмяФайлаОтправки = Каталог+"post.txt"; 
    ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ); 

    //Определяем раздел двоичных данных 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 
    //Указываем имя файла для передачи 
    ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""uploadfile""; filename=""upload.xml"""); 
    //Указываем тип передаваемых данных. 
    //С таким же успехом в Content-Type можно указать application/x-octet-stream 
    ФайлОтправки.ЗаписатьСтроку("Content-Type: application/octet-stream" + Символы.ПС + Символы.ПС); 
    //Записываем кодированные двоичные данные 
    ФайлОтправки.ЗаписатьСтроку(Содержимое); 
    ФайлОтправки.ЗаписатьСтроку("--" + Boundary); 

    ФайлОтправки.Закрыть(); 

   //Формируем заголовок POST-запроса. 

   ЗаголовокHTTP = Новый Соответствие(); 
   //Укажем формат данных Content-Type 
   ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary); 
    
   //Укажем длину POST-запроса Content-Length 
   ФайлОтправки = Новый Файл(ИмяФайлаОтправки); 
   РазмерФайлаОтправки = ФайлОтправки.Размер(); 
   ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки); 
    
   //Инициализируем HTTPСоединение. При необходимости задаём параметры прокси. 
    
   НТТР = Новый HTTPСоединение(Сервер, Порт);      
    
   //Собственно, отправка данных серверу. 
    
   АдресСкрипта = "upload.php"; //Естественно, следует указать имя своего скрипта. 
   Попытка 
      НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСкрипта, Каталог+"upload.tmp", ЗаголовокHTTP); 
   Исключение 
         Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки()); 
   КонецПопытки;
Показать
14. softmaker 41 25.12.09 12:57 Сейчас в теме
Пример реализации, используя, 1С:Предприятие 7.7 здесь.
15. FFelix 497 10.03.10 19:49 Сейчас в теме
Попробовал, работает. Спасибо! :)
16. Valerikk 14.05.10 17:42 Сейчас в теме
Здравствуйте.
Возникла проблемка:
если выполнять на стороне клиента, все нормуль;
но если то же самое делать на стороне сервера (регл. заданием), приходит пустой ПОСТ на сервер :( . ФайлОтправки и файл данных - идентичны.
Посоветуйте, плиз, где искать косяк...
17. Поручик 4692 14.05.10 18:01 Сейчас в теме
(16) Похожая проблема
http://www.forum.mista.ru/topic.php?id=476078

Ишите косяк или на веб-сервере или на сервере 1С, а то и на обоих.
18. tor0310 23.06.11 19:09 Сейчас в теме
Поручик пишет:
Лёгкие пути в студию. Про передачу по ftp знаю, не тот в данном случае путь.

Действительно, более легкие пути шли не туда. Этот работает. Спасибо
19. lena9push 07.09.11 17:39 Сейчас в теме
Отличная статья, спасибо!

Единственное возник вопрос.
Переводя текст в Base64 методом:
СодержимоеZIP = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаДанных));
Как сделать обратное??
Т.е. из Base64 перевести в исходный текст???
20. cool.vlad4 2 07.09.11 17:42 Сейчас в теме
(19)Base64Значение(СодержимоеZIP)...советую воспользоватся справкой в 1С
21. lena9push 07.09.11 18:05 Сейчас в теме
cool.vlad4, да, спасибо большое. Но на выходе будут двоичные данные, а их как преобразовать к исходнику?
(извиняюсь за нубство, просто уже устала искать))
22. cool.vlad4 2 07.09.11 18:21 Сейчас в теме
(21) ДвоичныеДанные.Записать(ИмяФайла), да ничего страшного, я просто имею ввиду, что быстрее такие вопросы в поиске посмотреть, ведь все методы и свойства помнить невозможно. В конфигураторе нажимаете F1, вводите в поиске ДвоичныеДанные и находите ответ на свой вопрос. Также рекомендую использовать (если есть конфигурация, типовая к примеру) поиск по конфигурации и смотреть как это сделано там.
23. softest 08.12.11 19:59 Сейчас в теме
А как использовате Get метод
24. softest 08.12.11 20:01 Сейчас в теме
И как можно передать куки с одной сесии в другую или єто невозможно, или вытянуть куки из браузера?
25. ltfriend 13.04.12 19:06 Сейчас в теме
(24) softest, для работы с куки можно использовать WinHttpRequest
как-то так (писалось на скорую руки, возможны ошибки, но смысл, думаю, понятен)
Соединение = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
Соединение.SetRequestHeader("Cookie", "value1=abs;value2=xyz");
Соединение.Open("GET", "www.mysite.com");
Соединение.Send();

ЗаголовкиОтвета = Соединение.GetAllResponseHeaders();

Cookie = Новый Структура;

МассивЗаголовков = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ЗаголовкиОтвета, Символы.ПС);

Для каждого Заголовок Из МассивЗаголовков Цикл

  Если Лев(Заголовок, 11) = "Set-Cookie:" Тогда

    СтрокаCookie = СокрЛП(Сред(Заголовок, 12));
    Поз = Найти(СтрокаCookie, "=");
    ИмяCookie = СокрЛП(Лев(СтрокаCookie, Поз-1));
    ЗначениеCookie = СокрЛП(Сред(СтрокаCookie, Поз+1));
    Cookie.Вставить(ИмяCookie, ЗначениеCookie);

  КонецЕсли;

КонецЦикла;
Показать
kote; _nk_; greencactus2013; +3 Ответить
26. ltfriend 13.04.12 19:12 Сейчас в теме
А вообще можно файлы передавать как есть в виде двоичных данных с помощью процедуры "ОбъединитьФайлы"
ИмяФайла1 = ПолучитьИмяВременногоФайла("txt");

ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла1);
ЗаписьТекста.ЗаписатьСтроку("--"+boundary);
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""archive.zip""");
ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/x-zip-compressed");
ЗаписьТекста.ЗаписатьСтроку("");
ЗаписьТекста.Закрыть();

ИмяФайла2 = ПолучитьИмяВременногоФайла("txt");

ЗаписьТекста = Новый ЗаписьТекст(ИмяФайла2);
ЗаписьТекста.ЗаписатьСтроку("");
ЗаписьТекста.ЗаписатьСтроку("--"+boundary+"--");
ЗаписьТекста.Закрыть();

ИмяФайлаОтправки = ПолучитьИмяВременногоФайла("out");

МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ИмяФайла1);
МассивФайлов.Добавить(ИмяФайлаСДанными);
МассивФайлов.Добавить(ИмяФайла2);

ОбъединитьФайлы(МассивФайлов, ИмяФайлаОтправки);

....
HTTP.ОтправитьДляОбработки(ИмяФайлаОтправки, "uploadfile.php", ИмяВходящегоФайла, Заголовки);
....
Показать
andrey-prog; kote; baobingo; +3 Ответить
27. Поручик 4692 13.04.12 19:23 Сейчас в теме
(26) А вы пробовали? Данные точно попадают в массив $_FILES на сервере?
28. ltfriend 13.04.12 19:25 Сейчас в теме
(27) пробовал. И со своим сайтом. И на стену ВКонтакте таким способом картинки загружаются без проблем.
29. Поручик 4692 14.04.12 01:31 Сейчас в теме
(28) Очень интересно. Знать бы этом когда делал проект или догадаться проверить. В этом случае статья могла и не появиться на свет.
30. vlad.frost 186 25.04.12 12:29 Сейчас в теме
Нужно ещё прокомментировать, как правильно формировать boundary в соответствии с RFC http://ru.wikipedia.org/wiki/MIME#.D0.9E.D1.80.D0.B3.D0.B0.D0.BD.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85

Для передачи множественного сообщения в заголовок Content-Type добавляется параметр boundary (граница), который обозначает последовательность символов, разделяющих части сообщения. Граница может состоять из цифр, букв и символов «'()+_,-./:=?». При использовании специальных символов (не цифр и букв) значение параметра boundary следует заключать в двойные кавычки «"». Максимальная длина границы — 70 символов.
Начало каждой части сообщения обозначается строкой «--boundary». Конец последнего сообщения обозначается строкой «--boundary--». Самые первые символы переноса строки CRLF (коды 13 и 10), которыми начинаются и заканчиваются пограничные строки не входят в содержимое самой части. Если за ними следуют ещё переносы строк, то они уже принадлежат включаемой части.


В моём случае долго не получалось увидеть на стороне сервера что-либо в массиве $_FILES пока я не догадался вставить ещё один перенос строки в самое начало отправляемого файла (так называемая преамбула):

Функция СформироватьФайлДляОтправки(ГраницаСекций)
	
	Попытка
		
		ИмяФайлаДляОтправки = ПолучитьИмяВременногоФайла("xml");
		ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаДляОтправки );
		ФайлОтправки.ЗаписатьСтроку(""); // <--- вот она, недостающая строка
		ФайлОтправки.ЗаписатьСтроку("--" + ГраницаСекций);
		ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""userfile""; filename=""" + ИмяФайлаДляОтправки + """");
		ФайлОтправки.ЗаписатьСтроку("Content-Type: text/xml");
		ФайлОтправки.ЗаписатьСтроку("");
		ФайлОтправки.ЗаписатьСтроку(ПолучитьДанные());
		ФайлОтправки.ЗаписатьСтроку("--" + ГраницаСекций + "--"); // <--- в конце обязательно указываем удвоенный дефис "--", как предписывает стандарт
				
		ФайлОтправки.Закрыть();
		
	Исключение
		ЗаписьЖурналаРегистрации("IGCDMS", УровеньЖурналаРегистрации.Ошибка, , , 
		"Не удалось сформировать файл для отправки: " + ОписаниеОшибки());
		Возврат "";
	КонецПопытки;
	
	Возврат ИмяФайлаДляОтправки;
	
КонецФункции
Показать
subbotinpu; kobayoshi; seveiven; andrey-prog; anuar_medeup; Danil.Potapov; Boroda444; GusevNA; tumr; Arc; finder; +11 Ответить
31. borrman 09.06.12 01:06 Сейчас в теме
Спасибо большое за статью!
Очень выручили!

Есть, правда, вопрос:
использование Base64 продиктовано тем, что данные могут содержать HTML-значимые символы? И я должен использовать кодирование base64 только в случае, если сервер производит декодирование, верно? Если же сервер этого не делает, то я могу отправлять текст файла как он в файле записан.

(30)
У меня заработало без первой пустой строки.
32. Поручик 4692 09.06.12 08:28 Сейчас в теме
(31) В посте (26) написано, как обойтись без Base64.
33. borrman 09.06.12 14:02 Сейчас в теме
(32) Я использовал текстовый документ для получения текста.
81. seveiven 09.07.20 01:45 Сейчас в теме
(30)
4 дня я убил на эту херню, пока не наткнулся на твой коммент. Спасибо тебе огромное. Я уже хотел плюнуть на это дело, и просто сделать прокси-скрипт на php... Как вот можно догадаться что дело именно в этой гребаной строке, я честно не понимаю, но в моем случае сработало
vlad.frost; +1 Ответить
34. Поручик 4692 26.01.13 11:59 Сейчас в теме
Надо бы переработать статью с учетом рекомендаций.
35. Wrols 90 07.02.13 19:10 Сейчас в теме
При загрузке на сайт получал ошибку от ОтправитьДляОбработки Failed sending data to the peer.

Оказалось, что проблема с параметром HTTP заголовка:
ЗаголовокHTTP.Вставить("Referer", СерверИсточник);

Двое из трех хостингов плевали на этот параметр, а zenon выдавал упомянутую выше ошибку.

Поручик, уберите этот параметр из статьи, чтоб другие не сталкивались с такой проблемой.
36. Поручик 4692 02.03.13 02:03 Сейчас в теме
Статья переработана с учетом комментариев и приложена новая обработка с примерами отправки файла на сервер двумя способамии.
37. K0Tu 18.04.13 16:23 Сейчас в теме
Доброго дня. Информация очень интересна и полезна, спасибо автору. Но у меня возникает вопрос. Админ или программист на стороне сайта(я на стороне 1С программиста) требует от меня вставить в POST строку "pass=тут_пароль", куда конкретно вставить он не может сказать в заголовок ли в ФайлОтправки или еще куда. Подскажите, пожалуйста, куда этот реквизит вставить?
38. Поручик 4692 18.04.13 18:25 Сейчас в теме
(37) В файл отправки. Пример смотрите в обработке, там всё есть.
39. lazorik 2 30.07.13 17:44 Сейчас в теме
Доброе время суток!
я все прописываю как написано у вашей статье, но никак не получается отправить запрос, постоянно пустой POST массив отправляется... Можете помочь? Спасибо
40. Поручик 4692 30.07.13 20:29 Сейчас в теме
(39) скачайте любую из приложенных обработок, они все рабочие.

помощь платная.
66. Mails79 13 20.05.16 07:48 Сейчас в теме
(39) lazorik,
Уже наверно неактуально.
В моём случае долго не получалось увидеть на стороне сервера что-либо в массиве $_FILES пока я не догадался вставить ещё один перенос строки в самое начало отправляемого файла (так называемая преамбула):
ФайлОтправки.ЗаписатьСтроку(""); // <--- вот она, недостающая строка
41. lazorik 2 30.07.13 21:30 Сейчас в теме
Спасибо.Я попробовал пользоваться ваши обработки, но результат тот же.Может сталкивались с подобной проблемой, что пустой запрос отправляет?
42. vlad.frost 186 30.07.13 22:39 Сейчас в теме
(41) Обратите внимание на мой комментарий в этом обсуждении (30)
43. svilsa 12 04.09.13 15:41 Сейчас в теме
спасибо, очень нужная информация
44. Open-BS 3 12.09.13 14:32 Сейчас в теме
Коллеги, а с чем может быть связана ошибка
Ошибка при вызове метода контекста (ОбъединитьФайлы): Ошибка сборки файла
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
по причине:
Ошибка сборки файла
по причине:
Ошибка совместного доступа к файлу 'C:\Users\Obr\AppData\Local\Temp\2\v8_58C6_75.txt'
45. Поручик 4692 12.09.13 14:46 Сейчас в теме
(44) Она может быть связана с ошибкой совместного доступа к файлу 'C:\Users\Obr\AppData\Local\Temp\2\v8_58C6_75.txt'
46. Open-BS 3 12.09.13 15:06 Сейчас в теме
(45) да я догадалась) А это было связано с тем, что был забыт метод ФайлОтправкиСередина.Закрыть(); Ну и в общем, если один из кусков собираемого файла не закрыт, его и объединить не получится, что логично.
47. kuza_87 28 11.12.13 13:29 Сейчас в теме
в 8.3 Механизм теперь другой. Нет примера обработки с механизмом на 8.3?
48. Поручик 4692 11.12.13 13:33 Сейчас в теме
(47) Сделаю. Пятьсот рублей будет стоить.
49. kuza_87 28 11.12.13 18:24 Сейчас в теме
(48) Спасибо, уже сам сделал)))
50. Поручик 4692 23.01.14 08:09 Сейчас в теме
Добавлена обработка для платформы 8.3. в режиме управляемого приложения
51. A2004333 7 24.02.14 10:00 Сейчас в теме
Мне пришлось добавить перевод строки перед Баундэри, который сразу за двоичными данными. После двоичных данных у меня больше никаких разделов не было, поэтому этот же Баундэри стал последним.

Оригинальный код автора:
ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--");

Мой код:
ФайлОтправкиКонец.ЗаписатьСтроку(Символы.ПС+"--" + Boundary + "--");

Большое спасибо автору за статью! Поставил плюс!
52. Поручик 4692 24.02.14 10:30 Сейчас в теме
(51) Этот вариант статьи давно устарел, но заливать новый нет желания, так как двиг сайта курочит оформление по-своему, то есть вся работа под хвост. Новая версия находится на моём сайте.
53. Поручик 4692 11.06.14 23:54 Сейчас в теме
Статья порядком устарела.
Обновил обработку Отправка данных и загрузка файлов на веб-сервер 8.3.epf, в которой реализовано скачивание файлов с почти любого сайта, в том числе Google Drive, показаны методы работы с отсылкой и получением HTTP-заголовков, работа с перенаправлением (редиректом), кукисами (cookies) и некоторые другие. Всё для платформы 8.3.
54. RustIG 1747 03.07.14 14:17 Сейчас в теме
(0) спасибо за столь обширное описание
55. Arc 46 16.10.14 15:15 Сейчас в теме

По мотивам статьи. Коротенькая функция, отправляющая файлы и данные через POST без создания временных файлов.
Функция ХТТПЗапросПост(АдресСайта,АдресРесурса,ДанныеЗапроса)
	ТекстДляОтправки = "";
	Boundary = Строка(Новый УникальныйИдентификатор());
	
	НомерФайла = 0;
	Для Каждого Элемент Из ДанныеЗапроса Цикл
		ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary + Символы.ПС;
		Если ТипЗнч(Элемент.Значение) = Тип("ДвоичныеДанные") Тогда 
			НомерФайла = НомерФайла + 1;
			ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name=""file"+НомерФайла+"""; filename=""" + Элемент.Ключ + """" + Символы.ПС;
			ТекстДляОтправки = ТекстДляОтправки + "Content-Type: application/x-octet-stream" + Символы.ПС;
			Данные = Base64Строка(Элемент.Значение);			
		Иначе	
			ТекстДляОтправки = ТекстДляОтправки + "Content-Disposition: form-data; name="""+Элемент.Ключ+"""" + Символы.ПС;
			Данные = Строка(Элемент.Значение);
		КонецЕсли;	
		ТекстДляОтправки = ТекстДляОтправки + Символы.ПС;
		ТекстДляОтправки = ТекстДляОтправки + Данные + Символы.ПС;
		ТекстДляОтправки = ТекстДляОтправки + "--"+Boundary + Символы.ПС;
	КонецЦикла;	
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
	Заголовки.Вставить("Content-Lenght", XMLСтрока(СтрДлина(ТекстДляОтправки)));
	Запрос = Новый HTTPЗапрос(АдресРесурса,Заголовки);
	Запрос.УстановитьТелоИзСтроки(ТекстДляОтправки, КодировкаТекста.ANSI);
	
	Попытка
		Соединение = Новый HTTPСоединение(АдресСайта);
		Возврат Соединение.ОтправитьДляОбработки(Запрос);   
	Исключение
		Возврат Неопределено;
	КонецПопытки;
КонецФункции
Показать


Пример вызова:
	
Картинка = Номенклатура.ОсновноеИзображение.Хранилище.Получить();
	Если Картинка.Формат()<>ФорматКартинки.PNG Тогда
		Картинка.Преобразовать(ФорматКартинки.PNG);
	КонецЕсли;	  
	ИдентификаторНоменклатуры = Строка(Номенклатура.УникальныйИдентификатор()); 
	ИмяКартинки = Строка(ИдентификаторНоменклатуры)+".png";
	
	ДанныеЗапроса = Новый Соответствие;
	ДанныеЗапроса.Вставить(ИмяКартинки,Картинка.ПолучитьДвоичныеДанные());
	ДанныеЗапроса.Вставить("product_id",ИдентификаторНоменклатуры);
	
	Ответ = ХТТПЗапросПост("127.0.0.1","/update_image.php",ДанныеЗапроса);
	Если Ответ<>Неопределено Тогда
		ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
		ЭлементыФормы.ПолеHTML.УстановитьТекст(ТекстОтвета);
	Иначе	
		Сообщить("Нет связи с сайтом!!! Проверьте Ваше интернет соединение.");
	КонецЕсли;	
Показать
Drivingblind; Irwin; VZhulanov; spynett; Sol; Maxis; Soloist; +7 Ответить
56. ZhokhovM 755 05.06.15 12:59 Сейчас в теме
Поручик, запускаю вашу обработку "ПросмотрИнфостарт.epf", пишет:

301 Moved Permanently
--------------------------------------------------------------------------------
nginx

Есть ли обработка на управляемой форме или можешь доделать эту обработку если не сложно?
57. пользователь 05.06.15 13:30
Сообщение было скрыто модератором.
...
58. Поручик 4692 05.06.15 13:32 Сейчас в теме
(56) Сдалась она тебе. Это давно устаревший вариант, чисто для примера.
59. ZhokhovM 755 05.06.15 14:01 Сейчас в теме
(58) ясно. Поищу её где-нибудь в другом месте с авторизацией.
61. Teut_Vlad 191 25.02.16 12:59 Сейчас в теме
(58) Зачем оставлять выложенные устаревшие варианты.
62. Поручик 4692 25.02.16 13:05 Сейчас в теме
(61) Это исключительно абстрактные примеры, а не для практического использования.
60. FSerg 111 03.07.15 04:45 Сейчас в теме
Спасибо за публикацию!
Отправить корректно двоичные данные (файл) на сервер получилось можно только через "ОбъединитьФайлы".
64. Natali133 30.04.16 13:48 Сейчас в теме
Статья очень хорошая. Сколько будет стоить помощь в написании кода отправки данных из 1с на веб-серевер через post -запросы,а также комментарии по некоторым вопросам? Код необязательно , чтобы был рабочим, главное, чтобы он отражал всю логику передачи - нужен для курсовой работы.
65. Поручик 4692 03.05.16 20:03 Сейчас в теме
(64) Так вот, в обработке всё рабочее и прокоментирована вся логика.
67. Diversus 2329 14.03.17 11:49 Сейчас в теме
(65) Сергей, скажите пожалуйста, у Вас есть замечательная функция:

Код
Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
                Знач ПараметрыСоединения = Неопределено, ЗаголовкиHTTP = Неопределено,
                Знач ПолучитьКакДвоичныеДанные = Ложь, Знач ЗащищенноеСоединение = Ложь) Экспорт
Показать полностью


Но она работает для 1С версии 8.2.18 и выше. Есть ли аналог для устаревших версий 1С, это нужно для 8.2.13 :(
Вы используете рекурсивное получение для адресов, которые с кодами 301, 302.
Может есть, что для моего случая?

Спасибо.
68. Поручик 4692 15.03.17 11:08 Сейчас в теме
(67) Разумеется нет. Я уже забыл про 8.2.
69. demon_infernal 41 19.05.17 19:42 Сейчас в теме
В обработке для 8.3 параметр Порт задан строкой, "80", что приводит к ошибке "Несоответствие типов". И изменить нельзя, на модуле пароль. Исправьте и выложите рабочую версию, либо версию без пароля на модуле.
в управляемой форме все ок
70. Поручик 4692 19.05.17 20:46 Сейчас в теме
(69) Выдернуть и сделать обработку для обычного приложения несколько минут.
71. piton66 2 01.08.17 22:13 Сейчас в теме
Ошибка работы с Интернет: server returned nothing (no headers, no data)
Такая ошибка вылетает... В чем проблема?
72. Finn71 21.03.19 14:28 Сейчас в теме
Добрый день, а почему модуль объекта запоролен?
Прикрепленные файлы:
Снимок экрана 2019-03-21 в 14.28.15.png
85. JesteR 153 16.04.21 12:06 Сейчас в теме
(53)
(72)
А кто знает что в этом модуле объекта, почему он запаролен и почему в описанни про это ничего нет!!!
73. Поручик 4692 21.03.19 15:59 Сейчас в теме
Там ничего интересного и практического нет.
74. Donpager 1 09.09.19 20:46 Сейчас в теме
С потоками тоже хорошо получается
	_разделитель = "---"+СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", ""); 
	хедеры=Новый Соответствие;
	хедеры.Вставить("Content-Type", "multipart/form-data; boundary="+_разделитель); 
	хПОСТ = Новый HTTPЗапрос(Ресурс,хедеры);
	_Поток = хПОСТ.ПолучитьТелоКакПоток();
	_Зап = Новый ЗаписьДанных(_Поток);
	_Зап.ЗаписатьСтроку(СтрШаблон(
	"--%1
	|Content-Disposition: form-data; name=""image""; filename=""%2""
	|Content-Type: image/%3
	|",_разделитель,ИмяКартинки,МИМЕ));
	_Зап.Записать(ПолучитьИзВременногоХранилища(АдресХранения));
	_Зап.ЗаписатьСтроку(СтрШаблон(
	"
	|--%1--",_разделитель));
	_Зап.Закрыть();
	
	Попытка
		хКон = Новый HTTPСоединение(срв);
		_Ответ = хКон.ОтправитьДляОбработки(хПОСТ);
		хКон = Неопределено;
	Исключение
		хКон = Неопределено;
	КонецПопытки;
Показать
Yashazz; pbabincev; Irwin; VZhulanov; wrooom; kaliuzhnyi; Поручик; st4rk; +8 Ответить
80. wrooom 226 07.06.20 22:14 Сейчас в теме
(74) Спасибо. Помогло. Получается Поток работает обратно другим сущностям 1С?
75. relaks_cpez@mail.ru 13.02.20 18:24 Сейчас в теме
Добрый. 1С 8.3 11УТ при интеграции с сайтом выдает ошибку при выполнении функции modeimport
файлы полученные сайтом имеют приписку <pre> null и выдает ошибку!
Спасает ли ваше расширение от этого?
76. Поручик 4692 13.02.20 18:30 Сейчас в теме
(75) Не знаю. Где здесь расширение?
77. relaks_cpez@mail.ru 13.02.20 18:50 Сейчас в теме
Не знаю как это правильно называется, есть ошибка со стороны 1С решить не можем 3-ю неделю-что мне предоставить что бы вы могли понять исправит ли Ваш код-я обозвала расширение (отправка данных, загрузка файлов на веб-сервер, скачивание файла 8.3.epf) эту беду!
78. Поручик 4692 14.02.20 07:58 Сейчас в теме
Разумеется, не исправит. Это просто демонстрация работы. К вашей ошибке никакого отношения.
79. wrooom 226 06.06.20 13:16 Сейчас в теме
Да, спасибо. Работает на 8.3.13.1513
82. user1420229 28.08.20 08:20 Сейчас в теме
Очень полезная статья. Спасибо.
Может подскажет кто нибудь: в Postman формирую подобный запрос, отправляю файл, все проходит, все ок, из 1с формирую - сервер отвечает, что файл не был отправлен. В фидлере смотрю запросы - одинаковые почти.. не подскажите в чем причина может быть?

Из Постмана:

POST https://market-api.au.ru/v1/images HTTP/1.1
X-Auth-Token: 31027ab88a4000b60ced69f21db3bfb5
Postman-Token: 1b0a831f-6ce3-4ff4-bab0-a059b5205551
Host: market-api.au.ru
Content-Type: multipart/form-data; boundary=--------------------------598431799074143791551641
Content-Length: 85401

----------------------------598431799074143791551641
Content-Disposition: form-data; name="file"; filename="1.JPG"
Content-Type: image/jpeg

яШяа JFIF ,, яю LEAD Technologies Inc. V1.01 яЫ „ 
 $.' "+"(6(+/1343&8<82<.231

<>
----------------------------598431799074143791551641--

Из 1с:

POST https://market-api.au.ru/v1/images HTTP/1.1
Host: market-api.au.ru
User-Agent: 1C+Enterprise/8.3
Accept: */*
X-Auth-Token: 31027ab88a4000b60ced69f21db3bfb5
Content-Type: multipart/form-data; boundary=----f61966556d1911e59811e0cb4ed5f4c3
Content-Length: 85369

----f61966556d1911e59811e0cb4ed5f4c3
Content-Disposition: form-data; name="file"; filename="1.JPG"
Content-Type: image/jpeg

яШяа JFIF ,, яю LEAD Technologies Inc. V1.01 яЫ „ 
 $.' "+"(6(+/1343&8<82<.231

<>
----f61966556d1911e59811e0cb4ed5f4c3--
83. user1420229 31.08.20 05:08 Сейчас в теме
(82) разобрался - в разделителях дело, boundary=--f61966556d1911e59811e0cb4ed5f4c3 должно быть
86. OlegLad67 16.04.21 13:13 Сейчас в теме
К сожалению не силен в запросах, постарался подставить свои данные. Хочу загрузить json на сайт. Сервер присылает пустой файл ответа.
87. viki_glebova 30.04.21 10:01 Сейчас в теме
Добрый день. Не подскажите, как получить список файлов из 1с через HTTP-соединение, если заранее не известны имена файлов? Файлов может быть много. Либо может вообще не быть.
88. NAlex 6 03.06.21 16:17 Сейчас в теме
Добрый день.
Подскажите пожалуйста, как загрузить два отдельных файла, например, файл pdf и файл с подписью этого файла (pdf)?

Для курла это выглядит вот так:
curl -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer тут_был_token" -F file=@"C:\..\путь_до_файла.pdf" -F sig=@"C:\..\путь_до_файла_подписи.pdf.p7s" https://<host>:<port>/upload
А в 1С как выполнить аналогичное действие?
89. NAlex 6 08.06.21 16:48 Сейчас в теме
(88) Вопрос снимается. Разобрался. Автору респект!
90. Maznud 27.09.21 12:12 Сейчас в теме
(88) Здравствуйте, поделитесь опытом, как делали? та же проблема
91. NAlex 6 27.09.21 18:06 Сейчас в теме
(90) Делал, только то, что описано в статье:
Данные = СтруктураСообщения.Данные.Получить();
ИсходящиеДД = Данные.Вложение.Получить();
ПодписьДД = ПолучитьПодписьДокументаУКЭП(СтруктураСообщения, ИсходящиеДД, ОшибкиОбработки);
Если Не ЗначениеЗаполнено(ПодписьДД) Тогда
ВызватьИсключение(ОшибкиОбработки);
КонецЕсли;

ИмяОтправляемогоФайла = Данные.name + "." + Данные.ТипВложения;

ИмяФайлаДанных = КаталогВременныхФайлов() + ИмяОтправляемогоФайла;
ИсходящиеДД.Записать(ИмяФайлаДанных);

ИмяФайлаПодписи = КаталогВременныхФайлов() + ИмяОтправляемогоФайла + ".sgn";
ПодписьДД.Записать(ИмяФайлаПодписи);

Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
СтруктураДанных.Вставить("Boundary", Boundary);

МассивФайловДляОбъединения = Новый Массив;

ИмяФайлаОтправкиДанных = ПолучитьИмяВременногоФайла();
ФайлОтправкиДанные = Новый ЗаписьТекста(ИмяФайлаОтправкиДанных, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправкиДанные.ЗаписатьСтроку("--" + Boundary);
ФайлОтправкиДанные.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяОтправляемогоФайла + """");
ФайлОтправкиДанные.ЗаписатьСтроку("Content-Type: application/octet-stream");
ФайлОтправкиДанные.ЗаписатьСтроку("");
ФайлОтправкиДанные.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиДанных);

ИмяФайлаДляЗагрузкиВременный = ПолучитьИмяВременногоФайла();
КопироватьФайл(ИмяФайлаДанных, ИмяФайлаДляЗагрузкиВременный);
МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременный);

ИмяФайлаОтправкиПодписи = ПолучитьИмяВременногоФайла();
ФайлОтправкиПодпись = Новый ЗаписьТекста(ИмяФайлаОтправкиПодписи, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправкиПодпись.ЗаписатьСтроку("");
ФайлОтправкиПодпись.ЗаписатьСтроку("--" + Boundary);
ФайлОтправкиПодпись.ЗаписатьСтроку("Content-Disposition: form-data; name=""sig""; filename=""" + ИмяОтправляемогоФайла + ".sgn" + """");
ФайлОтправкиПодпись.ЗаписатьСтроку("Content-Type: application/octet-stream");
ФайлОтправкиПодпись.ЗаписатьСтроку("");
ФайлОтправкиПодпись.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиПодписи);

ИмяФайлаДляЗагрузкиВременныйПодпись = ПолучитьИмяВременногоФайла();
КопироватьФайл(ИмяФайлаПодписи, ИмяФайлаДляЗагрузкиВременныйПодпись);
МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременныйПодпись);

ИмяФайлаОтправкиОкончание = ПолучитьИмяВременногоФайла();
ФайлОтправкиОкончание = Новый ЗаписьТекста(ИмяФайлаОтправкиОкончание, КодировкаТекста.UTF8, Символы.ПС, Ложь);
ФайлОтправкиОкончание.ЗаписатьСтроку("");
ФайлОтправкиОкончание.ЗаписатьСтроку("--" + Boundary + "--");
ФайлОтправкиОкончание.Закрыть();
МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиОкончание);

ИмяФайлаОтправки = ПолучитьИмяВременногоФайла();
ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
... Передача данных ...
Файл = Новый Файл(ИмяФайлаДанных);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаДанных);
КонецЕсли;
Файл = Новый Файл(ИмяФайлаПодписи);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаПодписи);
КонецЕсли;
Файл = Новый Файл(ИмяФайлаДляЗагрузкиВременныйПодпись);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаДляЗагрузкиВременныйПодпись);
КонецЕсли;
Файл = Новый Файл(ИмяФайлаОтправкиОкончание);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаОтправкиОкончание);
КонецЕсли;
Файл = Новый Файл(ИмяФайлаОтправки);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаОтправки);
КонецЕсли;
Файл = Новый Файл(ИмяФайлаДляЗагрузкиВременный);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаДляЗагрузкиВременный);
КонецЕсли;
Файл = Новый Файл(ИмяФайлаОтвета);
Если Файл.Существует() Тогда
УдалитьФайлы(ИмяФайлаОтвета);
КонецЕсли;
92. Maznud 28.09.21 08:51 Сейчас в теме
93. Поручик 4692 28.09.21 11:44 Сейчас в теме
Статья устарела, а переписывать и дополнять лень. Сам уже давно не использую файлы для генерации тела запроса.
94. reeds 1 17.01.22 08:30 Сейчас в теме
(93) Поделитесь опытом, чем сейчас пользуетесь для отправки файла на web сервер ?
95. Zlaya-Ferio 3 21.03.22 16:31 Сейчас в теме
Спасибо! Статья дала возможность понять весь механизм. Очень пригодилось!
96. Mark72 19.07.22 14:44 Сейчас в теме
Оставьте свое сообщение