18.
Rif_md
6
09.08.17 10:29
Сейчас в теме
() Нет, ошибка была с самом запросе, его нужно было написать проще, без заголовков (я смотрю, что заголовки нужны в редких случаях, обычно для определения формата ответа, например, если нужен формат json, то нужно использовать заголовок ЗаголовокHTTP.Вставить("Accept", "application/json"), и других случаев, когда нужен заголовок, я пока не обнаружил. )
// пример переноса документа в формате json (предполагается что базы идентичные по конфигурации, и база, из которой делается перенос, синхронизирована по справочникам с основной базой, в которую делается перенос)
// например, нам нужно перенести из формы списка расходных накладных текущий документ
// создаем на командной панели кнопку Перенос
&НаКлиенте
Процедура ПереносJSON(Команда)
ТекДок = ЭтаФорма.ТекущийЭлемент.ТекущаяСтрока;
СтрокаJSON = СериализаторJSON(ТекДок);
ПередатьНаСерверJSON(СтрокаJSON);
КонецПроцедуры
&НаСервереБезКонтекста
Функция СериализаторJSON(Ссылка)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
// если в качестве параметра передается объект ссылочного типа, то сериализация делается так
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON,Ссылка.ПолучитьОбъект(),НазначениеТипаXML.Явное);
// а если передается структура, то можно проще - ЗаписатьJSON(ЗаписьJSON,Ссылка);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
&НаКлиенте
Процедура ПередатьНаСерверJSON(Строка)
ТекстЗапроса =
"{
|""Ref_Key"": ""00000000-0000-0000-0000-000000000000"","+Символы.ПС; // для создания нового элемента нулевой guid
// список значений имен реквизитов, для которых нужно передать guid
Спс_Key = Новый СписокЗначений();
Спс_Key.Добавить("Покупатель");
Спс_Key.Добавить("БанковскийСчетПокупателя");
Спс_Key.Добавить("Склад");
Спс_Key.Добавить("Валюта");
Спс_Key.Добавить("ВидЦены");
Спс_Key.Добавить("Перевозчик");
Спс_Key.Добавить("Товар");
Спс_Key.Добавить("ЕдиницаИзмерения");
СчСтрок = 0;
Для нс = 5 По СтрЧислоСтрок(Строка)-2 Цикл
ТекСтрока = СтрПолучитьСтроку(Строка,нс);
Если СтрНайти(ТекСтрока,"Posted") > 0 Тогда // проведение документа будет во втором запросе
Продолжить;
КонецЕсли;
Для нз = 0 По Спс_Key.Количество()-1 Цикл
СтрокаПоиска = Спс_Key.Получить(нз).Значение;
Если СтрНайти(ТекСтрока,СтрокаПоиска) > 0 Тогда
ТекСтрока = СтрЗаменить(ТекСтрока,СтрокаПоиска,СтрокаПоиска+"_Key");
КонецЕсли;
КонецЦикла;
Если нс = СтрЧислоСтрок(Строка)-2 Тогда
ТекстЗапроса = ТекстЗапроса+ТекСтрока;
Иначе
// в запросе нужно указать номера строк табличной части, чего нет после сериализации
Если СтрНайти(ТекСтрока,"Товар_Key") > 0 Тогда
СчСтрок = СчСтрок + 1;
ТекстЗапроса = ТекстЗапроса+"""LineNumber"": "+СчСтрок+","+Символы.ПС;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + ТекСтрока + Символы.ПС;
КонецЕсли;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + Символы.ПС +"}";
// первый запрос на перенос документа
Сервер = "10.0.0.1";
ИмяБазы = "Trade";
ИмяМетаданных = "Document";
ИмяДокумента = "РасходнаяНакладная";
АдресРесурса = "/" + ИмяБазы + "/odata/standard.odata/" + ИмяМетаданных + "_" + ИмяДокумента;
HTTPСоединение = Новый HTTPСоединение(Сервер,,Пользователь,Пароль);
ЗаголовокHTTP = Новый Соответствие(); ЗаголовокHTTP.Вставить("Accept", "application/json");
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, ЗаголовокHTTP); HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
HTTPОтвет = HTTPСоединение.POST(HTTPЗапрос);
КодСостояния = HTTPОтвет.КодСостояния;
Ответ = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8");
HTTPСоединение = Неопределено;
// GUID определяется после переноса по первому запросу
ИмяСвойства = ""; НеверныйРеквизит = "";
ФлагОшибки = Ложь;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ);
Пока ЧтениеJSON.Прочитать() Цикл
ТипJSON = ЧтениеJSON.ТипТекущегоЗначения;
Если ТипJSON = ТипЗначенияJSON.Строка ИЛИ ТипJSON = ТипЗначенияJSON.Число
ИЛИ ТипJSON = ТипЗначенияJSON.Булево ИЛИ ТипJSON = ТипЗначенияJSON.Null Тогда
Значение = ЧтениеJSON.ТекущееЗначение;
Если ИмяСвойства = "code" Тогда
КодОшибки = Значение;
Описание = РаботаСФормамиНаКлиенте.ОписаниеВнутреннегоКодаОшибкиOData("Код"+КодОшибки);
ИначеЕсли ИмяСвойства = "value" Тогда
НеверныйРеквизит = Значение;
ИначеЕсли ИмяСвойства = "Ref_Key" Тогда
GUID = Значение;
КонецЕсли;
ИначеЕсли ТипJSON = ТипЗначенияJSON.ИмяСвойства Тогда
ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
Если ИмяСвойства = "odata.error" Тогда
ФлагОшибки = Истина;
// иначе "odata.metadata"
// значение "http://10.0.0.1/Trade/odata/standard.odata/$metadata#Document_РасходнаяНакладная/@Element"
КонецЕсли;
КонецЕсли;
КонецЦикла;
// и второй запрос на проведение перенесенного документа
Если КодСостояния = 201 Тогда
HTTPСоединение = Новый HTTPСоединение(Сервер,,Пользователь,Пароль);
АдресРесурса = АдресРесурса + "(guid'" + GUID + "')/Post()";
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPОтвет = HTTPСоединение.POST(HTTPЗапрос);
КодСостояния = HTTPОтвет.КодСостояния;
HTTPСоединение = Неопределено;
Если КодСостояния = 200 Тогда
Сообщить("Перенос завершен! Записан и проведен документ с GUID "+GUID);
Иначе
Сообщить("Ошибка "+КодСостояния);
КонецЕсли;
Иначе
Сообщить("Ошибка переноса!");
Сообщить(Описание+" "+НеверныйРеквизит);
КонецЕсли;
КонецПроцедуры