Временная зона типа даты в XDTO

1. dadel 19 13.10.20 15:24 Сейчас в теме
Доброго всем дня!
Завис с вопросом наглухо. Делаю интеграцию для корпоративных закупок в с ЭТП ГПБ.
От ЭТП получаю схему WSDL и по ней собираю тело запроса. В описании к запросу от ЭТП некоторые даты должны иметь формат с таймзоной.
формат : dateTime(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\+\d\d:\d\d) или вот так то же самое: строгий формат Y-m-d\TH:i:sP (пример "2018-11-28T14:00:07+03:00" )
В итоге, формирую структуру тела, присваиваю в установленном формате дату и, ... Таимзона исчезает.
Пробовал и так:
BaseAnnouncement.date_start_registration = XMLСтрока(НачалоДня(ДатаНачПриема) + 32400) + "+03:00"; 	//Начало приема заявок

И вот так:
типДаты = Прокси.ФабрикаXDTO.Тип("http://etpgpb.ru/223fz/types/1", "dateTimeSimpleType");
	значение = Прокси.ФабрикаXDTO.Создать(типДаты, XMLСтрока(НачалоДня(ДатаНачПриема) + 32400) + "+03:00");
	BaseAnnouncement.date_start_registration = значение;

Всё одинаково, справа от равно таймзона есть, слева она теряется. От этп ошибка приходит, формат не соответствует.
В SoapUI руками таймзону прописываю и всё без ошибок проходит и закупочная процедура создается на ЭТП. Там строка вот так выглядит:
<ns1:date_start_registration>2020-10-13T09:00:00+03:00</ns1:date_start_registration>

Где я не так копаю? Кто может помочь?
Ещё может заодно по префиксам кто поможет? Из полученной от ЭТП схемы в SoapUI префиксы получаются как надо - ns. А в 1С у меня при формировании на выходе префиксы вот такие: d2p...
Пока временно решил эту проблему просто заменой текста, Сформированный ОбъектXDTO конвертирую в XML и заменяю в тексте поиском. Потом обратно конвертирую в ОбъектXDTO и отправляю запрос. Костыль, но пока так вот.
Вопрос с датой уже горит....!
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 13.10.20 15:52 Сейчас в теме
(1) Создавай для даты строковое поле, а не дату.
Ссылку на wsdl можно?
3. dadel 19 13.10.20 16:38 Сейчас в теме
(2)Ссылку думаю ничего страшного дать нет, но всё же у них получу разрешение для порядка.
Сходу не вижу как картинку вставить... только через сервисы кнопка... прикреплю файлом.
Пока на скрине видно тип даты в полученной схеме какой и у него там формат как оговорено: \d{4}-\d\d-\d\dT\d\d:\d\d:\d\d\+\d\d:\d\d
Думал извернутся и конвертнул сформированный ОбъектXDTO в XML поправил и обратно в ОбъектXDTO, но уже без привязки к полученной схеме, к ней не дает, ругается на несоответствия этих значений... Не прошло... И с префиксами так же думал проскочить, тоже не пошло...
Прикрепленные файлы:
4. dadel 19 13.10.20 16:40 Сейчас в теме
(2)после описанной выше конвертации и получается не дата там, а строка в этих полях дат. В ответ падает ошибка от запрашиваемого сервиса: При вызове веб-сервиса произошла ошибка. Ошибка SOAP сервера: Call to undefined method stdClass::getItemData()
5. dadel 19 13.10.20 16:44 Сейчас в теме
(2)Вот что было до конвертации через XML и что стало после
Прикрепленные файлы:
19. dadel 19 14.10.20 09:49 Сейчас в теме
(2)ЭТП ссылку просили не выкладывать в общедоступный ресурс к сожалению... Хотя что там секретного, вопрос?
6. Sashares 35 13.10.20 16:56 Сейчас в теме
(4)По поводу даты - тоже не получилось, при присваивании просто изменяется дата на смещение часового пояса.
А по поводу пространства имен - так то без разницы какой будет префикс - ns, abs или любой другой.
Файл будет корректен, с точки зрения xml.
7. dadel 19 13.10.20 17:03 Сейчас в теме
(6)пока не заменить префикса - там не доходит запрос до них... Говорят логи пустые. Как префикс меняю - сразу получаю по датам ошибки.
8. Sashares 35 13.10.20 17:04 Сейчас в теме
(7)Можно поставить Fiddler - в нем видно что реально отправляется и что возвращается в ответ.
11. dadel 19 13.10.20 17:15 Сейчас в теме
(8)
Fiddler
глянул описание, наверное да, полезная будет. Если получится поставить и понять, то воспользуюсь. Тут безопасники могут не пустить.
13. Sashares 35 13.10.20 18:00 Сейчас в теме
(11)В ней так то все просто - отображаются все вызовы и можно посмотреть что реально отправилось и что пришло в ответ, со всеми заголовками.
9. Sashares 35 13.10.20 17:10 Сейчас в теме
По поводу даты - подозреваю, что с типом datetime - никак. Надо изменить в пакете XDTO тип у данного типа значения на string, тогда будет норм.
10. dadel 19 13.10.20 17:13 Сейчас в теме
(9)На скрине выше - формат в схеме желтым выделил, там с Временной зоной на конце.
И на ИТС тоже она написана параметр такой есть, но не обязательный.
https://its.1c.ru/db/metod8dev/content/1793/hdoc
12. dadel 19 13.10.20 17:18 Сейчас в теме
(9)Примерно так и поступал. Конвертировал собранную ХДТО и от схемы отвязывался. Там всё в стринг конвертируется после этого. Ну вложенные ХДТО структуру сохраняют, но все поля тип Стринг становятся.
14. Sashares 35 13.10.20 18:01 Сейчас в теме
(12)А как конвертировал? Покажи код.
15. dadel 19 13.10.20 18:04 Сейчас в теме
(14)
            СообщениеТело = Новый ЗаписьXML;
			СообщениеТело.УстановитьСтроку("UTF-8");
			СообщениеТело.ЗаписатьОбъявлениеXML();
			Прокси.ФабрикаXDTO.ЗаписатьXML(СообщениеТело, BodyIn);
			СтрокаXMLТело = СообщениеТело.Закрыть();
			УбратьЛишнее(СтрокаXMLТело);
			
			ЧтениеXMLТело = Новый ЧтениеXML;
			ЧтениеXMLТело.УстановитьСтроку(СтрокаXMLТело);

			
			BodyIn2 = Прокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXMLТело);
			BodyIn2.itemData.date_start_registration = BodyIn2.itemData.date_start_registration + "+03:00";
			BodyIn2.itemData.date_end_registration = BodyIn2.itemData.date_end_registration + "+03:00";
			BodyIn2.itemData.date_applic_opened = BodyIn2.itemData.date_applic_opened + "+03:00";
			BodyIn2.itemData.summingup_date = BodyIn2.itemData.summingup_date + "+03:00";
			
			Прокси.ProcedurePublish(MessHeader,BodyIn2,HeaderOut,BodyOut);
Показать


Функция УбратьЛишнее(СтрокаXMLТело); скопипастина с инфостарта, добавил строку по замене префикса только

Функция УбратьЛишнее(xml)
    xml = СтрЗаменить(xml,"xsi:type=""xs:decimal""", "");
    xml = СтрЗаменить(xml,"xsi:type=""xs:string""", "");
    xml = СтрЗаменить(xml,"xsi:type=""xs:boolean""", "");
    xml = СтрЗаменить(xml,"xsi:type=""xs:dateTime""", "");
    xml = СтрЗаменить(xml,"T00:00:00", "");
    xml = СтрЗаменить(xml,"0001-01-01", "");
    xml = СтрЗаменить(xml,"<Value ", "<Vl");
    xml = СтрЗаменить(xml,"", "");
	xml = СтрЗаменить(xml,"false", "0");
	xml = СтрЗаменить(xml,"true", "1");
    xml = СтрЗаменить(xml,"xsi:type=""Null""", "");  
//Для красоты 1С рисует структуру при помощи табуляции, это удобно читать, то для парсинга – это мусор, поэтому мы убираем все лишние табуляции, что позволяет сократить объем данных в 2 раза
    xml = СтрЗаменить(xml,"    ","");
	xml = СтрЗаменить(xml,"d2p","ns");
    Возврат xml
КонецФункции
Показать
16. Sashares 35 13.10.20 18:11 Сейчас в теме
(15)Все равно не понимаю, в чем смысл замены пространства имен в xml, ведь при чтении его в XDTO, оно же все равно теряется все. Разве нет?
При вызове метода WS XDTO ведь обратно в xml преобразуется.
17. dadel 19 14.10.20 08:07 Сейчас в теме
(16)Честно говоря не так часто делаю вебсервисы, что бы так в тонкостях совсем на "ТЫ" быть... последний раз года 4 назад делал уже и там я отвечал на приходящие запросы от разных источников. НТТР недавно делал обмены, но там с этим проще в разы, ни разу не трогая разобрался быстро. А тут,... вроде бы почти всё готово уже, но из за префикса и этих вот дат, при чем не во всех полях, только 4 даты ругаются на формат, встрял...
18. dadel 19 14.10.20 09:48 Сейчас в теме
(16)Так, по префиксам. Сейчас вернулся к стоковому запросу с префиксом d2p и запрос прошел. Получил в ответе ошибку по этим 4 полям с датами. Не верный формат даты...
20. dadel 19 14.10.20 11:16 Сейчас в теме +1 $m
Похоже решения как такового получая схему от ЭТП динамически нет. Нужно будет WSСсылку создавать, в ней изменить нужные даты на тип Сринг и так формировать.
ЭТП предлагают весь XML собирать руками только.
Так что вопрос скорее закрыт видимо.
21. ARMAGEDONF 07.12.23 10:41 Сейчас в теме
(20) dadel, подскажи как решил проблему с временной зоной? У меня такая же проблема. В схеме передается дата без часового пояса. Интеграция с ГПБ ЭТП.
22. dadel 19 07.12.23 17:01 Сейчас в теме
(21)
(21)Добрый день!
Тогда ни как не смог используя WSDL ссылку для составления запроса.
Выход только руками собирать XML запрос, не используя объектную модель и вставлять в тело собранную её в сообщение.
Поддержка ЭТП ГПБ согласилась с багом, но исправить может позже обещали. А позже я уже этот вопрос не касался.
23. ARMAGEDONF 08.12.23 15:24 Сейчас в теме
(22)
XML запрос

Пока не исправили и вряд ли исправят. Cобрать вручную через запись XML - это мне понятно и по силам. А как передать XML? Через WSПрокси - не получиться, какой вариант передачи использовать? Можешь подсказать? А лучше кинь пример. Пожалуйста.
24. dadel 19 10.12.23 12:17 Сейчас в теме
(23)
(23)
Из другой задачи пример сейчас могу показать. /Это я интеграцию бухни с налоговым мониторингом делал. Тут нужно заголовки будет ещё прописывать, они в пользовательском режиме задаются в справочнике настроек, но в приведенном коде оставлены примеры для отладки.
Функция _Веб_Сервис_Данные_Отправить( пПараметры ) Экспорт
	
	лДанные = пПараметры._Данные;
	
	лРезультат = Новый Структура( "_Дата_Отправки, _Ошибка_Описание, _Состояние" );
	
	лHTTP_Запрос = Новый HTTPЗапрос( пПараметры._Сервер_Ресурс );
	
	//лHTTP_Запрос.Заголовки.Вставить( "Content-Length",СтрДлина(лДанные)); // тестово заголовок
	
	Если ТипЗнч( пПараметры._Заголовки ) = Тип( "Соответствие" ) Тогда
		Для Каждого лЭлемент Из пПараметры._Заголовки Цикл
			
			//!!!!! вычисляемый заголовок, сделать через спец. теги
			//лHTTP_Запрос.Заголовки.Вставить( "Content-Type", "multipart/related;type=""text/xml"";boundary=""" + пПараметры._Данные_Блоки_Разделитель + """" );
			//лHTTP_Запрос.Заголовки.Вставить( "Content-Type", "multipart/related;type=""text/xml"";boundary=""" + _Boundary() + """" );
			
			лHTTP_Запрос.Заголовки.Вставить( лЭлемент.Ключ, лЭлемент.Значение );
		КонецЦикла;
	КонецЕсли;
	
	Если ТипЗнч( лДанные ) = Тип( "ДвоичныеДанные" ) Тогда
		//лHTTP_Запрос.Заголовки.Вставить( "Content-Type", "multipart/related;type=""text/xml"";boundary=""" + _Boundary() + """" );																			 
		лHTTP_Запрос.Заголовки.Вставить( "Content-Type", "Multipart/Related; type=""application/xop+xml"";boundary=""" + _Boundary() + """" );																	

		лHTTP_Запрос.УстановитьТелоИзДвоичныхДанных( лДанные );
	Иначе  
		//лHTTP_Запрос.Заголовки.Вставить( "Content-Length",СтрДлина(лДанные)); // тестово заголовок  (1С не умеет корректно высчитывать длину сообщения)

		лHTTP_Запрос.УстановитьТелоИзСтроки( лДанные, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать );
	КонецЕсли;
	
	Если пПараметры._Защищенное_Соединение = Истина Тогда
		//лЗащищенное_Соединение = Новый ЗащищенноеСоединениеOpenSSL( , Новый СертификатыУдостоверяющихЦентровОС );
		лЗащищенное_Соединение = Новый ЗащищенноеСоединениеOpenSSL;
	Иначе
		лЗащищенное_Соединение = Неопределено;
	КонецЕсли;
	
	лПрокси_Сервер = Новый ИнтернетПрокси( Истина );
	
	лHTTP_Соединение = Новый HTTPСоединение( пПараметры._Сервер_Имя, пПараметры._Порт, пПараметры._Пользователь, пПараметры._Пароль, лПрокси_Сервер, пПараметры._Таймаут, лЗащищенное_Соединение, Ложь ); 
	
	лРезультат._Дата_Отправки = ТекущаяДата();
	
	Попытка
	
		Если пПараметры._HTTP_Запрос_Метод = Перечисления.НМ_HTTP_Запрос_Методы._POST Тогда
			лHTTP_Ответ = лHTTP_Соединение.ОтправитьДляОбработки( лHTTP_Запрос );
		ИначеЕсли пПараметры._HTTP_Запрос_Метод = Перечисления.НМ_HTTP_Запрос_Методы._GET Тогда
			лHTTP_Ответ = лHTTP_Соединение.Получить( лHTTP_Запрос );
		ИначеЕсли пПараметры._HTTP_Запрос_Метод = Перечисления.НМ_HTTP_Запрос_Методы._PATCH Тогда
			лHTTP_Ответ = лHTTP_Соединение.Изменить( лHTTP_Запрос );
		ИначеЕсли пПараметры._HTTP_Запрос_Метод = Перечисления.НМ_HTTP_Запрос_Методы._HEAD Тогда
			лHTTP_Ответ = лHTTP_Соединение.ПолучитьЗаголовки( лHTTP_Запрос );
		ИначеЕсли пПараметры._HTTP_Запрос_Метод = Перечисления.НМ_HTTP_Запрос_Методы._PUT Тогда
			лHTTP_Ответ = лHTTP_Соединение.Записать( лHTTP_Запрос );
		ИначеЕсли пПараметры._HTTP_Запрос_Метод = Перечисления.НМ_HTTP_Запрос_Методы._DELETE Тогда
			лHTTP_Ответ = лHTTP_Соединение.Удалить( лHTTP_Запрос );
		Иначе
			лHTTP_Ответ = лHTTP_Соединение.ОтправитьДляОбработки( лHTTP_Запрос );
		КонецЕсли;
		
		Если лHTTP_Ответ.КодСостояния = 200 Тогда
			лРезультат._Состояние = Перечисления.НМ_СтатусОтправленногоБлока_ИУС_НК.БлокДанныхОтправлен;
		Иначе
			лРезультат._Состояние = Перечисления.НМ_СтатусОтправленногоБлока_ИУС_НК.ОшибкаОтправки;
			лРезультат._Ошибка_Описание = "Код состояния: " + лHTTP_Ответ.КодСостояния + Символы.ПС + Символы.ПС + лHTTP_Ответ.ПолучитьТелоКакСтроку();
		КонецЕсли;
		
	Исключение
		лРезультат._Состояние = Неопределено;
Перечисления.НМ_СтатусОтправленногоБлока_ИУС_НК.ОшибкаОтправки;
		лРезультат._Ошибка_Описание = "" + ТекущаяДата() + ": " + ИнформацияОбОшибке().Описание + ?( ТипЗнч( ИнформацияОбОшибке().Причина ) = Тип("ИнформацияОбОшибке"), ": " + ИнформацияОбОшибке().Причина.Описание, "" )
		+ "; Сервер: " + пПараметры._Сервер_Имя + "; Ресурс: " + пПараметры._Сервер_Ресурс + "; Порт: " + пПараметры._Порт + "; Пользователь: " + пПараметры._Пользователь + ";";
	КонецПопытки;
	
	Возврат лРезультат;
КонецФункции
Показать
26. dadel 19 10.12.23 12:33 Сейчас в теме
(24) Ещё на всякий случай. Тут в коде прикрепление двоичных данных, но там в формате МТОМ идет присоединение файлов. Так, для информации ещё на всякий случай, что тут не в base64, и с такой XML там и свои заголовки идут.
25. dadel 19 10.12.23 12:23 Сейчас в теме
(23)
А, ещё вроде помнится момент с заголовками. Там 1С не умеет правильно длину определять и заголовок это вот приводил к ошибке вроде, но это не точно... уже не помню.
лHTTP_Запрос.Заголовки.Вставить( "Content-Length",СтрДлина(лДанные));
27. dadel 19 10.12.23 12:38 Сейчас в теме
(22) И сейчас перечитал свой пост выше и вспомнил что в итоге я сделал, там выше это и написано было уже.
Тогда я получил от них файл с описанием WSDL. В нем заменил тип дата на строка в нужных полях и просто как строку с временной зоной туда текст вставил и заработало. 3 года прошло, уже позабылось малость)))
А у себя обращение не к их WSDL сделал, а в совей конфигурации сохранил полученную с изменениями своими и уже к ней обращался.
Недостаток явный в том, что при изменении у них чего-то в WSDL - надо запрашивать снова от них свежую и снова править и подгружать в свою конфу.
28. ARMAGEDONF 11.12.23 10:43 Сейчас в теме
(27)
Добрый день. Спасибо за помощь буду пробовать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот