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

31.12.14

Разработка - Работа с интерфейсом

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ОтслеживаниеПочтовогоОтправления_УкрПочта_НоваяПочта
.epf 20,92Kb ver:1
29
29 Скачать (1 SM) Купить за 1 850 руб.

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


Web-сервис API УкрПочта Новая Почта

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55303    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Богатый редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63695    44    59    

82

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19548    27    6    

42

Работа с интерфейсом Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Редактор графов в 1С - внешний отчет, который формирует графы на основе таблицы значений, используя рисунки табличного документа. Есть возможность добавления, редактирования объектов графа и выгрузки результата в таблицу значений.

1500 руб.

06.10.2020    10766    7    7    

11

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    20812    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    10297    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    17738    1223    elcoan    53    

125
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. draf 16 07.01.15 21:26 Сейчас в теме
Доволи не плохо, полезная вещь !
2. jaroslav.h 180 07.01.15 23:36 Сейчас в теме
3. BoryaMbi 25 20.07.15 18:59 Сейчас в теме
Щиро дякую за викладену роботу.
4. igormiro 714 15.10.15 16:13 Сейчас в теме
5. jaroslav.h 180 11.03.16 17:31 Сейчас в теме
До речі, в "Новій пошті" оновилося апі, так що з оновленим апі посилання
6. Duketm 30 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?
Оставьте свое сообщение