Оказывается, платформа 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.
Пути решения:
- Обновить УТ 10.3 и возможно с типовым обновлением обновится версия режима совместимости. Этого я заранее не знаю. При этом возможно перестанут работать методы интеграции Контур и Агент-Плюс, методы выгрузки ADODB на сторонний сервер (есть одна такая в нашем арсенале).
- Не обновлять УТ 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
В пустой базе задан один пользователь с админскими правами, с отключенным параметром работы в безопасном режиме.
Это мое не первое красивое решение. Надеюсь, со временем опишу еще примеры.
Критерий красивости - не стал обновлять исходную УТ, хотя на это все намекало. Обошелся всего парой строк для решения задачи - вызов батника и вызов внешней обработки.
На этом все. Всем добра!
С пользой для клиентов, Рустем