Интеграция 1С и SharePoint

22.03.19

Интеграция - WEB-интеграция

Заказчики поставили задачу автоматизации согласования заявок на оплату в программе 1С:Бухгалтерия предприятия 3.0. Согласно ТЗ, данные должны подтягиваться из действующей электронной системы документаоборота на MS SharePoint (в дальнейшем СЭД MS SP).

Скачать файлы

Наименование Файл Версия Размер
Интеграция 1С и SharePoint:
.docx 236,35Kb
6
.docx 236,35Kb 6 Скачать

Интеграция 1С и SharePoint.

Заказчики  поставили задачу автоматизации согласования заявок на оплату в программе 1С:Бухгалтерия предприятия 3.0. Согласно ТЗ, данные должны подтягиваться из действующей электронной системы документооборота на MS SharePoint (в дальнейшем СЭД MS SP).

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

Чтобы решить поставленную задачу, потребовалась два специалиста: программист 1С и специалист по SharePoint.  И только благодаря коллективной совместной работе получилось быстро подружить двух монстров 1С и SharePoint.

В данной статье попробую описать некоторые тонкости, которые помогут связать 1С и SharePoint.

Для начала, потребуется:

  1.  Бесплатная программа Fiddler (http://www.telerik.com/fiddler)
  2.  Имя хоста, где расположен СЭД, например docflow.Host.ru
  3.  Имя и логин Basic-пользователя SharePoint- это закодированная строка состоящая из имени и логина в виде последовательности символов, которую может предоставить специалист SharePoint, он же и настраивает права на объекты, которые сможет видеть этот пользователь, например это выглядит так: ZW9zXzFjX3JlYWQ6WDlub3dndUU=
  4.  Из SharePoint нужны два параметра списка listName и viewName, которые представляют из себя набор групп символов в фигурных скобках, например listName {4026E083-7E99-4ECE-8E55-69A781DA9B3B}  и viewName {F7D3173B-E36B-4E5C-B00E-32905DDABDEB} – данный список предоставляет и настраивает его состав специалист по SharePoint
  5.  Далее при помощи программы Fiddler составляются запросы к SharePoint и переносятся в код 1С
  6.  Например на форме в 1С пользователь  вбивает регистрационный номер договора и по этому номеру он должен получить данные из СЭД SP, передаем в процедуру ПолучитьСписокДокументов(РегНомер= "/17", СписокКлючей, СтруктураСоответствий)  регистрационный номер:
&НаКлиенте
Процедура ПолучитьСписокДокументов(РегНомер = "/17",СписокКлючей,СтруктураСоответствий) Экспорт
	
	ТекстЗапроса	= ТекстЗапросаДокументов(РегНомер);
	ОТВЕТ = ПолучитьОтвет(ТекстЗапроса);
	Попытка
		Десериализовать(ОТВЕТ,СписокКлючей,СтруктураСоответствий);
	Исключение
	КонецПопытки;
	
КонецПроцедуры

Собираем запрос, заранее протестированный в Fiddler, при этом желательно не использовать переносы строк, используемые в стандартных запросах 1С в функции ТекстЗапросаДокументов(РегНомер, Папка="ВР05.06. Акты сдачи-приемки", listName="{4026E083-7E99-4ECE-8E55-69A781DA9B3B}", viewName="{F7D3173B-E36B-4E5C-B00E-32905DDABDEB}"):

&НаКлиенте
// По умолчанию listName и viewName для Актов, Договоров, Отчетов
Функция ТекстЗапросаДокументов(РегНомер,Папка="ВР05.06. Акты сдачи-приемки",listName="{4026E083-7E99-4ECE-8E55-69A781DA9B3B}",viewName="{F7D3173B-E36B-4E5C-B00E-32905DDABDEB}") Экспорт

	ТекстЗапроса = 
	"<?xml version='1.0' encoding='utf-8'?>" +
	"<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
		"<soap:Body>" +
			"<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>" +
			"<listName>" + listName + "</listName>" +
			"<viewName>" + viewName + "</viewName>" +
				"<query>" +
					"<Query>" +
						"<Where>" +
							"<And>" +
								"<Contains>" +
									"<FieldRef Name='RegNumber' />" +
									"<Value Type='Text'>" + РегНомер + "</Value>" +
								"</Contains>" +
								"<Eq>" +
									"<FieldRef Name='DocGroupLink' />" +
									"<Value Type='Text'>" + Папка + "</Value>" +
								"</Eq>" +
							"</And>" +
						"</Where>" +
					"</Query>" +
				"</query>" +
				"<ViewFields>" +
					"<FieldRef Name='DocCategoryId' /> " +
				"</ViewFields>" +
			"<rowLimit>50</rowLimit>" +
			"</GetListItems>" +
		"</soap:Body>" +
	"</soap:Envelope>";
	Возврат ТекстЗапроса;
	
КонецФункции

и далее обращаемся непосредственно с пост-запросом к серверу и получаем ответ:

&НаКлиенте
Функция ПолучитьОтвет(ТекстЗапроса) Экспорт
	
	ОТВЕТ 		= "";
	
	Сервер		= "https://docflow.host.ru";
	Директория	= "/Docs/Contract/_vti_bin/";
	ВебСервис	= "Lists.asmx";
	Метод		= "GetListItems";
	ЛогинПароль	= "ZW9zXzFjX3JlYWQ6WDlub3dndUU="; // ЗакодированнныеПароль&ЛогинBasicПользователя
	
	XMLHTTP	= Новый COMОбъект("Msxml2.XMLHTTP");
	XMLHTTP.Open("POST",Сервер + Директория + ВебСервис,0);
	XMLHTTP.SetRequestHeader("Host", СтрЗаменить(СтрЗаменить(Сервер,"https://",""),"http://",""));
	XMLHTTP.SetRequestHeader("Content-Type", "text/xml; charset=utf-8");
	XMLHTTP.setRequestHeader("Content-Length", СтрДлина(ТекстЗапроса));
	XMLHTTP.SetRequestHeader("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/" + Метод);
	XMLHTTP.SetRequestHeader("Authorization", "Basic " + ЛогинПароль);
	Попытка
		XMLHTTP.Send(ТекстЗапроса);
		ОТВЕТ = XMLHTTP.responseText;
	Исключение
	КонецПопытки;
	
	Возврат	ОТВЕТ;
	
КонецФункции

Ответ приходит в формате xml и требует десериализации

&НаКлиенте
Процедура Десериализовать(XMLСтруктураСериализованногоОбъекта,СписокКлючей,СтруктураСоответствий) 
	
	ЧтениеXML	= Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
	ЧтениеXML.ПерейтиКСодержимому();
	
	ТипXML = ФабрикаXDTO.Тип("nsv_СЭД", "row");
	Попытка
		ОбъектXML = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипXML);
		Если ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.ItemCount = "0" Тогда
		ИначеЕсли ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.ItemCount = "1" Тогда
			
			Стр = ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.row;
			
			Ключ = СокрЛП(Стр.ows_ID);
			
			Реквизиты = Новый Структура;
			
			ЗаполнитьРеквизитыТекст(Стр,Реквизиты,"ows_RegNumber");
			ЗаполнитьРеквизитыТекст(Стр,Реквизиты,"ows_Title");
			
			ЗаполнитьРеквизитыЧисло(Стр,Реквизиты,"ows_Sum");
			ЗаполнитьРеквизитыЧисло(Стр,Реквизиты,"ows_NDS");
			
			ЗаполнитьРеквизитыДата(Стр,Реквизиты,"ows_RegDate");
			
			СписокКлючей.Добавить(Ключ);
			СтруктураСоответствий.Вставить(Ключ,Реквизиты);
			
		ИначеЕсли ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.ItemCount <> "0" Тогда
			
			Для Каждого Стр Из ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.row Цикл
				
				Ключ = СокрЛП(Стр.ows_ID);
				
				Реквизиты = Новый Структура;
				
				ЗаполнитьРеквизитыТекст(Стр,Реквизиты,"ows_RegNumber");
				ЗаполнитьРеквизитыТекст(Стр,Реквизиты,"ows_Title");
				
				ЗаполнитьРеквизитыЧисло(Стр,Реквизиты,"ows_Sum");
				ЗаполнитьРеквизитыЧисло(Стр,Реквизиты,"ows_NDS");
				
				ЗаполнитьРеквизитыДата(Стр,Реквизиты,"ows_RegDate");
				
				СписокКлючей.Добавить(Ключ);
				СтруктураСоответствий.Вставить(Ключ,Реквизиты);
				
			КонецЦикла;
			
		КонецЕсли;
	Исключение
	КонецПопытки;
	
	ЧтениеXML.Закрыть(); 
	
КонецПроцедуры

и немного поработать с реквизитами:

&НаКлиенте
Процедура ЗаполнитьРеквизитыЧисло(Стр,Реквизиты,Свойство)
	
	Если Стр.Свойства().Получить(Свойство) = Неопределено Тогда 
		Реквизиты.Вставить(Свойство,0);
	Иначе 
		Реквизиты.Вставить(Свойство,Число(СокрЛП(СтрЗаменить(Стр[Свойство]," ",""))));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРеквизитыТекст(Стр,Реквизиты,Свойство)
	
	Если Стр.Свойства().Получить(Свойство) = Неопределено Тогда 
		Реквизиты.Вставить(Свойство,"");
	Иначе
		Значение = Формат(Стр[Свойство],"ЧГ=0");
		Реквизиты.Вставить(Свойство,ВРег(СокрЛП(СтрЗаменить(СтрЗаменить(СтрЗаменить(Значение,"»",""),"«",""),"  "," "))));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРеквизитыДата(Стр,Реквизиты,Свойство)
	
	Если Стр.Свойства().Получить(Свойство) = Неопределено Тогда 
		Реквизиты.Вставить(Свойство,Дата(1,1,1));
	Иначе 
		Реквизиты.Вставить(Свойство,Дата(СтрЗаменить(СтрЗаменить(СтрЗаменить(Стр[Свойство],"-",""),":","")," ","")));
	КонецЕсли;
	
КонецПроцедуры

Далее полученные и разложенные по полочкам данные возвращаются через переменные СписокКлючей и СтруктураСоответствий в удобном для обработки виде.

SharePoint интеграция post-запрос сериализация бухгалтерия предприятия

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15655    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 1С — Битрикс24. Обмен задачами

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

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17424    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25686    9    0    

7

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16256    41    49    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VasilVtoroy 23.03.19 00:29 Сейчас в теме
Ужас какой. Зачем Msxml2.XMLHTTP -то, когда есть встроенное HTTPСоединение?
Arxxximed; user665687_korostelevin; HystriX; +3 1 Ответить
4. -I- 31 25.03.19 20:21 Сейчас в теме
(1) у вас есть шанс написать свою статья через HTTPСоединение
2. A_Max 19 25.03.19 12:10 Сейчас в теме
ТекстЗапросаДокументов - Зачем эта куча плюсов?!?!?! Или в ресурс вынести, или одной многострочной "строкой" и затем стрШаблон (стрЗаменить для стареньких версий). А ещё лучше сделать универсальную функцию построения запроса.

Если ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.ItemCount = "0" Тогда
ИначеЕсли ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.ItemCount = "1" Тогда
/*/*/*/*/
ИначеЕсли ОбъектXML.Body.GetListItemsResponse.GetListItemsResult.listitems.data.ItemCount <> "0" Тогда
/*/*/*/*/
КонецЕсли

Зачем последнее условие?

Значение = Формат(Стр[Свойство],"ЧГ=0");

Формат для строки не работает.

Ну и в итоге я бы всё это реализовал на XSLT преобразовании в уже готовые структуры 1С.
3. -I- 31 25.03.19 20:18 Сейчас в теме
(2) Сделайте, кто вам мешает
5. olo_lo4 18.02.21 17:03 Сейчас в теме
подскажите а какой метод нужен для загрузки файла в директорию, где это можно найти и посмотреть ?

XMLHTTP.SetRequestHeader("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/" + Метод);
Urfin2012; bluntschi; +2 Ответить
Оставьте свое сообщение