Бесшовная интеграция с документооборотом это совсем не то о чем я мечтал?
Была у меня цель - синхронизировать справочник с документооборотом. Месяц ковырялся с бесшовной интеграцией документооборота и ERP. В итоге обнаружил, что эта технология обмена не будет работать так как я хочу. Я столкнулся с тем, что весь обмен завязан на связях объектов интегрируемых систем. По сути это регистр сведений, где должны быть записи типа "Узел обмена", "Ссылка на объект в документообороте", "Идентификатор объекта". И эта связь создается - ВРУЧНУЮ для каждого элемента.
Поправьте меня, если я одним нажатием кнопки могу создать такие связи для существующих 11000 элементов, а также, чтобы новые элементы и связь на них создавалась в документообороте для новых элементов...
Поправьте меня, если я одним нажатием кнопки могу создать такие связи для существующих 11000 элементов, а также, чтобы новые элементы и связь на них создавалась в документообороте для новых элементов...
Найденные решения
Я делал так:
Подписка на событие
Помещал в очередь
В Фоне создавал объекты в ДО
Дописывается за 1 час
Подписка на событие
Помещал в очередь
В Фоне создавал объекты в ДО
Дописывается за 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,ВыборкаДетальныеЗаписи.Документ);
КонецЕсли;
РегистрыСведений.ЯРВЕТ_ОчередьОбработкиДокументов.УдалитьИзОчереди(ВыборкаДетальныеЗаписи.Документ, ТипОбработки);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
ЗаписьЖурналаРегистрации("ЯРВЕТ.Обмен с Документооборотом",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегламентныеЗадания.ЯРВЕТ_СозданиеДокументовВДокументообороте,
ВыборкаДетальныеЗаписи.Документ,
ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Что значит каждый ВРУЧНУЮ? В настройках есть связи между справочниками и их реквизитами, есть настройка регулярной синхронизации - ничего нажимать даже не надо. Если не нравится отложенная синхронизация, можно добавить свою процедуру в форму справочника или подписку на все справочники, чтоб автоматически вызывалась передача в СЭД после записи нового элемента.
Для 11000 старых элементов можешь написать обработку с той же процедурой перекидывания в СЭД, только в цикле
Не вижу проблем особых, интеграция всегда немношк геморная, даже бесшовная
Я даже делал обратный обмен, когда при изменении данных в СЭД, вызывался свой веб-сервис ERP и инициировалось обновление данных там
Для 11000 старых элементов можешь написать обработку с той же процедурой перекидывания в СЭД, только в цикле
Не вижу проблем особых, интеграция всегда немношк геморная, даже бесшовная
Я даже делал обратный обмен, когда при изменении данных в СЭД, вызывался свой веб-сервис ERP и инициировалось обновление данных там
(2)
Ну вот вы создадите нового контрагента в документообороте. Он разве просто так прилетит в ERP?
Нет никакой возможности связать все документы или все элементы справочников одной базы с другой, если элементы есть и там и там, а прилетать они все должны только из одной базы - документооборот. Меняю контрагента, у него появляется регистрация на узле, регламентное задание по формированию сообщений документооборота пытается сформировать сообщение в справочнике для узла ERP, но не делает этого, т.к. в РегистрСведений.СвязиОбъектовИнтегрированныхСистем нет ни одной связи с узлом обмена. Тоже самое и со стороны ERP, если даже обмен двусторонний, создал нового контрагента, но т.к. связи в РегистрСведений.ИнтегрированныеОбъекты нет, то и сообщения о создании нового в документооборот не улетают.
Чтобы это произошло надо на форме элемента справочника в ERP переходить по вкладке Документооборот и там либо создавать новую связь (нового контрагента), либо выбирать оттуда существующего - вручную. Каждый раз.
Т.е. это какой-то бред, а не обмен.
Что значит каждый ВРУЧНУЮ?
Ну вот вы создадите нового контрагента в документообороте. Он разве просто так прилетит в ERP?
Нет никакой возможности связать все документы или все элементы справочников одной базы с другой, если элементы есть и там и там, а прилетать они все должны только из одной базы - документооборот. Меняю контрагента, у него появляется регистрация на узле, регламентное задание по формированию сообщений документооборота пытается сформировать сообщение в справочнике для узла ERP, но не делает этого, т.к. в РегистрСведений.СвязиОбъектовИнтегрированныхСистем нет ни одной связи с узлом обмена. Тоже самое и со стороны ERP, если даже обмен двусторонний, создал нового контрагента, но т.к. связи в РегистрСведений.ИнтегрированныеОбъекты нет, то и сообщения о создании нового в документооборот не улетают.
Чтобы это произошло надо на форме элемента справочника в ERP переходить по вкладке Документооборот и там либо создавать новую связь (нового контрагента), либо выбирать оттуда существующего - вручную. Каждый раз.
Т.е. это какой-то бред, а не обмен.
Я делал так:
Подписка на событие
Помещал в очередь
В Фоне создавал объекты в ДО
Дописывается за 1 час
Подписка на событие
Помещал в очередь
В Фоне создавал объекты в ДО
Дописывается за 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,ВыборкаДетальныеЗаписи.Документ);
КонецЕсли;
РегистрыСведений.ЯРВЕТ_ОчередьОбработкиДокументов.УдалитьИзОчереди(ВыборкаДетальныеЗаписи.Документ, ТипОбработки);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
ЗаписьЖурналаРегистрации("ЯРВЕТ.Обмен с Документооборотом",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегламентныеЗадания.ЯРВЕТ_СозданиеДокументовВДокументообороте,
ВыборкаДетальныеЗаписи.Документ,
ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Показать
(5)
Это когда уже знаешь почему обмен не взлетел. Жаль, что пришлось потратить не один день, чтобы разобраться как все это работает.
Спасибо за опубликованный вариант решения. Я до последнего надеялся, что ошибаюсь и не придется допиливать конфигурации.
Дописывается за 1 час
Это когда уже знаешь почему обмен не взлетел. Жаль, что пришлось потратить не один день, чтобы разобраться как все это работает.
Спасибо за опубликованный вариант решения. Я до последнего надеялся, что ошибаюсь и не придется допиливать конфигурации.
(7) Существует 2 регламентных задания связанных с бесшовной интеграцией:
В ERP: Интеграция с 1С:Документооборотом - Выполнить обмен данными
В DOC: Формирование сообщений обмена для интегрированных систем
Помимо них есть отдельные вызовы Веб Сервиса, которые напрямую зависят от действий пользователя. Обычно это происходит при настройке правил интеграции и связывании объектов в форме документа или форме элемента справочника.
Регламентное задание в ERP никаких сообщений не сформирует и не отправит в Документооборот, если не сможет найти связанный объект в регистре.
И тоже самое для регламентного задания в Документообороте. Оно не формирует сообщение для ERP, если был изменен элемент справочника, связи для которого нет в регистре. Фоновая синхронизация происходит именно регламентным заданием из ERP по её инициативе.
В ERP: Интеграция с 1С:Документооборотом - Выполнить обмен данными
В DOC: Формирование сообщений обмена для интегрированных систем
Помимо них есть отдельные вызовы Веб Сервиса, которые напрямую зависят от действий пользователя. Обычно это происходит при настройке правил интеграции и связывании объектов в форме документа или форме элемента справочника.
Регламентное задание в ERP никаких сообщений не сформирует и не отправит в Документооборот, если не сможет найти связанный объект в регистре.
И тоже самое для регламентного задания в Документообороте. Оно не формирует сообщение для ERP, если был изменен элемент справочника, связи для которого нет в регистре. Фоновая синхронизация происходит именно регламентным заданием из ERP по её инициативе.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот