Бесшовная интеграция с документооборотом это совсем не то о чем я мечтал?

1. PerlAmutor 129 20.06.18 12:46 Сейчас в теме
Была у меня цель - синхронизировать справочник с документооборотом. Месяц ковырялся с бесшовной интеграцией документооборота и ERP. В итоге обнаружил, что эта технология обмена не будет работать так как я хочу. Я столкнулся с тем, что весь обмен завязан на связях объектов интегрируемых систем. По сути это регистр сведений, где должны быть записи типа "Узел обмена", "Ссылка на объект в документообороте", "Идентификатор объекта". И эта связь создается - ВРУЧНУЮ для каждого элемента.

Поправьте меня, если я одним нажатием кнопки могу создать такие связи для существующих 11000 элементов, а также, чтобы новые элементы и связь на них создавалась в документообороте для новых элементов...
Найденные решения
5. Сурикат 394 20.06.18 14:06 Сейчас в теме
Я делал так:
Подписка на событие
Помещал в очередь
В Фоне создавал объекты в ДО

Дописывается за 1 час

Процедура ЯРВЕТ_СозданиеДокументовВДокументообороте() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	ИмяПользователя = Константы.ИнтеграцияС1СДокументооборотИмяПользователяДляОбмена.Получить();
	Пароль = Константы.ИнтеграцияС1СДокументооборотПарольДляОбмена.Получить();
	Если Не ЗначениеЗаполнено(ИмяПользователя) Тогда // прочтем настройки из пользовательского хранилища.
		ПарольСохранен = Ложь;
		ИнтеграцияС1СДокументооборотВызовСервера.ПрочитатьНастройкиАвторизацииИзХранилищаОбщихНастроек(
		ИмяПользователя, Пароль, ПарольСохранен);
		Если Не ЗначениеЗаполнено(ИмяПользователя) Тогда
			ЗаписьЖурналаРегистрации(НСтр("ru = 'Интеграция с 1С:Документооборотом'"), 
			УровеньЖурналаРегистрации.Ошибка,,,
			НСтр("ru = 'Для пользователя регламентного задания обмена не указано имя пользователя 1С:Документооборота'"));
			Возврат;
		КонецЕсли;
		Если ПарольСохранен <> Истина Тогда
			ЗаписьЖурналаРегистрации(НСтр("ru = 'Интеграция с 1С:Документооборотом'"), 
			УровеньЖурналаРегистрации.Ошибка,,,
			НСтр("ru = 'Для пользователя регламентного задания обмена не сохранен пароль 1С:Документооборота'"));
			Возврат;
		КонецЕсли;
		// Перенесем настройки в константы.
		ИнтеграцияС1СДокументооборотВызовСервера.СохранитьНастройкиАвторизацииДляОбмена(ИмяПользователя, Пароль);
		ИнтеграцияС1СДокументооборотВызовСервера.УдалитьНастройкиАвторизацииИзХранилищаОбщихНастроек();
	КонецЕсли;
	УстановитьПривилегированныйРежим(Ложь);
	ИнтеграцияС1СДокументооборотВызовСервера.УстановитьНастройкиАвторизацииВПараметрыСеанса(ИмяПользователя, Пароль, Ложь);
	
	ТипОбработки = Перечисления.ЯРВЕТ_ТипыОбработкиДокументов.СозданиеСвязанногоОбъектаДокументооборота;
	Прокси = ИнтеграцияС1СДокументооборот.ПолучитьПрокси();
		
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЯРВЕТ_ОчередьОбработкиДокументов.Документ,
		|	ИнтегрированныеОбъекты.Объект ЕСТЬ NULL КАК СоздаватьДокумент
		|ИЗ
		|	РегистрСведений.ЯРВЕТ_ОчередьОбработкиДокументов КАК ЯРВЕТ_ОчередьОбработкиДокументов
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбъектыИнтегрированныеС1СДокументооборотом КАК ИнтегрированныеОбъекты
		|		ПО ЯРВЕТ_ОчередьОбработкиДокументов.Документ = ИнтегрированныеОбъекты.Объект
		|			И (ЯРВЕТ_ОчередьОбработкиДокументов.ТипОбработки = ЗНАЧЕНИЕ(Перечисление.ЯРВЕТ_ТипыОбработкиДокументов.СозданиеСвязанногоОбъектаДокументооборота))
		|ГДЕ
		|	ЯРВЕТ_ОчередьОбработкиДокументов.ТипОбработки = &ТипОбработки";
	
	Запрос.УстановитьПараметр("ТипОбработки", Перечисления.ЯРВЕТ_ТипыОбработкиДокументов.СозданиеСвязанногоОбъектаДокументооборота);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Попытка
			Если ВыборкаДетальныеЗаписи.СоздаватьДокумент Тогда
				Правила = ИнтеграцияС1СДокументооборотВызовСервера.ПодходящиеПравила(ВыборкаДетальныеЗаписи.Документ);
				Если Правила.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли; 
				ОбъектДО = ИнтеграцияС1СДокументооборотВызовСервера.СоздатьОбъектДОПоПравилу(ВыборкаДетальныеЗаписи.Документ, Правила[0].Ссылка);	
				РегистрыСведений.ОбъектыИнтегрированныеС1СДокументооборотом.ДобавитьСвязь(ОбъектДО.ID, ОбъектДО.type,ВыборкаДетальныеЗаписи.Документ);			
			КонецЕсли;
			РегистрыСведений.ЯРВЕТ_ОчередьОбработкиДокументов.УдалитьИзОчереди(ВыборкаДетальныеЗаписи.Документ, ТипОбработки);
		Исключение
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
			ЗаписьЖурналаРегистрации("ЯРВЕТ.Обмен с Документооборотом",
									УровеньЖурналаРегистрации.Ошибка,
									Метаданные.РегламентныеЗадания.ЯРВЕТ_СозданиеДокументовВДокументообороте,
									ВыборкаДетальныеЗаписи.Документ,
									ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
	
КонецПроцедуры

Показать
DimaP; PerlAmutor; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. s_vidyakin 63 20.06.18 13:23 Сейчас в теме
Что значит каждый ВРУЧНУЮ? В настройках есть связи между справочниками и их реквизитами, есть настройка регулярной синхронизации - ничего нажимать даже не надо. Если не нравится отложенная синхронизация, можно добавить свою процедуру в форму справочника или подписку на все справочники, чтоб автоматически вызывалась передача в СЭД после записи нового элемента.
Для 11000 старых элементов можешь написать обработку с той же процедурой перекидывания в СЭД, только в цикле
Не вижу проблем особых, интеграция всегда немношк геморная, даже бесшовная
Я даже делал обратный обмен, когда при изменении данных в СЭД, вызывался свой веб-сервис ERP и инициировалось обновление данных там
4. PerlAmutor 129 20.06.18 14:00 Сейчас в теме
(2)
Что значит каждый ВРУЧНУЮ?

Ну вот вы создадите нового контрагента в документообороте. Он разве просто так прилетит в ERP?

Нет никакой возможности связать все документы или все элементы справочников одной базы с другой, если элементы есть и там и там, а прилетать они все должны только из одной базы - документооборот. Меняю контрагента, у него появляется регистрация на узле, регламентное задание по формированию сообщений документооборота пытается сформировать сообщение в справочнике для узла ERP, но не делает этого, т.к. в РегистрСведений.СвязиОбъектовИнтегрированныхСистем нет ни одной связи с узлом обмена. Тоже самое и со стороны ERP, если даже обмен двусторонний, создал нового контрагента, но т.к. связи в РегистрСведений.ИнтегрированныеОбъекты нет, то и сообщения о создании нового в документооборот не улетают.

Чтобы это произошло надо на форме элемента справочника в ERP переходить по вкладке Документооборот и там либо создавать новую связь (нового контрагента), либо выбирать оттуда существующего - вручную. Каждый раз.

Т.е. это какой-то бред, а не обмен.
3. sergathome 4 20.06.18 13:44 Сейчас в теме
Чудес на свете не бывает :) Для старых элементов полюбому придётся синхронизацию дописывать.
5. Сурикат 394 20.06.18 14:06 Сейчас в теме
Я делал так:
Подписка на событие
Помещал в очередь
В Фоне создавал объекты в ДО

Дописывается за 1 час

Процедура ЯРВЕТ_СозданиеДокументовВДокументообороте() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	ИмяПользователя = Константы.ИнтеграцияС1СДокументооборотИмяПользователяДляОбмена.Получить();
	Пароль = Константы.ИнтеграцияС1СДокументооборотПарольДляОбмена.Получить();
	Если Не ЗначениеЗаполнено(ИмяПользователя) Тогда // прочтем настройки из пользовательского хранилища.
		ПарольСохранен = Ложь;
		ИнтеграцияС1СДокументооборотВызовСервера.ПрочитатьНастройкиАвторизацииИзХранилищаОбщихНастроек(
		ИмяПользователя, Пароль, ПарольСохранен);
		Если Не ЗначениеЗаполнено(ИмяПользователя) Тогда
			ЗаписьЖурналаРегистрации(НСтр("ru = 'Интеграция с 1С:Документооборотом'"), 
			УровеньЖурналаРегистрации.Ошибка,,,
			НСтр("ru = 'Для пользователя регламентного задания обмена не указано имя пользователя 1С:Документооборота'"));
			Возврат;
		КонецЕсли;
		Если ПарольСохранен <> Истина Тогда
			ЗаписьЖурналаРегистрации(НСтр("ru = 'Интеграция с 1С:Документооборотом'"), 
			УровеньЖурналаРегистрации.Ошибка,,,
			НСтр("ru = 'Для пользователя регламентного задания обмена не сохранен пароль 1С:Документооборота'"));
			Возврат;
		КонецЕсли;
		// Перенесем настройки в константы.
		ИнтеграцияС1СДокументооборотВызовСервера.СохранитьНастройкиАвторизацииДляОбмена(ИмяПользователя, Пароль);
		ИнтеграцияС1СДокументооборотВызовСервера.УдалитьНастройкиАвторизацииИзХранилищаОбщихНастроек();
	КонецЕсли;
	УстановитьПривилегированныйРежим(Ложь);
	ИнтеграцияС1СДокументооборотВызовСервера.УстановитьНастройкиАвторизацииВПараметрыСеанса(ИмяПользователя, Пароль, Ложь);
	
	ТипОбработки = Перечисления.ЯРВЕТ_ТипыОбработкиДокументов.СозданиеСвязанногоОбъектаДокументооборота;
	Прокси = ИнтеграцияС1СДокументооборот.ПолучитьПрокси();
		
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЯРВЕТ_ОчередьОбработкиДокументов.Документ,
		|	ИнтегрированныеОбъекты.Объект ЕСТЬ NULL КАК СоздаватьДокумент
		|ИЗ
		|	РегистрСведений.ЯРВЕТ_ОчередьОбработкиДокументов КАК ЯРВЕТ_ОчередьОбработкиДокументов
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбъектыИнтегрированныеС1СДокументооборотом КАК ИнтегрированныеОбъекты
		|		ПО ЯРВЕТ_ОчередьОбработкиДокументов.Документ = ИнтегрированныеОбъекты.Объект
		|			И (ЯРВЕТ_ОчередьОбработкиДокументов.ТипОбработки = ЗНАЧЕНИЕ(Перечисление.ЯРВЕТ_ТипыОбработкиДокументов.СозданиеСвязанногоОбъектаДокументооборота))
		|ГДЕ
		|	ЯРВЕТ_ОчередьОбработкиДокументов.ТипОбработки = &ТипОбработки";
	
	Запрос.УстановитьПараметр("ТипОбработки", Перечисления.ЯРВЕТ_ТипыОбработкиДокументов.СозданиеСвязанногоОбъектаДокументооборота);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Попытка
			Если ВыборкаДетальныеЗаписи.СоздаватьДокумент Тогда
				Правила = ИнтеграцияС1СДокументооборотВызовСервера.ПодходящиеПравила(ВыборкаДетальныеЗаписи.Документ);
				Если Правила.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли; 
				ОбъектДО = ИнтеграцияС1СДокументооборотВызовСервера.СоздатьОбъектДОПоПравилу(ВыборкаДетальныеЗаписи.Документ, Правила[0].Ссылка);	
				РегистрыСведений.ОбъектыИнтегрированныеС1СДокументооборотом.ДобавитьСвязь(ОбъектДО.ID, ОбъектДО.type,ВыборкаДетальныеЗаписи.Документ);			
			КонецЕсли;
			РегистрыСведений.ЯРВЕТ_ОчередьОбработкиДокументов.УдалитьИзОчереди(ВыборкаДетальныеЗаписи.Документ, ТипОбработки);
		Исключение
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
			ЗаписьЖурналаРегистрации("ЯРВЕТ.Обмен с Документооборотом",
									УровеньЖурналаРегистрации.Ошибка,
									Метаданные.РегламентныеЗадания.ЯРВЕТ_СозданиеДокументовВДокументообороте,
									ВыборкаДетальныеЗаписи.Документ,
									ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
	
КонецПроцедуры

Показать
DimaP; PerlAmutor; +2 Ответить
6. PerlAmutor 129 20.06.18 14:57 Сейчас в теме
(5)
Дописывается за 1 час


Это когда уже знаешь почему обмен не взлетел. Жаль, что пришлось потратить не один день, чтобы разобраться как все это работает.

Спасибо за опубликованный вариант решения. Я до последнего надеялся, что ошибаюсь и не придется допиливать конфигурации.
7. s_vidyakin 63 20.06.18 15:58 Сейчас в теме
(6) Так а что с фоновой синхронизацией? Можно включить чтобы хоть каждую минуту синхронизировались объекты
8. PerlAmutor 129 20.06.18 16:52 Сейчас в теме
(7) Существует 2 регламентных задания связанных с бесшовной интеграцией:
В ERP: Интеграция с 1С:Документооборотом - Выполнить обмен данными
В DOC: Формирование сообщений обмена для интегрированных систем

Помимо них есть отдельные вызовы Веб Сервиса, которые напрямую зависят от действий пользователя. Обычно это происходит при настройке правил интеграции и связывании объектов в форме документа или форме элемента справочника.

Регламентное задание в ERP никаких сообщений не сформирует и не отправит в Документооборот, если не сможет найти связанный объект в регистре.
И тоже самое для регламентного задания в Документообороте. Оно не формирует сообщение для ERP, если был изменен элемент справочника, связи для которого нет в регистре. Фоновая синхронизация происходит именно регламентным заданием из ERP по её инициативе.
Somebody1; +1 Ответить
Оставьте свое сообщение

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