Работая с мобильным клиентом, и в частности передавая данные с сервера на ТСД и обратно, часто сталкивался с нарушением (ошибкой) передачи данных. В процессе поиска ошибки в некоторых случаях выяснялось, что ошибка возникает из-за нестабильной сетевой структуры. Возникали ошибки на WI-FI антеннах (WI-FI контур покрытия склада), которые нужно было перезагружать админам. Также ошибки самой сети (отвалился провод, потеря пакетов). А также ошибки на промежуточном оборудовании и серверах.
В связи с чем, для быстрого понимания где возникает ошибка (в коде или сети) был написан "трассировщик" маршрута. Суть данной разработки, это пройти весь путь от клиента/ТСД (места старта), включая внешние базы, и вернуться обратно без ошибок.
На просторах интернета есть функционал ("Использование MS SQL Profiler и 1С" или описанный в статье на //infostart.ru/1c/articles/19127/). Они проводят анализ используя технологический журнал или данные SQL. Это все необходимо "разворачивать", да и полного анализа они все равно не смогут предоставить.
Первое, что необходимо, это на стороне внешней/публикуемой базы прописать функцию HTTP-сервиса для установки факта получения сигнала/данных. Мы используем текстовое сообщение (ТекстСообщения). В эту переменную мы прописывает:
1) В какой базе мы находимся.
2) Где мы находимся (на сервере или на клиенте)
3) На каком компьютере (функция ИмяКомпьютера())
4) Точное время, когда мы сюда пришли (функция Формат(ТекущаяДата(), "ДЛФ=T"))
"Точное время, когда мы сюда пришли" берется с компьютера, на котором мы сейчас находимся (в данном случае на сервере 1С) и берется время именно этого компьютера.
//Функция HTTP-сервиса внешней/публикуемой базы
&НаСервере
Функция ЗамерВремениОтправкиИ_ПередачиДанных(Запрос)
ТекстСообщения = "";
ИнформационнаяБаза = "УТ";
ТекстСообщения = ТекстСообщения+ИнформационнаяБаза+"_НаСервере - перешли на сервер "+ИнформационнаяБаза+" :"Символы.ПС+
"Имя компьютера:"+ИмяКомпьютера()+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
Результат = ТекстСообщения;
HTTPОтветСтруктура = Новый Структура("RequestJSON, ErrorText", Результат, "");
Возврат Ответ(HTTPОтветСтруктура,Ложь);
КонецФункции
&НаСервере
Функция Ответ(Данные, Ошибка = Ложь)
Если Ошибка = Истина Тогда
Ответ = Новый HTTPСервисОтвет(500);
Иначе
Ответ = Новый HTTPСервисОтвет(200);
КонецЕсли;
Ответ.Заголовки.Вставить("Accept-Charset", "utf-8");
Ответ.Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
Ответ.Заголовки["Cache-Control"] = "no-cache";
Ответ.УстановитьТелоИзСтроки(ДанныеJSON(Данные));
Возврат Ответ;
КонецФункции
&НаСервере
Функция ДанныеJSON(Данные)
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто," ",Истина,,Истина,Истина,Истина,Истина,Истина);
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, Данные);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Второе, это в мобильном приложении создаем команду для запуска самого парсинга (ТСД - место старта). Таким образом запуск "Трассировщика" произойдет на стороне мобильного приложения "НаКлиенте". В текстовое сообщение мы прописываем все пройденные этапы. А самое главное - фиксируем время их прохождения.
//Процедуры мобильного приложения (ТСД - место старта)
&НаКлиенте
Процедура ЗамерВремениОтправкиИ_ПередачиДанных_НаКлиенте(Команда)
ТекстСообщения = "Имя ТСД: "+ИмяКомпьютера();
ТекстСообщения = ТекстСообщения+Символы.ПС+
"ТСД_НаКлиенте - нажата кнопка:"+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
ЗамерВремениОтправкиИ_ПередачиДанныхНаСервере(ТекстСообщения);
ТекстСообщения = ТекстСообщения+Символы.ПС+
"ТСД_НаКлиенте - выведено сообщение:"+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
Сообщить(ТекстСообщения);
КонецПроцедуры
Саму процедуру передачи текстового сообщения (где так же фексируются все пройденные этапы и их время) создаем на сервере.
//Процедуры мобильного приложения (ТСД - место передачи данных во внешние системы/базы)
&НаСервере
Процедура ЗамерВремениОтправкиИ_ПередачиДанныхНаСервере(ТекстСообщения)
ТекстСообщения = ТекстСообщения+Символы.ПС+
"ТСД_НаСервере - перешли на сервер ТСД:"+Символы.ПС+
"Имя компьютера:"+ИмяКомпьютера()+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
ЗамерВремениОтправкиИ_ПередачиДанных(ТекстСообщения);
КонецПроцедуры
Передача текстового сообщения осуществляется через HTTP запрос методом GET, через параметр "MeasuringTheTimeOfSendingAndTransferringData".
&НаСервере
Функция ЗамерВремениОтправкиИ_ПередачиДанных(ТекстСообщения) Экспорт
Попытка
ТекстСообщения = ТекстСообщения+Символы.ПС+
"ТСД_НаСервере - отправили данные с ТСД:"+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
Путь = "hs/TSD/MeasuringTheTimeOfSendingAndTransferringData";
Ответ = Запрос_HTTP_GET(Путь);
Если Ответ["ErrorText"] <> "" Тогда
ТекстСообщения = ТекстСообщения+Символы.ПС+
"ТСД_НаСервере - получили ответ от УТ:"+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
ТекстСообщения = ТекстСообщения+Символы.ПС+
("Ошибка отправки данных из ТСД. КодСостояния = "+Ответ.КодСостояния+Символы.ПС+
Ответ.ПолучитьТелоКакСтроку());
Возврат ТекстСообщения;
КонецЕсли;
Данные = Ответ["RequestJSON"];
ТекстСообщения = ТекстСообщения+Символы.ПС+
Данные;
ТекстСообщения = ТекстСообщения+Символы.ПС+
"ТСД_НаСервере - получили ответ от УТ:"+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
Исключение
ТекстСообщения = ТекстСообщения+Символы.ПС+
"Произошла ошибка при отправке данных из ТСД:"+Символы.ПС+
Формат(ТекущаяДата(), "ДЛФ=T");
ТекстСообщения = ТекстСообщения+Символы.ПС+ОписаниеОшибки();
КонецПопытки;
Возврат ТекстСообщения;
КонецФункции
//Константы:
//Сайт - указан сайт/домен подключения
//ВнешняяБаза - указана база подключения
&НаСервере
Функция Запрос_HTTP_GET(Путь) Экспорт
Сайт = Константы.Сайт.Получить();//Имя сервера внешней базы (например: Сервер_1С-1)
ВнешняяБаза = Константы.ВнешняяБаза.Получить();// Имя внешней базы (например: УТ)
ПолныйПуть = СубДоменБазы + Путь;
ФайлРезультата = ПолучитьИмяВременногоФайла();
Соед = Новый HTTPСоединение(Сайт,,,,,1800);
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
Ответ = Соед.Получить(Новый HTTPЗапрос(ПолныйПуть),ФайлРезультата);
Если Ответ.КодСостояния = 200 Тогда
Текст = Новый ЧтениеТекста(ФайлРезультата, КодировкаТекста.UTF8);
СодRaw = Текст.Прочитать();
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(СодRaw);
Данные = ПрочитатьJSON(Чтение,Истина);
возврат Данные;
Иначе
Данные = Новый Структура();
ТекстСообшения = "Произошла ошибка. Код состояния: "+Ответ.КодСостояния;
Данные.Вставить("ErrorText",ТекстСообшения);
возврат Данные;
КонецЕсли;
КонецФункции