При настройке правил обмена в конфигурации «Конвертация данных 2.1» разработчики нередко сталкиваются с ситуацией, когда справочники переносятся корректно, однако в целевых документах (например, в счетах на оплату покупателю) реквизит ДоговорКонтрагента остается пустым. При этом новые документы могут создаваться с заполненным договором, а уже существующие (старые) документы категорически отказываются обновлять значение этого поля.
Разберем основные причины такого поведения и пошагово рассмотрим способы устранения проблемы.
Наиболее частая причина, из-за которой новые документы заполняются корректно, а старые не обновляют реквизит договора, заключается в настройках загрузки объекта и свойств в правилах обмена.
Проанализируем ключевые настройки, которые необходимо проверить:
ДоговорКонтрагента. Проверим, не активен ли флаг «Не замещать значение свойства у существующих объектов». Если данный флаг включен, то при обновлении уже созданного ранее документа это конкретное поле будет игнорироваться и останется пустым.Справочник ДоговорыКонтрагентов является подчиненным справочнику Контрагенты. При поиске договора ссылка на контрагента (владельца) должна быть однозначно определена в контексте поиска приемника.
Если поиск договора настроен только по наименованию без учета организации и владельца, система может найти договор другой организации или не найти подходящий элемент вовсе. В типовых конфигурациях договор жестко привязан к организации и контрагенту.
Разберем, как правильно передать контекст поиска через входящие и исходящие данные:
ДоговорКонтрагента документа в обработчике «Перед выгрузкой» сформируем структуру с контекстом:
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Владелец", Источник.Контрагент);
ИсходящиеДанные.Вставить("Организация", Источник.Организация);
ИсходящиеДанные.Вставить("Наименование", Источник.ДоговорКонтрагента.Наименование);
Владелец, Организация, Наименование) установим флаг «Получать из входящих данных».
Если СвойстваПоиска.Свойство("Владелец") Тогда
СтрокаИменСвойствПоиска = "Владелец, Организация, Наименование";
КонецЕсли;
Даже если договор успешно найден или создан, типовые обработчики конфигурации-приемника при записи документа могут выполнять проверку соответствия реквизитов. Если организация договора, валюта расчетов или владелец не совпадают с организацией, валютой или контрагентом документа, реквизит ДоговорКонтрагента может быть программно очищен в модуле объекта перед записью.
Для гарантированной установки договора можно воспользоваться обработчиком «ПослеЗагрузки» в ПКО документа:
Если Не ЗначениеЗаполнено(Объект.ДоговорКонтрагента) И ЗначениеЗаполнено(Объект.Контрагент) Тогда
Объект.ДоговорКонтрагента = Объект.Контрагент.ОсновнойДоговорКонтрагента;
КонецЕсли;
Также при необходимости можно включить в ПКО документа опцию «Отключить обработчики событий при записи объекта», если типовые механизмы приемника мешают корректной загрузке данных обмена.