Синхронизация ЗУП 3.1 - БП

1. neek666 26.03.24 05:28 Сейчас в теме
Народ, всем добрый день!

Нужен совет куда глядеть. На текущий момент жаль потерянного времени. Чувствую что проблема где то на поверхности, но не вижу. Есть синхронизация между двумя базами: Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.28.84) с одной стороны, и БП Парус с другой. Реализована через стандартный типовой план обмена: "ОбменЗарплата3Бухгалтерия3" без каких либо дописок/переписок/расширений и т.п. В обмене учавствовал всего один документ по одной организации.

Все было хорошо, но в какой то момент этот документ перестал регистрироваться в автоматическом режиме (Отражение з/п в бухучете). При этом вручную документы этого типа регистрируются без проблем и учавствуют в обмене. Подозреваю что случилась эта проблема после какого то очередного обновления. ЗУПа. Но это только догадки.

Если использовать отладчик то видно, что система заходит в процедуру:
ОбменДаннымиСобытия.ЗарегистрироватьИзменениеОбъекта()

и добавляет нужных получателей (узлы) для данного документа.

Но сама регистрация не происходит. В чем может быть проблема?

Т.е. система верно определяет куда именно надо зарегистрировать объект. Но сама регистрация почему то не происходит. Смотрел правила регистрации, - ничего криминального там не увидел: отбор по организации + отбор по периоду (должен быть больше чем дата начала обмена)

Пробовал вообще отключать отбор по организациям, - тот же результат. Ничерта не регистрируется автоматом. Только вручную.

Вот меня больше всего бесит полное отсутствие, или очень скудная справочная информация по вопросам устройства БСП.
Для чего созданы табличные части с названием "Организации" в каждом из типовых планов обменов? И почему где то они заполнены, а где то нет? И как это влияет на сам обмен?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
4. neek666 26.03.24 07:04 Сейчас в теме
(3) Немного скорректировал, вот такая конструкция пожалуй будет более правильная, чем представленная ранее:


&После("ЗарегистрироватьИзменениеОбъекта")
Процедура р_ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Объект, Отказ, ДополнительныеПараметры)
    
    Если СтрСравнить(ИмяПланаОбмена, "ОбменЗарплата3Бухгалтерия3") = 0 Тогда
        ЗерегистрироватьПринудительноИзмененияДляПАРУСа(Объект);
    КонецЕсли;

КонецПроцедуры

Процедура ЗерегистрироватьПринудительноИзмененияДляПАРУСа(Объект)
    
    Если ТипЗнч(Объект) <> Тип("ДокументОбъект.ОтражениеЗарплатыВБухучете")
        И ТипЗнч(Объект) <> Тип("ДокументСсылка.ОтражениеЗарплатыВБухучете") Тогда
        Возврат;
    КонецЕсли;
    
    ОбменДаннымиСобытия.ВыполнитьПравилаРегистрацииДляОбъекта(Объект, ИмяПланаОбмена);
    
КонецПроцедуры

Показать


Эта конструкция выполняет регистрацию изменений как надо, в автоматическом режиме.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. neek666 26.03.24 06:23 Сейчас в теме
(1) В общем, так толком и не разобравшись в причинах этой поломки, решил её радикальным способом: принудительная регистрация. Опишу логику этого решения, и выкладываю программный код, - вдруг кому пригодится.

Логика проста: я знаю, что при выполнении процедуры "ОбменДаннымиСобытия.ЗарегистрироватьИзменениеОбъекта()" система типовыми алгоритмами ПРАВИЛЬНО и КОРРЕКТНО определяет получателей объекта (узлы). Эти узлы система помещает в соответствующий реквизит объекта "Объект.ОбменДанными.Получатели". Причем, как показали опыты, при выполнении этой процедуры система уже проверяет условия регистрации объекта! Это обозначает, что в получатели запишутся только те узлы, которые соответствуют параметрам отбора, определенным в настройках плана обмена. Моя задача была проста: принудительно зарегистрировать этот объект.

Для этого я создал расширение, в нем определил свою процедуру с директивой "после" для процедуры: "ОбменДаннымиСобытия.ЗарегистрироватьИзменениеОбъекта()".

&После("ЗарегистрироватьИзменениеОбъекта")
Процедура р_ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Объект, Отказ, ДополнительныеПараметры)
	
	Если СтрСравнить(ИмяПланаОбмена, "ОбменЗарплата3Бухгалтерия3") = 0 Тогда
		ЗерегистрироватьПринудительноИзмененияДляПАРУСа(Объект);
	КонецЕсли;

КонецПроцедуры

Процедура ЗерегистрироватьПринудительноИзмененияДляПАРУСа(Объект)
	
	Если ТипЗнч(Объект) <> Тип("ДокументОбъект.ОтражениеЗарплатыВБухучете")
		И ТипЗнч(Объект) <> Тип("ДокументСсылка.ОтражениеЗарплатыВБухучете") Тогда
		Возврат;
	КонецЕсли;
	
	УзлыДляРегистрации = Объект.ОбменДанными.Получатели;
	Если УзлыДляРегистрации.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	мУзлыДляРегистрации = Новый Массив;
	Для Каждого ТекУзел из УзлыДляРегистрации Цикл
		мУзлыДляРегистрации.Добавить(ТекУзел);
	КонецЦикла;
	ПланыОбмена.ЗарегистрироватьИзменения(мУзлыДляРегистрации, Объект);
	
КонецПроцедуры
	
Показать
3. neek666 26.03.24 06:35 Сейчас в теме
Несмотря на то, что проблема, по-сути, решена, прошу совета, чем именно могла быть вызвана проблема? Повторяю:

1. Весь обмен был типовой, вплоть до решения этой проблемы. Решение этой проблемы, - это единственная "дописка" этого, конкретно взятого, плана обмена.
2. План обмена настроен между ЗУП КОРП и БП Парус
3. Раньше все работало без проблем. Документ автоматом регистрировался. В какой то момент времени (два - три месяца назад) авторегистрация пропала. Стала доступной только ручная регистрация.
4. Отладка кода показала, что типовой алгоритм верно определяет получателей для документа при его изменении в автоматическом режиме с учетом параметров отбора, указанных в настройках плана обмена. Но сама регистрация при этом не происходит.

Если мне кто нибудь подскажет, в каком именно общем модуле (по БСП) вызывается метод "ПланыОбмена.ЗарегистрироватьИзменения" при регистрации изменений объектов ИБ буду примного благодарен. Думаю этого будет достаточно для более детального расследования причин произошедшего. В процедуре "ЗарегистрироватьИзменениеОбъекта" хоть ее название и близко по смыслу к регистрации изменений, - всё таки напрямую изменения не регистрируются. В этой процедуре определяются лишь получатели изменений. Далее для этих получателей, как я понимаю, где то в общих модулях должна вызываться процедура, очень близкая к моей, описанной выше.
4. neek666 26.03.24 07:04 Сейчас в теме
(3) Немного скорректировал, вот такая конструкция пожалуй будет более правильная, чем представленная ранее:


&После("ЗарегистрироватьИзменениеОбъекта")
Процедура р_ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Объект, Отказ, ДополнительныеПараметры)
    
    Если СтрСравнить(ИмяПланаОбмена, "ОбменЗарплата3Бухгалтерия3") = 0 Тогда
        ЗерегистрироватьПринудительноИзмененияДляПАРУСа(Объект);
    КонецЕсли;

КонецПроцедуры

Процедура ЗерегистрироватьПринудительноИзмененияДляПАРУСа(Объект)
    
    Если ТипЗнч(Объект) <> Тип("ДокументОбъект.ОтражениеЗарплатыВБухучете")
        И ТипЗнч(Объект) <> Тип("ДокументСсылка.ОтражениеЗарплатыВБухучете") Тогда
        Возврат;
    КонецЕсли;
    
    ОбменДаннымиСобытия.ВыполнитьПравилаРегистрацииДляОбъекта(Объект, ИмяПланаОбмена);
    
КонецПроцедуры

Показать


Эта конструкция выполняет регистрацию изменений как надо, в автоматическом режиме.
5. neek666 26.03.24 07:36 Сейчас в теме
(4) В общем, исходя из описания процедуры "ЗарегистрироватьИзменениеОбъекта" можно сделать вывод, что эта процедура действительно НЕ регистрирует изменения, а инициализирует правила регистрации объекта, и в своответствии с ними уже производит получение узлов-получателей для данного объекта:

"
//Определяет список узлов получателей плана обмена ИмяПланаОбмена, для которых необходимо выполнить
// регистрацию объекта Объект для последующей его выгрузки."

Что значит вот это выражение: "Объект для последующей его выгрузки." - что значит для последующей выгрузки? Когда именно происходит регистрация изменений объекта в соответствии с БСП?

Версия БСП - 3.1.9.261
Версия БСД (БиблиотекаСинхронизацииДанных) - 1.0.3.409
Оставьте свое сообщение

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