Обмен данными через Web Сервисы

02.09.19

Интеграция - Перенос данных 1C

Ознакомительная статья о том, как загружать\выгружать данные с одной базы в другую, используя Web Сервисы.

Приветствую вас, друзья! Сегодня я хочу поделиться с вами опытом работы с WS (Web-Servis). 
Для работы веб-сервиса должен быть установлен Apache, либо iis.

Для примера, выгрузим таблицу остатков.

1. Создаем Web -Service в удаленной базе , и назовем его "ObmenWS".

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. После этого необходимо заполнить свойства Web -Сервиса, (Вкладка "Прочее"):

     1) URL Пространства имен - Требуется для идентификации веб-сервиса, по сочетанию его имени и пространству имен, укажем для примера "1.1.1.1";

     2) Пакеты XDTO - это механизм, разработанный фирмой “1С” для обмена данными с другими программными системами посредством XML, позволяющий на уровне языка 1С оперировать не узлами XML, а прикладными понятиями “Сотрудник”, “Счет” и привычными встроенными типами (“ТаблицаЗначений”, “СправочникСсылка” и т.п.). В данном примере не будем создавать собственные пакеты, а будем использовать встроенные пакеты 1С (а именно  - "http://v8.1c.ru/8.1/data/core"). Данный пакет содержит формат "Двоичные данные" - что поможет нам передавать любые типы через хранилище данных.
     3) Имя файла публикации - название файла *.1CWS, имя файла публикации может быть любым, но желательно латинским шрифтом и обязательно с расширением 1cws и желательно должно совпадать с именем каталога на web-сервере. Назовем его как и наш WS - "ObmenWS".

 

 

 

 

 

 

 

 

 

 

 

 


 

Наш Web Сервис готов к работе! Осталось добавить операции в WS для загрузки и выгрузки данных.

2. Создаем операцию с названием "ОстаткиТоваровНаСкладах", и с типом значение -ХранилищеДанных (ValueStorage):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Создаем параметры для нашей операции. Для примера я создам 3 параметра :

     1) НачалоПериода - с типом Дата (Date);

     2) КонецПериода  -  с типом Дата (Date);

     3) Склад  - С типом Строка (String);

Количество параметров не ограничено, можно создавать сколько необходимо для конкретной задачи (Добавить Организацию например или контрагента и тд.) 

 После добавления параметров, приступаем к добавлению программного кода к нашей операции "ОстаткиТоваровНаСкладах". Нажимаем в свойствах операции на "ИмяПроцедуры" и открываем модуль WS. 

Необходимые данные мы получим запросом, и программный код будет иметь следующий вид:

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Наименование КАК НоменклатураНаименование,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Запись, , Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты";
	
	Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
	Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
	Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию(Склад,истина));
	
	ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
	Хранилище = новый ХранилищеЗначения(ТаблицаРезультата);
	Возврат Хранилище;

На этом наш Web Сервис готов! Публикуем наш web сервис и можно подключаться к нему из другой базы.

 

 3. Пример подключения из другой базы  для получения остатков за период по определенному складу:

       1) Создаем внешнюю обработку, в модуле обработки прописываем следующий код:

Процедура ПолучитьТаблицуСДругойБазы()
	НачалоПериода = ТекущаяДата();
	КонецПериода  =  ДобавитьМесяц(ТекущаяДата(),-3);   //3 месяца назад
	Склад = "Основной склад";
	
	Таблица =  ПолучениеДанных(НачПериод,КонПериод,Склад);   //Первый вариант, 
	//Если операций станет много, что бы не писать для каждую операцию свою функцию можно создать одну универсальную
	Таблица =  ПолучениеДанныхОптимизированно("ОстаткиТоваровНаСкладах",НачПериод,КонПериод,Склад); //Второй вариант - оптимизированно!)
	
КонецПроцедуры

Функция ПодключениеКWS()
	МестоположениеWSDL =  			"http://localhost/ObmenWS/ws/ObmenWS.1cws?wsdl" ; //localhost - указываем ваш ip-адрес, где опубликован ws
	ИмяПользователя =   			"Администратор";
	Пароль=             			"Пароль";
	URIПространстваИменСервиса =  	"1.1.1.1 ";
	ИмяСервиса= 					"ObmenWS";
		
	ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;            
	
	ВСОпределение = Новый WSОпределения(МестоположениеWSDL, ИмяПользователя, Пароль,,,ЗащищенноеСоединение);        	
	ВСПрокси = Новый WSПрокси(ВСОпределение,URIПространстваИменСервиса , ИмяСервиса,ИмяСервиса+"Soap" );     
	
	ВСПрокси.Пользователь = ИмяПользователя;
	ВСПрокси.Пароль = Пароль;
		
	Возврат ВСПрокси;

КонецФункции

Функция ПолучениеДанныхОптимизированно(ИмяФункцииWS, П1 = Неопределено,
						П2 = Неопределено,
						П3 = Неопределено,
						П4 = Неопределено,
						П5 = Неопределено,
						П6 = Неопределено,
						П7 = Неопределено,
						П8 = Неопределено)
						
	Подключение = ПодключениеКWS();
	Данные = Вычислить("Подключение."+ИмяФункцииWS+"("+?(П1=Неопределено,"","П1")
													 +?(П2=Неопределено,"",",П2")
													 +?(П3=Неопределено,"",",П3")
													 +?(П4=Неопределено,"",",П4")
													 +?(П5=Неопределено,"",",П5")
													 +?(П6=Неопределено,"",",П6")
													 +?(П7=Неопределено,"",",П7")
													 +?(П8=Неопределено,"",",П8") + ")");
	Ответ = Данные;
	Возврат Ответ;
КонецФункции

Функция ПолучениеДанных(НачПериод,КонПериод,Склад)
						
	Подключение = ПодключениеКWS();
	Хранилище = Подключение.ОстаткиТоваровНаСкладах(НачПериод,КонПериод,Склад);
	Таблица = Хранилище.Получить();
	Возврат Таблица;
КонецФункции

На этом всё, Спасибо за внимание! 
Открыт для критики и наиболее изящных методов ! (=

Web Сервисы

См. также

SALE! 10%

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

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    169478    352    281    

388

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    144383    837    297    

432

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.20.x), также подходят для релиза 11.5 (11.5.19.x).

35000 руб.

23.07.2020    54650    242    73    

196

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    73400    193    153    

130

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    37742    103    69    

98

SALE! 10%

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    196578    157    244    

287

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.240.x) и БП 3.0 (3.0.169.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    25388    179    52    

136

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    82189    338    253    

288
Отзывы
37. VPanin56 565 25.03.20 09:02 Сейчас в теме
У нас тоже активно используется Web Сервис, но помимо функций обмена есть еще и процедуры "Выполнения кода" и "Выполнения запроса"

#Область Сериализаци
Функция Десериализовать(XMLСтруктураСериализованногоОбъекта)
	ЧтениеXMLДанных = Новый ЧтениеXML;
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	ЧтениеXMLДанных.Закрыть();  
	Возврат ТЗ;
КонецФункции

Функция Сериализовать(ОбъектСериализации)
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции
#КонецОбласти

Функция ВыполнитьЗапрос(ТекстЗапроса, Параметры, ТипОбходаЗапроса)
		
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	
	ТабПараметры = Десериализовать(Параметры); 
	Для Каждого Стр из ТабПараметры Цикл
		Запрос.УстановитьПараметр(Стр.Ключ, ПолучитьПараметрЗапроса(Стр));
	КонецЦикла;
	
	Таб = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса[ТипОбходаЗапроса]);
	
	результат = Сериализовать(Таб);
	
	Возврат Результат;
	
	
КонецФункции

Функция ПолучитьПараметрЗапроса(Строка)
	
	Если Строка.Тип="Вычислить" тогда
		Возврат Вычислить(Строка.Значение);
	ИначеЕсли Строка.Тип="Выполнить" тогда
		ДопПараметры = Строка.ДопПараметры;
		Значение = Неопределено;
		Выполнить(Строка.Значение);
		Возврат Значение;
	Иначе
		Возврат Строка.Значение;
	КонецЕсли;	
	
КонецФункции



Функция ВыполнитьКод(ТекстКода, Параметры)
	
	Ошибка_ = Ложь;
	ТекстОшибки_ = "";
	РезультатВыполнения = Неопределено;
		
	Попытка
		Выполнить(ТекстКода);
	Исключение
		Ошибка_ = Истина;
		ТекстОшибки_ = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Сериализовать(Новый Структура("Ошибка, ТекстОшибки, Результат", Ошибка_, ТекстОшибки_, РезультатВыполнения));
	
КонецФункции

Показать


Очень удобно использовать для разных задач. Web сервис уже не переписывается, а отправляется в него то что нужно выполнит, или Запрос, или Код 1С
shootnik; mistervoron; user649057_89194416094; user682948_rusmaxval; user1027191; Gipatalamus; Noveng; 4ed; wowik; Andry2004; wunderland; maksal; user5300; +13 Ответить
40. VPanin56 565 07.04.20 15:34 Сейчас в теме
Вот пример куска кода из самописки по обслуживанию БАЗ. Кусок где именно вызывается "Выполнить Запрос" не нашел. Но при вызове "Выполнить Код" так же передается и текст запроса и параметры для этого запроса. Оптимально использовать именно его.
WebСервисБух - название нашего расширения подключенного в Бух базах и опубликованного.
.....
....
		Параметры = Новый СТруктура;
		Параметры.Вставить("ДатаВключенияПросрочкиПользователей", Дата("20180101"));
		Параметры.Вставить("ПросрочкаРаботыВПрограммеДоЗапрещенияВхода", Константы.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода.Получить());

		ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(Параметры);
		МойXML = Новый ЗаписьXML;
		МойXML.УстановитьСтроку();
		ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
		Параметры = МойXML.Закрыть();
		
			Пользователь = Константы.ПользовательДляПодключения.Получить();
			Пароль		 = Константы.ПарольДляПодключения.Получить();
			
			ВСОпределение = Новый WSОпределения(База.WSСсылка, Пользователь, Пароль);
			Соединение = Новый WSПрокси(ВСОпределение, "WebService1", "WebСервисБух", "WebСервисБухSoap");

			Соединение.Пользователь = Пользователь;
			Соединение.Пароль 		= Пароль;

			ОтветWS = Соединение.ВыполнитьКод(ТекстКонтрольАктивностиПользователей(), Параметры);

			ЧтениеXMLДанных = Новый ЧтениеXML;
			ЧтениеXMLДанных.УстановитьСтроку(ОтветWS);
			Ответ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
			ЧтениеXMLДанных.Закрыть();
			
			Если Ответ.Ошибка тогда
				ЗаписьЖурналаРегистрации("РегЗаписьЖурналаРегистрации", УровеньЖурналаРегистрации.Ошибка,,, СокрЛП(База)+" : "+Ответ.ТекстОшибки);
			КонецЕсли;

Функция ТекстКонтрольАктивностиПользователей() Экспорт
	
	ТекстКода = "
	|	УстановитьПривилегированныйРежим(Истина);
	|
	|	ЧтениеXMLДанных = Новый ЧтениеXML;
	|	ЧтениеXMLДанных.УстановитьСтроку(Параметры);
	|	Параметры = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	|	ЧтениеXMLДанных.Закрыть();
	|
	|	Запрос = Новый Запрос;
	|	Запрос.Текст = ""
	|		|ВЫБРАТЬ
	|		|	Пользователи.Ссылка КАК Пользователь,
	|		|	ВЫБОР
	|		|		КОГДА ЕСТЬNULL(СведенияОПользователях.СрокДействия, &ПустаяДата) <> &ПустаяДата
	|		|			ТОГДА ЕСТЬNULL(СведенияОПользователях.СрокДействия, &ПустаяДата) <= &НачалоДняТекущейДатыСеанса
	|		|		ИНАЧЕ ЛОЖЬ
	|		|	КОНЕЦ КАК СрокДействияИстек
	|		|ИЗ
	|		|	Справочник.Пользователи КАК Пользователи
	|		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
....
....
....
	|	Запрос.УстановитьПараметр(""ПустаяДата"", '00010101');
	|	Запрос.УстановитьПараметр(""НачалоДняТекущейДатыСеанса"",               	НачалоДня(ТекущаяДатаСеанса()));
	|	Запрос.УстановитьПараметр(""ДатаВключенияПросрочкиПользователей"",      	Параметры.ДатаВключенияПросрочкиПользователей);
	|	Запрос.УстановитьПараметр(""ПросрочкаРаботыПользователей"",             	Параметры.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода);
	|	Запрос.УстановитьПараметр(""ДатаВключенияПросрочкиВнешнихПользователей"",	Параметры.ДатаВключенияПросрочкиПользователей);
	|	Запрос.УстановитьПараметр(""ПросрочкаРаботыВнешнихПользователей"",        	Параметры.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода);
	|
	|   Выборка = Запрос.Выполнить().Выбрать();
	|   
	|   ИнформацияОбОшибке = Неопределено;
	|   Пока Выборка.Следующий() Цикл
	|   	Пользователь = Выборка.Пользователь;
	|	КонецЦикла;
	|
	|	РезультатВыполнения = Истина;
	|";

	Возврат ТекстКода;
	
КонецФункции

Показать
mistervoron; user682948_rusmaxval; user1027191; Gipatalamus; 4ed; +5 Ответить
41. VPanin56 565 07.04.20 16:12 Сейчас в теме
Или вот кусок кода по формированию параметров для передачи

Таб = Новый ТаблицаЗначений;
			Таб.Колонки.Добавить("Ключ");
			Таб.Колонки.Добавить("Тип");
			Таб.Колонки.Добавить("Значение");
			Таб.Колонки.Добавить("ДопПараметры");
			
			// ОРГАНИЗАЦИЯ
			Стр = Таб.Добавить();
			Стр.Ключ = "Организация";
			Если СокрЛП(ОфициальнаяОрганизация.ВнешняяСсылка) = "" Тогда
				Стр.Тип = "Выполнить";
				Текст = "Значение = Справочники.Организации.НайтиПоНаименованию(ДопПараметры.Организация)";
				ДопПар = Новый Структура("Организация", СокрЛП(ОфициальнаяОрганизация.Наименование));
				Стр.ДопПараметры = ДопПар;
			Иначе
				Стр.Тип = "Выполнить";
				Текст = "Значение = ЗначениеИзСтрокиВнутр(ДопПараметры.ВнешняяСсылка)";
				ДопПар = Новый Структура("ВнешняяСсылка", СокрЛП(ОфициальнаяОрганизация.ВнешняяСсылка));
				Стр.ДопПараметры = ДопПар;
			КонецЕсли;
			Стр.Значение = Текст;
			
			// НачалоПериода
			Стр = Таб.Добавить();
			Стр.Ключ = "НП";
			Стр.Тип = "Дата";
			Стр.Значение = НачалоПериода;
			
			// НачалоПериода
			Стр = Таб.Добавить();
			Стр.Ключ = "КП";
			Стр.Тип = "Дата";
			Стр.Значение = КонецДня(КонецПериода);
Показать
user682948_rusmaxval; user1027191; Gipatalamus; 4ed; +4 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Boyborodin 03.09.19 08:18 Сейчас в теме
Советую делать один параметр входящий типа string и исходящий такой же. В строку кидать текст JSON. В JSON можно запаковывать любое количество параметров, даже таблицы значений. Без муторной работы с XDTO, а сама запаковка и распаковка занимает несколько строк кода. Так же если при доработке придется добавлять входные/выходные параметры сам web-сервис можно уже не перенастраивать.
svmix; kabantus; user1549775; user682948_rusmaxval; Izumov; user5300; KolBbl4; Артано; akR00b; wunderland; user774630; danjer74; duhin; ybatiaev; hakerxp; Jeka44; Lazio; kuzyara; marat3581525; TODD22; Robbi; wowik; Jokemas; TeMochkiN; Glebb_NSK; Fox-trot; +26 2 Ответить
2. user5300 1073 03.09.19 08:22 Сейчас в теме
(1) Хорошая идея! Спасибо за совет !)
3. AlX0id 03.09.19 08:37 Сейчас в теме
(1)
Тут только один нюанс - в пользу использования того же XDTO - не будет автоматической проверки корректности того, что же вы запихали в этот JSON..
В принципе, сам использую похожий способ - для работы с внешними источниками - на вход беру строки xml, кодированные в base64. Не очень красиво, зато внешним кодерам удобно и понятно.
Andreeei; +1 Ответить
6. Boyborodin 03.09.19 09:02 Сейчас в теме
(3)

Запаковываем

	 ЗаписьJSON = Новый ЗаписьJSON;
	 ЗаписьJSON.УстановитьСтроку();
	 СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СтруктураДанных, НазначениеТипаXML.Явное);
	 StringJS = ЗаписьJSON.Закрыть();


Распаковываем

	ЧтениеJS = Новый ЧтениеJSON;
	ЧтениеJS.УстановитьСтроку(StringJS);
	СтруктураДанных = СериализаторXDTO.ПрочитатьJSON(ЧтениеJS);
	ЧтениеJS.Закрыть();


JSON автоматически всё сериализует. Удобнее чем XML. Можно еще пожать, если данные объемные.
user682948_rusmaxval; zannv; KolBbl4; Артано; wunderland; duhin; ybatiaev; user5300; wowik; +9 Ответить
7. user5300 1073 03.09.19 09:05 Сейчас в теме
(6) Кстати, а если структура баз отличается ? Допустим если выгрузить физ лица с ЗУП в УТ, у них же разные структуры... Реквизиты и тд., Ошибки не будет ?)
8. Boyborodin 03.09.19 09:14 Сейчас в теме
(7)

Ошибка будет. Тем более такие обмены обычно делают в нетиповых конфигурациях. Для типовых есть типовые инструменты. В структуру лучше кидать примитивные параметры: дата, число, строка, или таблицу значений из примитивных данных.

Для вашего примера:

СтруктураДанных = Новый Структура;
СтруктураДанных.Добавить("КонецПериода", КонецПериода);
СтруктураДанных.Добавить("НачалоПериода", НачалоПериода);
СтруктураДанных.Добавить("Склад", Склад);


И не забыть после успешного завершения процедуры вернуть какой-нибудь признак что всё прошло хорошо.
Артано; ybatiaev; user5300; +3 Ответить
10. AlX0id 03.09.19 09:26 Сейчас в теме
(6)
Я не про удобство - автоматического контроля состава данных внутри JSON нет.
XML, кстати, я в итоге разбираю с помощью XDTO все равно.
31. new_user 07.01.20 15:54 Сейчас в теме
(1) только в таком случае wsdl о том что Вы в этот входящий параметр передадите не расскажет( А вроде веб-сервис в том числе для wsdl и используется. Иначе Вам где то описание сервиса размещать надо и руками описывать что можно в этот входящий параметр положить.
user5300; +1 Ответить
4. Fox-trot 163 03.09.19 08:44 Сейчас в теме
каталог базы должен иметь полные права

как тебя понимать, саид? (с)
5. user5300 1073 03.09.19 08:50 Сейчас в теме
(4) Забыл..., если база файловая- каталог базы должен иметь полные права
9. Fox-trot 163 03.09.19 09:24 Сейчас в теме
(5) может все же пользователь должен иметь полные права? тогда какой пользователь?
11. user5300 1073 03.09.19 09:51 Сейчас в теме
(9)
Прикрепленные файлы:
Fox-trot; +1 Ответить
27. Сто27001 05.09.19 08:12 Сейчас в теме
(4) Если с русского перевести на русский, то "каталог базы должен иметь полные права" означает, что пользователь ОС от имени которого запущены IIS или Apache, должен иметь полные права на каталог в котором расположена публикуемая файловая база.
bgazobeton; user5300; elizarovs; Fox-trot; +4 Ответить
12. ellavs 1056 03.09.19 11:12 Сейчас в теме
Довольно часто пользуемся подобным функционалом для обмена данными между базами (только используем HTTP-сервисы). Это в основном, когда мы не хотим пускать пользователей в основную базу, но им нужно поработать с данными. Есть другая конфигурация, например, не содержащая ПДн, куда доступ предоставлен бОльшему количеству пользователей, и в ней получаем данные из основной БД через сервис.
13. logos 216 03.09.19 16:53 Сейчас в теме
А зачем в этой ситуации вообще SOAP? Зачитывание wsdl, сериализация в ХЗ, обратная десериализация. Про json уже написали, так давайте последовательно советовать и http-сервис. Передаем в одном из полей метод, в другом данные. Сериализация/десериализация отлично делается методами ПрочитатьJSON, ЗаписатьJSON. И никакого XDTO вообще не нужно.
ybatiaev; sevushka; +2 Ответить
17. Ndochp 103 04.09.19 09:16 Сейчас в теме
(13)ХДТО нужен исключительно для автоматической проверки входящих данный на соответствие формату. К джейсону такое универсально на коленке не прикрутить.
Andreeei; user5300; +2 Ответить
18. logos 216 04.09.19 09:18 Сейчас в теме
(17) Какая в данном сценарии может быть проверка? Описывается получение произвольных данных запросом (базовых типов). Считаю, что использование SOAP имеет смысл только при работе с "ненадежным" клиентом, от которого можно получить "непредсказуемый" input. А когда пишешь свои сервисы - это избыточная перестраховка, сильно усложняющая разработку.
ybatiaev; Fox-trot; +2 Ответить
19. Ndochp 103 04.09.19 09:36 Сейчас в теме
(18) У меня 8 видов баз под контролем. И они периодически обновляются. Вот тебе и источник непредсказуемого инпута.
Ты же не будешь правила писать для превращения документа в джейсон, правильно? ты сделаешь платформенную сериализацию.
А на стороне приёмника уже сделаешь какой-то алгоритм разбора, если базы не совпадают.

И вот, то что писали в "Реквизит" начали писать в "Реквизит подробно", а в "Реквизит" стали писать укрупненные типы.
В случае SOAP алгоритм на принимающей стороне долбанется от новых реквизитов в которые переложили нужные тебе данные и ты полезешь разбираться. А в разборе джейсона ты проигнорируешь "Реквизит подробно", привычно заберешь все из "Реквизит", и получишь неверный документ.
Vladimir Litvinenko; user5300; +2 Ответить
20. logos 216 04.09.19 12:39 Сейчас в теме
(19) Давайте всё таки на Вы. Если "левая рука" не знает, что делает правая - никто не запрещает использовать SOAP. Однако, в контексте публикации автора, http сервис и JSON сериализатор дадут более аккуратный и более быстрый код.
Артано; ybatiaev; +2 Ответить
21. Ndochp 103 04.09.19 13:00 Сейчас в теме
(20) Давайте на Вы.
Левая рука - Вы. Правая - 1С. Обмена между самописными базами я за свою карьеру не встречал, обычно нетеленка обменивается с доработанной типовой, или две доработанных между собой. В нетленка - 1С непредсказуемость только на стороне приёмника, а вот в 1С-1С - с обеих сторон.

У автора вообще контекста нет. У него есть инструмент и пример использования. Ясно, что код без проверок будет быстрее и компактнее. Как и подшипник без смазки крутится быстрее. Только вот в реальной жизни подшипники смазывают, а в коде делают проверки. И SOAP даёт для них автоматизированный инструмент, а Json оставляет все на откуп пользователю.
В итоге в реальности на до исходить из своего контекста - передача ограниченного числа слабосвязанных объектов легко делается на Jsonе, кусочек базы данных - надежнее на XDTO.
pisarevEV; Vladimir Litvinenko; +2 Ответить
22. logos 216 04.09.19 13:44 Сейчас в теме
(21) Левая рука - клиент, правая - сервер. Я не вижу, где тут код от ООО "1С-Софт", в случае, если мы пишем свой веб-сервис. Если Вы предоставляете сервер сторонним клиентам - я обеими руками за SOAP, когда ошибка в рассинхронизации протокола - это просто ошибка разработчика(ов) информационной системы. Впрочем, настаивать не буду, хотите SOAP - я не в праве Вам этого запретить.
23. Ndochp 103 04.09.19 15:34 Сейчас в теме
(22) Код от 1С вот тут: СериализаторXDTO.ЗаписатьJSON (http://v8.1c.ru/o7/201501json/index.htm) Соответственно в поле "Значение" будет то, что написала 1С.
24. logos 216 04.09.19 16:00 Сейчас в теме
(23) А я предлагаю пользоваться другим сериализатором:
Глобальный контекст (Global context)
ЗаписатьJSON (WriteJSON)
25. Ndochp 103 04.09.19 16:13 Сейчас в теме
(24)
В формате JSON допускается записывать только значения следующих типов:
Строка,
Число,
Булево,
Дата (преобразованная в строку),
Массив,
ФиксированныйМассив,
Структура,
ФиксированнаяСтруктура,
Соответствие,
ФиксированноеСоответствие.

Успехов в передаче документов.
26. logos 216 04.09.19 16:37 Сейчас в теме
(25) Передаются структуры/соответствия и массивы. К этим типам приводятся необходимые получателю объекты. Вы же не будете утверждать, что XDTO (xsd) у Вас волшебным образом самостоятельно заполняется? Платформенным сериализатором многое не передать. В любом случае придётся заполнять "объект xdto".
30. new_user 07.01.20 15:49 Сейчас в теме
(13) В целом - согласен, только:

ЗаписатьJSON
- не может сериализовать таблицу значений, а:

СериализаторXDTO.ЗаписатьJSON
- может.
14. EMelihoff 03.09.19 16:55 Сейчас в теме
у меня наверное профессиональная деградация, при виде переменной "Хранилище" думал минут 5 причём тут хранилище ))
15. nbeliaev 836 04.09.19 06:13 Сейчас в теме
Методы, параметры веб-сервиса на кириллице.
Логин и пароль также.
Если дергать такой веб-сервис не из платформы 1С, то будут проблемы.
16. user5300 1073 04.09.19 07:45 Сейчас в теме
(15) Это пример обмена между базами ) Конечно можно все переделать на латиницу для работы с другими сервисами )
28. alexeypenzin 2 09.10.19 11:08 Сейчас в теме
Статья отличная, но хочется продолжения.
На практике, в основном, нужно выгружать в базу приемник только измененные объекты. Не совсем понятно как это реализовать с помощью веб-сервисов. Как в данном обмене применить планы обмена? Когда и где очищать таблицу измененных объектов?

Коротко вопрос: На клиенте получили данные, как на сервере узнать что клиент принял данные и на сервере удалить данный объект из таблицы измененных объектов?
29. user5300 1073 09.10.19 11:49 Сейчас в теме
(28) Спасибо, статья для общего ознакомления )

Выгрузку и загрузку объектов можно осуществить разными способами, в основном используется чтение\запись xml между нетиповыми конфигурациями , далее можно прикрутить планы обмена под свои задачи. Для обмена между типовыми - придется использовать расширения.

Функции веб сервиса выполняются на сервере, в случае возникновении ошибки - система сообщит об этом ) можно также добавить функцию проверки после записи либо сразу, например:
Функция ЗаписьДокумента(Параметры)
  попытка
    док = новыйДокумент;
    Док.Записать(Проведение);
    Ответ = "Создан новый док: + Док.Ссылка;
  Исключение
    Ответ = "ошибка: "  + ОписаниеОшибки();
  КонецПопытки
  Возврат Ответ;
Конецфункции
Показать

//Пример оповещения пользователя...

Возможно в будущем будет разбор более конкретной задачи с примерами и обработками ...)
32. frkbvfnjh 809 25.03.20 06:53 Сейчас в теме
На мой взгляд Web-сервисы - это самое ужасное, что можно использовать для обмена. Лично я написал на http-сервисах - куда стабильнее и более гибко. При плохом интернете или большом объеме данных web-сервис тупо умирает, часто вызывая блокировки. Web-сервисы сложны в разработке для новичков и вообще в 1С это какая то не-до-технология. Кроме того, при использовании http-сервисов, можно еще и предварительно сжать данные, я уж не знаю как вы это сделаете в web-сервисе.
33. user5300 1073 25.03.20 08:05 Сейчас в теме
(32) в веб сервисе тоже можно сжимать данные типовыми средствами например )

Возврат новый ХранилищеДанных(ТабличнаяЧасть,Новый СжатиеДанных(9));
35. frkbvfnjh 809 25.03.20 08:09 Сейчас в теме
34. user5300 1073 25.03.20 08:06 Сейчас в теме
(32) У каждого свои подходы для решения задач, это всего лишь пример того как можно использовать веб сервисы )
36. frkbvfnjh 809 25.03.20 08:10 Сейчас в теме
(34) да согласен, но боль от использования веб-сервисов не утихнет никогда
38. Sergik_D 23 25.03.20 18:04 Сейчас в теме
(32) У меня 1с обменивается с приложением на Android через Web-сервисы. Думал переходить на HTTP, но не нашел информации о преимуществах. Если есть такая информация, буду благодарен за ссылки. Вот это прям моё: "При плохом интернете или большом объеме данных web-сервис тупо умирает, часто вызывая блокировки"
37. VPanin56 565 25.03.20 09:02 Сейчас в теме
У нас тоже активно используется Web Сервис, но помимо функций обмена есть еще и процедуры "Выполнения кода" и "Выполнения запроса"

#Область Сериализаци
Функция Десериализовать(XMLСтруктураСериализованногоОбъекта)
	ЧтениеXMLДанных = Новый ЧтениеXML;
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	ЧтениеXMLДанных.Закрыть();  
	Возврат ТЗ;
КонецФункции

Функция Сериализовать(ОбъектСериализации)
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции
#КонецОбласти

Функция ВыполнитьЗапрос(ТекстЗапроса, Параметры, ТипОбходаЗапроса)
		
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	
	ТабПараметры = Десериализовать(Параметры); 
	Для Каждого Стр из ТабПараметры Цикл
		Запрос.УстановитьПараметр(Стр.Ключ, ПолучитьПараметрЗапроса(Стр));
	КонецЦикла;
	
	Таб = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса[ТипОбходаЗапроса]);
	
	результат = Сериализовать(Таб);
	
	Возврат Результат;
	
	
КонецФункции

Функция ПолучитьПараметрЗапроса(Строка)
	
	Если Строка.Тип="Вычислить" тогда
		Возврат Вычислить(Строка.Значение);
	ИначеЕсли Строка.Тип="Выполнить" тогда
		ДопПараметры = Строка.ДопПараметры;
		Значение = Неопределено;
		Выполнить(Строка.Значение);
		Возврат Значение;
	Иначе
		Возврат Строка.Значение;
	КонецЕсли;	
	
КонецФункции



Функция ВыполнитьКод(ТекстКода, Параметры)
	
	Ошибка_ = Ложь;
	ТекстОшибки_ = "";
	РезультатВыполнения = Неопределено;
		
	Попытка
		Выполнить(ТекстКода);
	Исключение
		Ошибка_ = Истина;
		ТекстОшибки_ = ОписаниеОшибки();
	КонецПопытки;
	
	Возврат Сериализовать(Новый Структура("Ошибка, ТекстОшибки, Результат", Ошибка_, ТекстОшибки_, РезультатВыполнения));
	
КонецФункции

Показать


Очень удобно использовать для разных задач. Web сервис уже не переписывается, а отправляется в него то что нужно выполнит, или Запрос, или Код 1С
shootnik; mistervoron; user649057_89194416094; user682948_rusmaxval; user1027191; Gipatalamus; Noveng; 4ed; wowik; Andry2004; wunderland; maksal; user5300; +13 Ответить
39. hoyo 07.04.20 09:47 Сейчас в теме
(37) Если не сложно, приведите пожалуйста пример, как вызвать "ВыполнитьЗапрос" на стороне базы, в которую мы хотим получить данные, а то не очень понятно, в каком виде должны передаваться Параметры, например.
43. Drivingblind 235 18.05.21 06:26 Сейчас в теме
(37) вот статья, почему так делать нельзя: https://infostart.ru/1c/articles/1105734/
40. VPanin56 565 07.04.20 15:34 Сейчас в теме
Вот пример куска кода из самописки по обслуживанию БАЗ. Кусок где именно вызывается "Выполнить Запрос" не нашел. Но при вызове "Выполнить Код" так же передается и текст запроса и параметры для этого запроса. Оптимально использовать именно его.
WebСервисБух - название нашего расширения подключенного в Бух базах и опубликованного.
.....
....
		Параметры = Новый СТруктура;
		Параметры.Вставить("ДатаВключенияПросрочкиПользователей", Дата("20180101"));
		Параметры.Вставить("ПросрочкаРаботыВПрограммеДоЗапрещенияВхода", Константы.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода.Получить());

		ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(Параметры);
		МойXML = Новый ЗаписьXML;
		МойXML.УстановитьСтроку();
		ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
		Параметры = МойXML.Закрыть();
		
			Пользователь = Константы.ПользовательДляПодключения.Получить();
			Пароль		 = Константы.ПарольДляПодключения.Получить();
			
			ВСОпределение = Новый WSОпределения(База.WSСсылка, Пользователь, Пароль);
			Соединение = Новый WSПрокси(ВСОпределение, "WebService1", "WebСервисБух", "WebСервисБухSoap");

			Соединение.Пользователь = Пользователь;
			Соединение.Пароль 		= Пароль;

			ОтветWS = Соединение.ВыполнитьКод(ТекстКонтрольАктивностиПользователей(), Параметры);

			ЧтениеXMLДанных = Новый ЧтениеXML;
			ЧтениеXMLДанных.УстановитьСтроку(ОтветWS);
			Ответ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
			ЧтениеXMLДанных.Закрыть();
			
			Если Ответ.Ошибка тогда
				ЗаписьЖурналаРегистрации("РегЗаписьЖурналаРегистрации", УровеньЖурналаРегистрации.Ошибка,,, СокрЛП(База)+" : "+Ответ.ТекстОшибки);
			КонецЕсли;

Функция ТекстКонтрольАктивностиПользователей() Экспорт
	
	ТекстКода = "
	|	УстановитьПривилегированныйРежим(Истина);
	|
	|	ЧтениеXMLДанных = Новый ЧтениеXML;
	|	ЧтениеXMLДанных.УстановитьСтроку(Параметры);
	|	Параметры = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	|	ЧтениеXMLДанных.Закрыть();
	|
	|	Запрос = Новый Запрос;
	|	Запрос.Текст = ""
	|		|ВЫБРАТЬ
	|		|	Пользователи.Ссылка КАК Пользователь,
	|		|	ВЫБОР
	|		|		КОГДА ЕСТЬNULL(СведенияОПользователях.СрокДействия, &ПустаяДата) <> &ПустаяДата
	|		|			ТОГДА ЕСТЬNULL(СведенияОПользователях.СрокДействия, &ПустаяДата) <= &НачалоДняТекущейДатыСеанса
	|		|		ИНАЧЕ ЛОЖЬ
	|		|	КОНЕЦ КАК СрокДействияИстек
	|		|ИЗ
	|		|	Справочник.Пользователи КАК Пользователи
	|		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
....
....
....
	|	Запрос.УстановитьПараметр(""ПустаяДата"", '00010101');
	|	Запрос.УстановитьПараметр(""НачалоДняТекущейДатыСеанса"",               	НачалоДня(ТекущаяДатаСеанса()));
	|	Запрос.УстановитьПараметр(""ДатаВключенияПросрочкиПользователей"",      	Параметры.ДатаВключенияПросрочкиПользователей);
	|	Запрос.УстановитьПараметр(""ПросрочкаРаботыПользователей"",             	Параметры.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода);
	|	Запрос.УстановитьПараметр(""ДатаВключенияПросрочкиВнешнихПользователей"",	Параметры.ДатаВключенияПросрочкиПользователей);
	|	Запрос.УстановитьПараметр(""ПросрочкаРаботыВнешнихПользователей"",        	Параметры.ПросрочкаРаботыВПрограммеДоЗапрещенияВхода);
	|
	|   Выборка = Запрос.Выполнить().Выбрать();
	|   
	|   ИнформацияОбОшибке = Неопределено;
	|   Пока Выборка.Следующий() Цикл
	|   	Пользователь = Выборка.Пользователь;
	|	КонецЦикла;
	|
	|	РезультатВыполнения = Истина;
	|";

	Возврат ТекстКода;
	
КонецФункции

Показать
mistervoron; user682948_rusmaxval; user1027191; Gipatalamus; 4ed; +5 Ответить
41. VPanin56 565 07.04.20 16:12 Сейчас в теме
Или вот кусок кода по формированию параметров для передачи

Таб = Новый ТаблицаЗначений;
			Таб.Колонки.Добавить("Ключ");
			Таб.Колонки.Добавить("Тип");
			Таб.Колонки.Добавить("Значение");
			Таб.Колонки.Добавить("ДопПараметры");
			
			// ОРГАНИЗАЦИЯ
			Стр = Таб.Добавить();
			Стр.Ключ = "Организация";
			Если СокрЛП(ОфициальнаяОрганизация.ВнешняяСсылка) = "" Тогда
				Стр.Тип = "Выполнить";
				Текст = "Значение = Справочники.Организации.НайтиПоНаименованию(ДопПараметры.Организация)";
				ДопПар = Новый Структура("Организация", СокрЛП(ОфициальнаяОрганизация.Наименование));
				Стр.ДопПараметры = ДопПар;
			Иначе
				Стр.Тип = "Выполнить";
				Текст = "Значение = ЗначениеИзСтрокиВнутр(ДопПараметры.ВнешняяСсылка)";
				ДопПар = Новый Структура("ВнешняяСсылка", СокрЛП(ОфициальнаяОрганизация.ВнешняяСсылка));
				Стр.ДопПараметры = ДопПар;
			КонецЕсли;
			Стр.Значение = Текст;
			
			// НачалоПериода
			Стр = Таб.Добавить();
			Стр.Ключ = "НП";
			Стр.Тип = "Дата";
			Стр.Значение = НачалоПериода;
			
			// НачалоПериода
			Стр = Таб.Добавить();
			Стр.Ключ = "КП";
			Стр.Тип = "Дата";
			Стр.Значение = КонецДня(КонецПериода);
Показать
user682948_rusmaxval; user1027191; Gipatalamus; 4ed; +4 Ответить
42. Shurkec 30.08.20 11:54 Сейчас в теме
Благодарю! Очень полезная информация.
user5300; +1 Ответить
44. user616816_Romeo8044 16.06.21 09:26 Сейчас в теме
На соединение действует ограничение в 900 секунд. Если база за это время не ответила (могла просто не успеть) то соединение отваливается. Где можно поменять это время ожидания - 15 минут это очень мало для больших расчетов?
45. bashhhh 26 29.10.21 10:39 Сейчас в теме
(44) Для таких целей нужно делать асинхронные запросы. Первый запрос отправляет задание на расчет, второй проверят готовность расчета с интервалом, пока не получит положительный результат, третий получает результат расчета, который где то был сохранен
esqado; user616816_Romeo8044; +2 Ответить
Оставьте свое сообщение