Хочу поделиться небольшим опытом использования Web-сервисов украинских "УкрПочты" и "Новой Почты" (госслужба почтовой связи и служба экспресс-доставок соответственно).
Итак. Я делал на управляемой форме.
1. УкрПочта
Когда мы отправляем письмо/посылку через отделение связи УкрПочты, то, в случае, если нам известен шрихкодовый идентификатор (далее ШК) нашего отправления, то используя предоставленный Web-сервис http://services.ukrposhta.com/barcodestatistic/barcodestatistic.asmx) и функцию GetBarcodeInfo() этого сервиса (мануал тут), можно получить информацию о нашем письме/посылке и в 1С. На форме размещаем поле ввода для нашего ШК, таблицу значений, колонки которой заранее созданы (имена колонок соответствуют именам полей структуры, которая возвращается функцией GetBarcodeInfo(), и кнопку, связанную с командой формы "Сформировать":
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНасервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьНасервере()
МестоположениеWSDL = "http://services.ukrposhta.com/barcodestatistic/barcodestatistic.asmx?wsdl";
URIПространстваИменСервиса = "http://barcode.org/";
ИмяСервиса = "BarcodeStatistic";
ИмяТочкиПодключения = "BarcodeStatisticSoap";
GUID = "fcc8d9e1-b6f9-438f-9ac8-b67ab44391dd"; //сервис пока работает только с этим ключем
КодЯзыка = "uk"; //можно использовать "en" для вывода информации на английском
Определения = Новый WSОпределения(МестоположениеWSDL);
Прокси = Новый WSПрокси(Определения,URIПространстваИменСервиса, ИмяСервиса, ИмяТочкиПодключения);
Данные = Прокси.GetBarcodeInfo(GUID,ШК,КодЯзыка);
ТаблицаДанных.Очистить();
//заполняем таблицу новыми данными
НоваяСтрока = ТаблицаДанных.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,Данные);
НоваяСтрока.Событие = ПолучитьСобытиеПоКоду(НоваяСтрока.Code);
НоваяСтрока.eventdescription = СокрЛП(Данные.eventdescription);
КонецПроцедуры
В обработчике "ПриСозданииНаСервере" заполням таблицу расшифровок всех кодов событий:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
РасшифровкаСобытийСоответствие = новый Соответствие;
РасшифровкаСобытийСоответствие.Вставить("10101","Приймання");
РасшифровкаСобытийСоответствие.Вставить("20701","Надходження");
РасшифровкаСобытийСоответствие.Вставить("20801","Відправлення");
РасшифровкаСобытийСоответствие.Вставить("20901","Передача у доставку");
РасшифровкаСобытийСоответствие.Вставить("31205","Повернення за зворотною адресою: неповна адреса");
РасшифровкаСобытийСоответствие.Вставить("31206","Повернення за зворотною адресою: відсутність адресата за вказаною адресою");
РасшифровкаСобытийСоответствие.Вставить("31207","Повернення за зворотною адресою:за письмовою відмовою адресата");
РасшифровкаСобытийСоответствие.Вставить("31208","Повернення за зворотною адресою: за письмовою заявою відправника");
РасшифровкаСобытийСоответствие.Вставить("31209","Повернення за зворотною адресою: за письмовою заявою адресата");
РасшифровкаСобытийСоответствие.Вставить("31210","Повернення за зворотною адресою:через не запит");
РасшифровкаСобытийСоответствие.Вставить("31213","Повернення за зворотною адресою: за закінченням встановленого терміну зберігання");
РасшифровкаСобытийСоответствие.Вставить("31219","Повернення за зворотною адресою. Причину можна з'ясувати в указаному об'єкті поштового зв'язку");
РасшифровкаСобытийСоответствие.Вставить("31311","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31305","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31306","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31307","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31308","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31309","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31310","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31319","Досилання за новою адресою");
РасшифровкаСобытийСоответствие.Вставить("31414","Передача на зберігання: за закінченням встановленого терміну зберігання");
РасшифровкаСобытийСоответствие.Вставить("31410","Передача на зберігання");
РасшифровкаСобытийСоответствие.Вставить("31415","Передача на зберігання: відмова від отримання за заявою відправника");
РасшифровкаСобытийСоответствие.Вставить("31419","Передача на зберігання");
РасшифровкаСобытийСоответствие.Вставить("31119","Невдала спроба вручення: не вручене під час доставки");
РасшифровкаСобытийСоответствие.Вставить("41002","Вручення адресату особисто");
РасшифровкаСобытийСоответствие.Вставить("41003","Вручення члену сім'ї");
РасшифровкаСобытийСоответствие.Вставить("41004","Вручення за довіренністю");
РасшифровкаСобытийСоответствие.Вставить("41022","Вручення кур”єру");
РасшифровкаСобытийСоответствие.Вставить("51118","У надходженні не значиться");
РасшифровкаСобытийСоответствие.Вставить("51119","Вручення неможливе");
РасшифровкаСобытийСоответствие.Вставить("51120","Зберігання");
РасшифровкаСобытийСоответствие.Вставить("60701","Імпорт: надходження до установи обміну України ");
РасшифровкаСобытийСоответствие.Вставить("70801","Експорт: відправка з установи обміну за межі України");
РасшифровкаСобытийСоответствие.Вставить("80821","Передача на митний контроль");
РасшифровкаСобытийСоответствие.Вставить("80819","Передача на митний контроль");
РасшифровкаСобытийСоответствие.Вставить("90801","Відправка з установи обміну до об’єкту поштового зв»язку України");
для Каждого стр из РасшифровкаСобытийСоответствие Цикл
ДобавитьСтрокуВРасшифровку(стр.Ключ,стр.Значение);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПолучитьСобытиеПоКоду(КодСобытия)
ТЗ = РеквизитФормыВЗначение("РасшифровкаСобытий",тип("ТаблицаЗначений"));
строкаСобытия = ТЗ.Найти(КодСобытия,"КодСобытия");
Если строкаСобытия = Неопределено Тогда
Возврат "";
Иначе
Возврат строкаСобытия.Событие;
КонецЕсли;
КонецФункции
&НаСервере
Процедура ДобавитьСтрокуВРасшифровку(Ключ,Значение)
НовСтр = РасшифровкаСобытий.Добавить();
НовСтр.КодСобытия = Ключ;
НовСтр.Событие = Значение;
КонецПроцедуры
2. Новая Почта
При отправке посылки Новой почтой ШК известен всегда. Используя Web-сервис https://api.novaposhta.ua/v2.0/xml/ также можно получить информацию о посылке, но использование API-интерфейса в этом случае возможно только для зарегистрированных пользователей системы, потому-что при отправке запроса этому Web-сервису необходимо в параметрах указывать персональный ключ. Подробнее об API Новой Почты тут.
На другой закладке формы также размещаем поле ввода нашего ШК отправления и реквизиты для отображения нужных данных. Какие именно - каждый решает сам. Мне нужны были не все, а лишь основные: StateName, DeliveryType, AddressUA, BackDelivery, DocumentWeight, RecipientFullName, ewPaidSumm, RedeliverySum, DateReceived, isEWPaid. Вывод информации будет уже не в табличном виде, а просто в полях надписей (приближенно к оигинальному виду на сайте новой почты):
&НаКлиенте
Процедура СформироватьНоваяПочта(Команда)
ОтследитьНоваяПочтаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОтследитьНоваяПочтаНаСервере()
Сервер = "api.novaposhta.ua";
Ресурс = "/v2.0/xml/";
Попытка
HTTP = Новый HTTPСоединение(Сервер,,,,,Истина);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
Возврат
КонецПопытки;
#Область ФормированиеФайлаЗапроса
ФайлЗапроса = КаталогВременныхФайлов()+"querry.xml";
ЗаписьХМЛ = Новый ЗаписьXML;
ЗаписьХМЛ.ОткрытьФайл(ФайлЗапроса,"UTF-8");
ЗаписьХМЛ.ЗаписатьОбъявлениеXML();
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("file");
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("apiKey");
ЗаписьХМЛ.ЗаписатьТекст("d2ea95c5227b5e72d38a0aae1ef193b2"); //персольнальный ключ. Выдаётся на странице настроек в личном кабинете зерегеного пользователя Новой Почты (имеет термин действия)
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("modelName");
ЗаписьХМЛ.ЗаписатьТекст("InternetDocument");
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("calledMethod");
ЗаписьХМЛ.ЗаписатьТекст("documentsTracking");
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("methodProperties");
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("Documents");
ЗаписьХМЛ.ЗаписатьНачалоЭлемента("item");
ЗаписьХМЛ.ЗаписатьТекст(НомерДекларации);
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.ЗаписатьКонецЭлемента();
ЗаписьХМЛ.Закрыть();
#КонецОбласти
ФайлОтправки = Новый Файл(ФайлЗапроса);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
ФайлОтвета = КаталогВременныхФайлов()+"response.xml";
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
ЗаголовокHTTP.Вставить("Content-Type", "text/xml; charset=utf-8");
Попытка
HTTP.ОтправитьДляОбработки(ФайлЗапроса, Ресурс, ФайлОтвета, ЗаголовокHTTP);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
Возврат
КонецПопытки;
#Область ОбработкаФайлаОтвета
Ф = Новый Файл(ФайлОтвета);
Если ф.Существует() Тогда
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл(ФайлОтвета);
Фабрика = ФабрикаXDTO.ПрочитатьXML(ЧтениеХМЛ);
ВалГрн = "грн";
Данные = Фабрика.data.item;
ГородПолучатель = Данные.CityReceiverUA;
ГородОтправитель = Данные.CitySenderUA;
Элементы.Маршрут.Заголовок = ГородОтправитель + " - " + ГородПолучатель;
StateName = Данные.StateName;
DeliveryType = Данные.DeliveryType;
AddressUA = Данные.AddressUA;
Если Данные.BackDelivery = "1" Тогда
BackDelivery = Истина;
Иначе
BackDelivery = Ложь;
КонецЕсли;
DocumentWeight = Данные.DocumentWeight;
Если НЕ ТипЗнч(Данные.RecipientFullName) = Тип("ОбъектXDTO") Тогда
RecipientFullName = СокрЛП(Данные.RecipientFullName);
Иначе
RecipientFullName = "";
КонецЕсли;
ewPaidSumm = Данные.ewPaidSumm + " грн";
Если НЕ ТипЗнч(Данные.DateReceived) = Тип("ОбъектXDTO") Тогда
DateReceived = Дата(Данные.DateReceived);
КонецЕсли;
RedeliverySum = Данные.RedeliverySum + " грн";
Если Данные.isEWPaid = "true" Тогда
Оплачено = Истина;
Иначе
Оплачено = Ложь;
КонецЕсли;
Если BackDelivery Тогда //Если есть обратная доставка, то получим сведения и по ней
Элементы.ГруппаОбратнаяДоставкаПодробнее.Видимость = истина;
Данные = Данные.ChildDocuments.data.item;
Barcode = Данные.Barcode;
ГородПолучатель = Данные.CityReceiverUA;
ГородОтправитель = Данные.CitySenderUA;
Элементы.МаршрутОбратный.Заголовок = ГородОтправитель + " - " + ГородПолучатель;
StateNameRe = Данные.StateName;
DeliveryTypeRe = Данные.DeliveryType;
AddressUARe = Данные.AddressUA;
DocumentWeightRe = Данные.DocumentWeight;
ewPaidSummRe = Данные.ewPaidSumm + " грн";
Если Данные.isEWPaid = "true" Тогда
ОплаченоОбратный = Истина;
Иначе
ОплаченоОбратный = Ложь;
КонецЕсли;
Иначе
Элементы.ГруппаОбратнаяДоставкаПодробнее.Видимость = Ложь;
Элементы.МаршрутОбратный.Заголовок = "";
StateNameRe = "";
DeliveryTypeRe = "";
AddressUARe = "";
DocmentWeightRe = "";
ewPaidSummRe = "";
ОплаченоОбратный = Ложь;
КонецЕсли;
КонецЕсли;
#КонецОбласти
КонецПроцедуры