Была поставлена задача – принимать заказы от крупной сети в электронном виде. Сеть работает следующим образом – рассылает всем заказы (ORDERS) через провайдера Корус в формате EDI, а подтверждений обратно не принимает. Соответственно, обмен идет только в одну сторону. Ну, ещё желательно было сэкономить на модуле сопряжения, который Корус предлагает купить, и коннектиться к ним непосредственно из 1С.
После заполнения всех необходимых бумаг и получения GLN своей организации, наконец–то мне выдали описание формата обмена и способа подключения к Web–сервису.
Уже в процессе работы созрели 2 варианта технической реализации обмена – тот, который рекомендует Корус (по протоколу SOAP) и который позволяет платформа 8.2 (через XDTO). Опишу ОБА способа реализации.
Первый способ (рекомендованный Корусом).
Для обмена через протокол SOAP, необходимо установить Soap Toolkit 3 с сайта Майкрософт. Он может там быть доступен для скачивания в разобранном виде (файлы с расширением .msm), тогда лучше поискать дистрибутив в виде инсталлятора. Также желательно установить финишное обновление SOAPDSK3.0–KB827257–x86.exe, которое лежит на том же Майкрософте, но уже в виде инсталлятора. Для 64-битных систем всё должно тоже штатно установиться. Протокол слегка устаревший, но Корус пока другого не предлагает….
Следующий шаг – добавление сертификатов в файл Cacert.pem из каталога bin программы. На всякий случай, добавил и корневые сертификаты, выданные Thawte, и сертификаты сайта, на котором живёт Web–сервис. Способ добавления сертификатов подробно описан в литературе, не буду на нём заострять внимание.
Пример реально работающего кода:
// Необходимо установить Soap Toolkit 3 и обновление к нему
// В папку bin программы 1С 8.2 добавить отредактированный файл cacert.pem с сертификатами Web-сервиса
//
Процедура ПолучитьЗаказыПокупателяMSSOAP(ДатаНачала, ДатаКонца, Login="Ваш логин", Password="Ваш пароль", Partner_ID="GLN Партнера") Экспорт
ИмяСервиса = "https://www.ecod.pl/webserv2/EDIservice.asmx?WSDL";
Попытка
oSOAPClient = Новый COMОбъект("MSSOAP.SoapClient30");
Исключение
#Если Клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;
Попытка
Инициализация = oSOAPClient.mssoapinit(ИмяСервиса, "", "", "");
Исключение
#Если Клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;
Попытка
Подключение = oSOAPClient.Relationships(Login, Password, "5000");
СтрокаХML = Подключение.item(1).text;
КодОшибкиПодключения = Подключение.item(0).text;
Исключение
#Если Клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;
Если КодОшибкиПодключения <> "00000000" Тогда
#Если Клиент Тогда
Сообщить("Код ошибки подключения = " + КодОшибкиПодключения);
#КонецЕсли
Возврат;
КонецЕсли;
ДатаНачалаECOD = ПривестиДатуКВидуECOD(ДатаНачала);
ДатаКонцаECOD = ПривестиДатуКВидуECOD(ДатаКонца);
// Возвращает массив tracking-id документов, доставленных пользователю ECOD
Попытка
Доставка = oSOAPClient.ListMBEx(Login, Password, Partner_ID, "ORDER", "RU1", "XML", "P",
ДатаНачалаECOD, ДатаКонцаECOD, "", "", "N", "5000");
СтрокаДоставки = Доставка.item(1).text;
КодОшибкиДоставки = Доставка.item(0).text;
Исключение
#Если Клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Возврат;
КонецПопытки;
Если КодОшибкиДоставки <> "00000000" Тогда
#Если Клиент Тогда
Сообщить("Код ошибки идентификации документов = " + КодОшибкиДоставки);
#КонецЕсли
Возврат;
КонецЕсли;
// Теперь соберём массив идентификаторов документов tracking-id
МассивИдентификаторов = ПолучитьМассивИдентификаторовДокументовECOD(СтрокаДоставки);
// Теперь для каждого идентификатора получим документ
Для Каждого Элемент Из МассивИдентификаторов Цикл
Попытка
Документ = oSOAPClient.Receive(Login, Password, Partner_ID, "ORDER", Элемент, "XML", "R", "5000");
СтрокаДокументаXML = Документ.item(1).text;
КодОшибкиДокументаXML = Документ.item(0).text;
Если КодОшибкиДокументаXML <> "00000000" Тогда
#Если Клиент Тогда
Сообщить("Код ошибки доставки документа " + Элемент + " = " + КодОшибкиДокументаXML);
#КонецЕсли
Продолжить;
КонецЕсли;
СформироватьЗаказПокупателяECODИзСтрокиXML(СтрокаДокументаXML);
Исключение
#Если Клиент Тогда
Сообщить(ОписаниеОшибки());
#КонецЕсли
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Второй способ (использование возможностей платформы 8.2).
Известно, что 1С 8.2 тоже умеет работать с неродственными ей объектами, для этого нужно использовать объект Фабрика XDTO. В тексте процедуры показан динамический способ создания описания объектов Web–сервиса, подключения к нему и управления входящими документами.
Добавление сертификатов также обязательно и в этом случае.
Полный текст кода:
Процедура ПолучитьЗаказыПокупателяXDTO(ДатаНачала, ДатаКонца, Login="Ваш логин", Password="Ваш пароль", Partner_ID="GLN Партнера") Экспорт
Определение = Новый WSОпределения("https://www.ecod.pl/webserv2/EDIservice.asmx?WSDL");
Прокси = Новый WSПрокси(Определение, "http://www.comarch.com/", "EDIWebService", "EDIWebServiceSoap12");
Фабрика = Прокси.ФабрикаXDTO;
Запрос = Фабрика.Создать(Фабрика.Тип("http://www.comarch.com/", "Relationships"));
Запрос.Name = Login;
Запрос.Password = Password;
Запрос.Timeout = "5000";
РезультатRelationships = Прокси.Relationships(Запрос.Name, Запрос.Password, Запрос.Timeout);
// Возвращает документ XML, если операция выполнена успешно
КодОшибкиПодключения = РезультатRelationships.Res;
Если КодОшибкиПодключения <> "00000000" Тогда
#Если Клиент Тогда
Сообщить("Код ошибки подключения = " + КодОшибкиПодключения);
#КонецЕсли
Возврат;
КонецЕсли;
Запрос = Фабрика.Создать(Фабрика.Тип("http://www.comarch.com/", "ListMBEx"));
Запрос.Name = Login;
Запрос.Password = Password;
Запрос.PartnerIln = Partner_ID;
Запрос.DocumentType = "ORDER";
Запрос.DocumentVersion = "RU1";
Запрос.DocumentStandard = "XML";
Запрос.DocumentTest = "P";
Запрос.DateFrom
Вступайте в нашу телеграмм-группу Инфостарт