Найти в Дзене
1с разное

HTTPСоединение. ОтправитьДляОбработки()

Оказывается, платформа 1С развивается с потерей функциональных возможностей. Вам будут предоставлены примеры корректной работы методов в зависимости от платформы и режима совместимости конфигурации. Для программы "Управление торговлей", редакция 10.3 (10.3.75.2), платформа 1С:Предприятие 8.3 (8.3.25.1445), режим совместимости конфигурации Версия 8.2.13. Ниже представлен корректный синтаксис использования метода ОтправитьДляОбработки(). SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
НТТР = Новый HTTPСоединение(АдресСервера, Порт, , , , , SSL, Истина);
НТТР.ОтправитьДляОбработки(имяФайлаОтправки, ПутьКСервису с параметрами, имяФайлаОтвета, ЗаголовокHTTP); Синтакс-помощник данной платформы уже не выдает подобное описание синтаксиса (Обратите внимание!). Код http-сервиса любезно предоставлен компанией, которая этот http-сервис разработала. Имена и явки изменены. Процедура ОтправитьНаСайт() Экспорт
МассивПутей
Оглавление

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

Часть 1. режим совместимости 8.2.13

Для программы "Управление торговлей", редакция 10.3 (10.3.75.2), платформа 1С:Предприятие 8.3 (8.3.25.1445), режим совместимости конфигурации Версия 8.2.13.

Ниже представлен корректный синтаксис использования метода ОтправитьДляОбработки().

SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
НТТР = Новый HTTPСоединение(АдресСервера, Порт, , , , , SSL, Истина);
НТТР.ОтправитьДляОбработки(имяФайлаОтправки, ПутьКСервису с параметрами, имяФайлаОтвета, ЗаголовокHTTP);

Синтакс-помощник данной платформы уже не выдает подобное описание синтаксиса (Обратите внимание!).

Код http-сервиса любезно предоставлен компанией, которая этот http-сервис разработала. Имена и явки изменены.

Процедура ОтправитьНаСайт() Экспорт

МассивПутей = Новый Массив;
МассивПутей.Добавить("" + ПутьКФайлу + "\L.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\Q.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\C.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\P.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\M.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\R.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\I.xml");
МассивПутей.Добавить("" + ПутьКФайлу + "\S.xml");

// Создаем архив и записываем в него файлы
Архив = Новый ЗаписьZIPФайла("" + ПутьКФайлу + "\batch.zip") ;
Для Каждого Путь Из МассивПутей Цикл
Архив.Добавить(Путь, РежимСохраненияПутейZIP.СохранятьОтносительныеПути);
КонецЦикла;
Архив.Записать();

// Отправка файла
Попытка

АдресСервера = "test.primer.ru";
ПутьКСервису = "/data-sell-out/cFileUpload.jsp";
Логин = "loginTest@mail.ru";
Пароль = "parolTest";

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

// подготовим файл с данными для отправки
имяФайлаДанных = "" + ПутьКФайлу + "\batch.zip";
имяФайлаОтправки = "" + ПутьКФайлу + "\batch.txt";

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

ЗаписьТекста = Новый ЗаписьТекста(имяФайлаОтправки);
ЗаписьТекста.ЗаписатьСтроку("--" + Boundary);
ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""@file""; filename=""batch.zip""" + Символы.ПС + "Content-Type: multipart/x-zip" + Символы.ПС);
ЗаписьТекста.Записать(СтрЗаменить(СтрЗаменить(Base64Строка(Новый ДвоичныеДанные(имяФайлаДанных)), Символы.ПС, ""), Символы.ВК,""));
// Закроем разделитель
ЗаписьТекста.ЗаписатьСтроку(Символы.ПС + "--" + Boundary+"--");
ЗаписьТекста.Закрыть();

ФайлОтправки = Новый Файл(имяФайлаОтправки);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());

ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);

SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
НТТР = Новый HTTPСоединение(АдресСервера, Порт, , , , , SSL, Истина);
НТТР.ОтправитьДляОбработки(имяФайлаОтправки, ПутьКСервису + "?@flag1=0&@flag2=1&@email=" + Логин +"&@password=" + Пароль + "&@base64=1", имяФайлаОтвета, ЗаголовокHTTP);

УдалитьФайлы(имяФайлаДанных);

Сообщить("Отчет отправлен на портал.");

// Прочитать код из файла ответа сервиса
Текст = Новый ЧтениеТекста;
Текст.Открыть(имяФайлаОтвета);
ст = СокрЛП(Текст.ПрочитатьСтроку());

Если СтрДлина(ст) = 1 Тогда
ст = Лев(ст, 1);
стрРезультат = "Ответ сервера: Ошибка при отправке файла.";
Если ст = "0" Тогда
стрРезультат = "Ответ сервера: Файл успешно принят. [Код ответа = 0]"
ИначеЕсли ст = "1" Тогда
стрРезультат = стрРезультат + "Не указан логин (е-mail). [Код ответа = 1]";
ИначеЕсли ст = "2" Тогда
стрРезультат = стрРезультат + "Не указан пароль. [Код ответа = 2]";
ИначеЕсли ст = "3" Тогда
стрРезультат = стрРезультат + "Логин введен не верно или такой пользователь не существует в системе. [Код ответа = 3]";
ИначеЕсли ст = "4" Тогда
стрРезультат = стрРезультат + "Пароль введен не верно. [Код ответа = 4]";
ИначеЕсли ст = "5" Тогда
стрРезультат = стрРезультат + "Ошибка при обработке файла (файл не соответствует регламенту). [Код ответа = 5]";
КонецЕсли;
КонецЕсли;
Текст.Закрыть();

Сообщить(стрРезультат);

УдалитьФайлы(имяФайлаОтправки);
УдалитьФайлы(имяФайлаОтвета);

Исключение

Сообщить("Отчет не выгружен! Причина: " + ИнформацияОбОшибке().Описание);
УдалитьФайлы(имяФайлаОтправки);
УдалитьФайлы(имяФайлаДанных);
УдалитьФайлы(имяФайлаОтвета);

КонецПопытки;

КонецПроцедуры

Часть 2. режим совместимости 8.3.16

Для пустой базы, платформа 1С:Предприятие 8.3 (8.3.25.1445), режим совместимости конфигурации Версия 8.3.16.

Ниже представлен корректный синтаксис использования метода ОтправитьДляОбработки().

НТТР = Новый HTTPСоединение(Адрес,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

Ответ = НТТР.ОтправитьДляОбработки(Запрос);

Синтакс-помощник данной платформы выдает подобное подробное описание метода. Обратите внимание! - не рекомендуется использовать, начиная с версии 8.3.21.

Код http-сервиса любезно предоставлен компанией, которая этот http-сервис разработала. Имена и явки изменены.

Процедура ВыгрузитьФайлыНаСайт() Экспорт

ПодготовитьСтруктуруДанных();

// Отправка файла
Попытка

Адрес = "test.data.site";
Пользователь = "Testlogin";
Пароль = "Testparol";

Разделитель = "45gh45h54u5";
НТТР = Новый HTTPСоединение(Адрес,Порт,,,,,Новый ЗащищенноеСоединениеOpenSSL());

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
Заголовки.Вставить("Connection" , "keep-alive");

Для Каждого Элемент из СтруктураДанных Цикл

Запрос = Новый HTTPЗапрос("/upload/auto", Заголовки);

Тело = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Тело);
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

//"ufile=@%%F.csv;type=text/plain;filename=%%F"
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=ufile; filename=" + Элемент.Ключ);
ЗаписьДанных.ЗаписатьСтроку("Content-Type: text/plain");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(Элемент.Значение,КодировкаТекста.UTF8);
//-F "__login=%user%"
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=__login");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(Пользователь,КодировкаТекста.UTF8);
//-F "__password=%password%"
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=__password");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(Пароль,КодировкаТекста.UTF8);
ЗаписьДанных.Закрыть();

Запрос.УстановитьТелоИзДвоичныхДанных(Тело.ЗакрытьИПолучитьДвоичныеДанные());
Ответ = НТТР.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка");
КонецЕсли;

КонецЦикла;

Сообщить("Отчет отправлен на портал.");

Исключение

Сообщить("Отчет не выгружен! Причина: " + ИнформацияОбОшибке().Описание);

КонецПопытки;
КонецПроцедуры

Часть 3. Проблема - пути решения

Задача

Изначально мы работали с одной компанией, которая предоставила код http-сервиса, позволяющий отправлять данные из конфигурации Управление торговлей 10.3.75.2, режим совместимости 8.2.13.

Через некоторое время мы стали работать с другой компанией, которая предоставила обновленный код http-сервиса, который в свою очередь не работает в конфигурации в режиме совместимости 8.2.13.

Пути решения:

  1. Обновить УТ 10.3 и возможно с типовым обновлением обновится версия режима совместимости. Этого я заранее не знаю. При этом возможно перестанут работать методы интеграции Контур и Агент-Плюс, методы выгрузки ADODB на сторонний сервер (есть одна такая в нашем арсенале).
  2. Не обновлять УТ 10.3. Развернуть пустую базу с режимом совместимости, необходимом для корректного использования нового синтаксиса http-сервиса. Я установил режим совместимости 8.3.16 - все заработало с первого раза.

Второй вариант кажется оправданным, более быстрым и дешевым.

Реализация

В УТ реализовано регламентное задание, которое готовит файлы для отправки на сторонний сайт, сохраняет их в папку. Далее вызывается метод

Процедура ОтправитьНаСайт() Экспорт

//отправка файлов происходит через другую базу и с помощью бат-ника
ЗапуститьПриложение("D:\1C_Obmen\nash_obmen.bat");

КонецПроцедуры

Бат-ник содержит строку команд с открытием нужной базы нужного режима совместимости с последующим открытием внешней обработки, которая отправляет данные на сторонний сайт по нужному алгоритму синтаксиса http-сервиса.

"C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\1C_Base\Obmen" /N "Admin" /P "" /Execute "D:\1C_Obmen\start_obmen.epf" /DisableStartupMessages /RunModeOrdinaryApplication

В пустой базе задан один пользователь с админскими правами, с отключенным параметром работы в безопасном режиме.

Это мое не первое красивое решение. Надеюсь, со временем опишу еще примеры.

Критерий красивости - не стал обновлять исходную УТ, хотя на это все намекало. Обошелся всего парой строк для решения задачи - вызов батника и вызов внешней обработки.

На этом все. Всем добра!

С пользой для клиентов, Рустем