gifts2017

Отслеживание почтовых сообщений через API-интерфейс (УкрПочта, Новая Почта) (8.2, 8.3)

Опубликовал Евгений Сахненко (Duketm) в раздел Программирование - Практика программирования

В статье показана возможность отслеживания в 1С состояний писем/посылок, отправленных через УкрПочту или перевозчиком "Новая Почта", используя Web-сервисы, любезно предоставленные этими службами.

Хочу поделиться небольшим опытом использования 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 = "";
			ОплаченоОбратный = Ложь;
		КонецЕсли;
		
	КонецЕсли;
	
	#КонецОбласти	
	
КонецПроцедуры


Скачать файлы

Наименование Файл Версия Размер
ОтслеживаниеПочтовогоОтправления_УкрПочта_НоваяПочта 21
.epf 20,92Kb
31.12.14
21
.epf 1 20,92Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. draf (draf) 07.01.15 21:26
Доволи не плохо, полезная вещь !
2. Ярослав Володимирович (myr4ik07) 07.01.15 23:36
3. Иван Петров (BoryaMbi) 20.07.15 18:59
Щиро дякую за викладену роботу.
4. Игорь Мирошниченко (igormiro) 15.10.15 16:13
5. Ярослав Володимирович (myr4ik07) 11.03.16 17:31
До речі, в "Новій пошті" оновилося апі, так що з оновленим апі посилання
6. Евгений Сахненко (Duketm) 11.03.16 20:53
(5) Да. Я знаю. Но допиливать обработку не буду т.к. нет времени на это. Кому надо, тот сам допилит. А кому лень, тот купит готовую. При этом есть универсальное решение под любую конфу (http://itprosteer.com/ru/1c/projects/logistics/nova-poshta-api/) (не реклама)
7. Стас (Z_Z) 09.12.16 12:49
Круто. А есть у кого-то такой пример для новой почты для Json?