04.05.2022
В некоторых случаях при обмене с контролирующими органами возникает следующая ошибка (текст из журнала регистрации):
{Обработка.ДокументооборотСКонтролирующимиОрганами.МодульОбъекта(66473)}: Ошибка при вызове метода контекста (ReceiveUpdatedPacket)
XDTOРезультат = Сервис.ReceiveUpdatedPacket(Строка(ИдентификаторАбонента),ДатаОбновленияФайлаНаСервере);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://regservice.keydisk.ru/}:RegService:ReceiveUpdatedPacket()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка работы с Интернет: Удаленный узел не прошел проверку
по причине:
Ошибка работы с Интернет: Удаленный узел не прошел проверку
Способ исправления:
1. Необходимо закрыть программу 1С.
2. В папке с платформой найти файл cacert.pem, скопировать его в любую папку на случай неудачной попытки.
3. Далее в папку с платформой залить новый файл cacert.pem с заменой.
Архив файла cacert.pem для замены доступен по ссылке https://its.1c.ru/db/files/1CITS/EXE/cacert/cacert.zip
4. Запустить 1С и попробовать еще раз обменяться с контролирующими органами.
Возврат к списку
oleg_prg
11.06.12
✎
23:07
В чистой конфигурации 1С8.2 создал WEB сервис
при обращении из браузера по строке http://localhost:8080/ws/web1?wsdl все ок — получаю ответ от сервиса типа
<definitions xmlns=»http://schemas.xmlsoap.org/wsdl/» и т.д.
В 1С пишу
Процедура ЗапроситьВебСервис()
Сообщить(«Попали!»);
Сервис1 = WSСсылки.WSСсылка1.СоздатьWSПрокси(«http://localhost:8080/ws/»,»web1″, «web1Soap»); //ЗДЕСЬ ОШИБКА!!!
Сервис1.Пользователь = «Админ»;
Сервис1.Пароль = «»;
Ответ = «Получили: » + Сервис1.Получить(«тест»);
Сообщить(Ответ);
{Обработка.ОбращениеЧерезWebСервис.Форма.Форма.Форма(5)}: Ошибка при вызове метода контекста (СоздатьWSПрокси)
Сервис1 = WSСсылки.WSСсылка1.СоздатьWSПрокси(«http://localhost:8080/ws/»,»web1″, «web1Soap»);
по причине:
Сервис не найден. {http://localhost:8080/ws/}:web1
Как побороть???
КонецПроцедуры
oleg_prg
11.06.12
✎
23:12
Параметр №1 в СоздатьWSПрокси делал таким
1 http://localhost:8080/ws/web1?wsdl
2 http://localhost:8080/ws/web1
3 http://localhost:8080/ws/
4 http://localhost:8080/ws
5 http://localhost:8080/
6 http://localhost:8080
7 http://localhost
Сервис реально работает, т.к. вот отрывки из ответа в браузере
<definitions xmlns=»http://schemas.xmlsoap.org/wsdl/» xmlns:soap12bind=»http://schemas.xmlsoap.org/wsdl/soap12/» xmlns:soapbind=»http://schemas.xmlsoap.org/wsdl/soap/» xmlns:tns=»ws» xmlns:xsd=»http://www.w3.org/2001/XMLSchema» xmlns:xsd1=»ws» xmlns:xsd2=»http://v8.1c.ru/8.1/data/core» xmlns:xsd3=»http://v8.1c.ru/8.2/virtual-resource-system» name=»web1″ targetNamespace=»ws»>
……….
<xs:schema xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xs1=»http://v8.1c.ru/8.1/data/core» xmlns:xs2=»http://v8.1c.ru/8.2/virtual-resource-system» xmlns:xs3=»ws» targetNamespace=»ws» elementFormDefault=»qualified»>
<xs:import namespace=»http://v8.1c.ru/8.1/data/core»/>
<xs:import namespace=»http://v8.1c.ru/8.2/virtual-resource-system»/>
<xs:element name=»Get1″>
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
<xs:element name=»Get1Response»>
<xs:complexType>
<xs:sequence>
<xs:element name=»return» type=»xs:string» nillable=»true»/>
<xs:element name=»Param1″ type=»xs:string» nillable=»true»/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</types>
<message name=»Get1RequestMessage»>
<part name=»parameters» element=»tns:Get1″/>
</message>
<message name=»Get1ResponseMessage»>
<part name=»parameters» element=»tns:Get1Response»/>
</message>
<portType name=»web1PortType»>
<operation name=»Get1″>
<input message=»tns:Get1RequestMessage»/>
<output message=»tns:Get1ResponseMessage»/>
</operation>
</portType>
<binding name=»web1SoapBinding» type=»tns:web1PortType»>
<soapbind:binding style=»document» transport=»http://schemas.xmlsoap.org/soap/http»/>
<operation name=»Get1″>
<soapbind:operation style=»document» soapAction=»ws#web1:Get1″/>
<input>
<soapbind:body use=»literal»/>
</input>
<output>
<soapbind:body use=»literal»/>
</output>
</operation>
</binding>
<binding name=»web1Soap12Binding» type=»tns:web1PortType»>
<soap12bind:binding style=»document» transport=»http://schemas.xmlsoap.org/soap/http»/>
<operation name=»Get1″>
<soap12bind:operation style=»document» soapAction=»ws#web1:Get1″/>
<input>
<soap12bind:body use=»literal»/>
</input>
<output>
<soap12bind:body use=»literal»/>
</output>
</operation>
</binding>
<service name=»web1″>
<port name=»web1Soap» binding=»tns:web1SoapBinding»>
<documentation>
<wsi:Claim xmlns:wsi=»http://ws-i.org/schemas/conformanceClaim/» conformsTo=»http://ws-i.org/profiles/basic/1.1″/>
</documentation>
<soapbind:address location=»/ws/web1″/>
</port>
<port name=»web1Soap12″ binding=»tns:web1Soap12Binding»>
<soap12bind:address location=»/ws/web1″/>
</port>
</service>
</definitions>
oleg_prg
11.06.12
✎
23:24
ток что сделал по реально работающему примеру
Прокси = WSСсылки.НБРФ.СоздатьWSПрокси(«http://www.cbr.ru», «DailyInfo»,»DailyInfoSoap»);
Ссылка http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl
Опять таже ошибка
{Обработка.ОбращениеЧерезWebСервис.Форма.Форма.Форма(5)}: Ошибка при вызове метода контекста (СоздатьWSПрокси)
Прокси = WSСсылки.НБРФ.СоздатьWSПрокси(«http://www.cbr.ru», «DailyInfo»,»DailyInfoSoap»);
по причине:
Сервис не найден. {http://www.cbr.ru}:DailyInfo
oleg_prg
11.06.12
✎
23:30
Моя платформа 1С:Предприятие 8.2 (8.2.15.289)
oleg_prg
11.06.12
✎
23:35
Тоже самое сделал в 1С:Предприятие 8.1 (8.1.15.14) — таже ошибка
oleg_prg
12.06.12
✎
00:03
Решил!!!
IamAlexy
12.06.12
✎
00:05
ну тогда пиши как решил уж..
oleg_prg
12.06.12
✎
00:18
Ошибка была в строке подключения
СоздатьWSПрокси(«http://localhost:8080/ws/»,»web1″, «web1Soap»);
именно здесь http://localhost:8080/ws/
Надо в браузер ввести ссылку на вэб сервис, в данном случае это http://localhost:8080/ws/web1?wsdl
затем в открывшемся описании в начале файла ищите вот что:
name=»web1″ targetNamespace=»1c»
в данном случае web1- это имя сервиса (параметр ;2), а 1с — это параметр №1
сейас моя строка подключения такая Сервис1 = WSСсылки.WSСсылка1.СоздатьWSПрокси(«1c»,»web1″, «web1Soap»);
Если надо подключиться к НБРФ http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl
то там параметр №1 это targetNamespace=»http://web.cbr.ru/»
Если у вас подключен сервис 1С:Контрагент и почему-то перестали заполняться реквизиты контрагентов по ИНН, выдает ошибку:
В журнале регистрации написано:
{ОбщийМодуль.ДанныеЕдиныхГосРеестров.Модуль(31)}: Ошибка при вызове метода контекста (getCorporationRequisitesByINN)
Ответ = Прокси.getCorporationRequisitesByINN(ВходныеПараметры);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ws.orgregister.company1c.com/}:RequisitesWebServiceEndpointImpl7Service:getCorporationRequisitesByINN()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,2762]Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,2762]Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://company1c.com/orgregister/corporation}СвОКВЭД
Или
ОбщийМодуль.ДанныеЕдиныхГосРеестров.Модуль(181)}: Ошибка при вызове метода контекста (getCorporationRequisitesByNameAndAddress)
Ответ = Прокси.getCorporationRequisitesByNameAndAddress(ВходныеПараметры);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ws.orgregister.company1c.com/}:RequisitesWebServiceEndpointImpl7Service:getCorporationRequisitesByNameAndAddress()
по причине:
При вызове веб-сервиса произошла ошибка. Неизвестная ошибка. Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,17598] Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://company1c.com/orgregister/corporation}СвОКВЭД — [1,17598] Проверка дополнительного свойства:
форма: Атрибут
имя: ПрВерсОКВЭД
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://company1c.com/orgregister/corporation}СвОКВЭД
Вот что нужно сделать:
Нужно открыть Главное меню (1), нажать «Все функции» (2) — рис.1
Рис.1
Если у вас нет пункта «Все функции», надо открыть Главное меню (3), нажать «Сервис» (4), Парамерты (5) — рис.2
Рис.2
В открывшемся окне поставить галочку «Отображать команду «Все функции» (6), ОК (7) — рис.3
Рис.3
В открывшемся окне нажимаем на «+» Регистры сведений (8) — рис.4
Рис.4
Ищем регистр сведений «Кэш программных интерфейсов» (9) — Открыть (10) — рис.5
Рис.5
В открывшемся списке необходимо найти и удалить запись со значением в колонке Идентификатор https://api.orgregister.1c.ru/orgregister/v7?wsdl (11) — правой кнопкой — Удалить (12) — рис.6
Рис.6
После этого нужно выйти из программы и войти снова.
Я уже как-то писал о муках разработки web service (веб сервисов) на C# (.NET) для 1С. Продолжаем разбираться с проблемами.
При разработке веб сервиса на C# под MS Visual Studio для 1С 8.2 столкнулись с невразумительной ошибкой. В качестве сервера — Microsoft-IIS/8.5. Поиск решения занял немало времени. 🙁 Но обо всем по порядку.
Название вызываемого метода веб сервиса — BarcodeFontIsInstalled. В качестве единственного аргумента передается строка. Ошибка выглядит так:
{Форма.Форма.Форма(22)}: Ошибка при вызове метода контекста (BarcodeFontIsInstalled)
НоваяСтрока = Прокси.BarcodeFontIsInstalled(WSПараметр);
по причине:
http://tempuri.org/Ошибка вызова операции сервиса: {
}:BarcodeWebService:BarcodeFontIsInstalled()
по причине:
Неизвестная ошибка. Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Extra content at the end of the document
по причине:
Ошибка разбора XML: - [1,1]
Она ни о чем не говорит, поскольку 1С безбожно переврала то, что вернул IIS.
Обращение из 1С к web service (веб сервису)
Вызов метода из 1С производился как описано в статье. Код веб сервиса в C#:
using
System.Web;
using
System.Web.Services;
using
System.Xml.Serialization;
namespace
BarcodeWebService
{
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(
false
)]
public
class
BarcodeWebService : System.Web.Services.WebService
{
[WebMethod]
public
bool
BarcodeFontIsInstalled(
string
fontName)
{
return
BarcodeUtils.IsFontInstalled(fontName);
}
}
}
Замечу, что вызов проходил через BarcodeWebServiceSoap — т.е. SOAP версии 1.1. BarcodeWebServiceSoap12 — соотвественно для работы через SOAP 1.2. 1C действительно меняет обращение к сервису, если вместо BarcodeWebServiceSoap указать BarcodeWebServiceSoap12, проверено опытным путем. 🙂
Вызов в 1С выглядел таким образом:
Прокси = WSСсылки.WSBarcodeService.СоздатьWSПрокси(
http://tempuri.org/"
"
,
"BarcodeWebService"
,
"BarcodeWebServiceSoap"
);
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить(
http://tempuri.org/"
"
).Получить(
"BarcodeFontIsInstalled"
);
WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
WSПараметр.fontName =
"Code 128"
;
НоваяСтрока = Прокси.BarcodeFontIsInstalled(WSПараметр);
Все делаем «по учебнику» но так не работает. 🙁
Отладка обращений 1С к web service (веб сервису)
Поскольку в 1С не понятно как отлаживать что-то в части работы с веб-сервисами, обращаемся за помощью к Fiddler, который покажет как-же 1С обращается к разработанному на C# web service:
Бросается в глаза странный кусок XML:
Зачем 1С сгенерировал для такого простого аргумента такую вложенную иерархию fontName не понятно. Ответ веб сервиса (MS IIS) на такую конструкцию:
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 14 Oct 2015 10:19:14 GMT
Content-Length: 0
Как видно по ответу, ошибка выдаваемая 1С рядом не лежала с тем, что на самом деле вернул IIS, а он вообще не вернул XML, сообщив, что запрос «кривой» (HTTP/1.1 400 Bad Request).
Чтобы узнать какой request должен быть, пишем пару строк на C#:
BarcodeWebService.BarcodeWebService svc =
new
BarcodeWebService.BarcodeWebService();
checkBox1.Checked = svc.BarcodeFontIsInstalled(
"Code 128"
);
и запустив Fiddler видим какой простой и красивый request получается:
Расстраиваемся, поскольку ситуация выглядит тупиковой, но пытаемся найти решение.
Перехват обращений из 1С к web service (веб сервису) cbr.ru
Обратимся к исходной статье и посмотрим как выглядит request к web service (веб сервису) www.cbr.ru. Код 1С описан в статье, а request будет таким:
В данном случае все красиво, как при обращении из кода C#:
CBRWebService.DailyInfo info =
new
CBRWebService.DailyInfo();
DataSet ds = info.GetCursOnDate(DateTime.Now);
Разбираться в WSDL, который генерирует веб сервис «Центробанка» и разработанный мною на .NET — дело неблагодарное, тем более, что даже поняв ошибку в генерации 1С request к внешнему веб сервису, повлиять на это нельзя, нужно ждать обновления платформы. Чтобы проверить одну мысль я сделал простой метод в веб сервисе:
[WebMethod]
public
DateTime Checker(DateTime date)
{
return
date;
}
У меня была мысль, что проблема связана с тем, что string аргумент может быть null, соответственно, в WSDL minOccurs=»0″, в отличие от DateTime (который передавался cbr.ru методу GetCursOnDate), для которого minOccurs=»1″ . Однако, даже для такого варианта 1С сформировал столь же «кривой» запрос, т.е. дело не в этом.
Решение
Поиск решения заняло немало времени, как обычно, оно оказалось очень простым. Спасибо моим 1С разработчикам с которыми мы вымучивали столь красивое и столь многострадальное решение. 🙂
Итак, фанфары, рабочий код на 1С при обращении к внешнему веб сервису (web service) написанному на C# (.NET) и работающему под IIS выглядит следующим образом:
Прокси = WSСсылки.WSBarcodeService.СоздатьWSПрокси(
http://tempuri.org/"
"
,
"BarcodeWebService"
,
"BarcodeWebServiceSoap"
);
Результат = Прокси.BarcodeFontIsInstalled(
"Code 128"
);
И это всё! 🙂 Предельно кратко и очень похоже на обращение к web service в C#. В этом случае перехваченный Fiddler-ом запрос 1С к веб сервису выглядит следующим образом:
При таком вызове web service (веб сервис) возвращает корректное значение. Ошибка исчезла. В качестве аргумента в метод веб сервиса из 1С передавали бинарные данные (фотографии), массивы, ну и простые типы, вроде даты, строки и пр.
Полезные ссылки
- Fiddler — перехват http траффика для анализа обмена данными
- WireShark — мощный сниффер для перехвата и анализа различных протоколов переадчи данных.
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2, "Windows-1251");
WinHttp.Open("POST", "http://mtscommunicator.ru/m2m/m2m_api.asmx/SendMessage", 0);
WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");
WinHttp.setRequestHeader("Content-Language", "ru");
WinHttp.setRequestHeader("Content-Charset", "Windows-1251");
WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ПараметрыPOST = "msid=" + Адресат + "&message=" + ПодготовитьСообщение(ТекстСМС) + "&naming=Mart-Stroy&login=9857279651&password=6C30734811916B0F0F24A4630B08036F";
Ошибка = Ложь;
ИДСообщения = "";
Попытка
WinHttp.Send(ПараметрыPOST);
ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла();
Текст = Новый ЗаписьТекста(ИмяФайлаЗапроса, КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку(WinHttp.ResponseText());
Текст.Закрыть();
Ошибка = (WinHttp.Status <> 200);
Исключение
Ошибка = Истина;
КонецПопытки;
Если НЕ Ошибка Тогда
Попытка
XMLОтвет = Новый ЧтениеXML;
XMLОтвет.ОткрытьФайл(ИмяФайлаЗапроса);
Пока XMLОтвет.Прочитать() Цикл
Если XMLОтвет.ТипУзла = ТипУзлаXML.НачалоЭлемента И (XMLОтвет.Имя = "long") Тогда
XMLОтвет.Прочитать();
ИДСообщения = XMLОтвет.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Исключение
Ошибка = Истина;
КонецПопытки;
КонецЕсли;
Если Ошибка Тогда
Сообщить("Не удалось отправить СМС. Проверьте настройки подключения");
Предупреждение("СМС не было отправлено");
Иначе
Набор = РегистрыСведений.ЛогОтправленныхСМС.СоздатьНаборЗаписей();
Набор.Отбор.Документ.Установить(Ссылка);
Набор.Прочитать();
ЗаписьЛога = Набор.Добавить();
ЗаписьЛога.Документ = Ссылка;
ЗаписьЛога.Получатель = ЭкспедиторЗагрузки;
ЗаписьЛога.Идентификатор = ИДСообщения;
ЗаписьЛога.Текст = ТекстСМС;
ЗаписьЛога.ТелефонПолучателя = Адресат;
ЗаписьЛога.Ответственный = глЗначениеПеременной("глТекущийПользователь");
ЗаписьЛога.ДатаОтправки = ТекущаяДата();
ЗаписьЛога.СтатусСМС = Перечисления.СтатусыСМС.ПоставленоВОчередь;
Набор.Записать(Истина);
ПоказатьОповещениеПользователя("Отправка СМС",, "СМС-сообщение отправлено " + Строка(ЭкспедиторЗагрузки), БиблиотекаКартинок.СМС);
КонецЕсли;