Запрет замещения свойств объекта при обмене данными

При настройке обмена данными между конфигурациями 1С и создании правил обмена часто возникает ситуация, когда некоторые свойства объекта (документа, элемента справочника и т.п.) после того как они впервые поступили в базу-приемник, не должны больше изменяться.

Например, из Бухгалтерии предприятия в Управление торговлей поступил документ Поступление на расчетный счет. В Управлении торговлей пользователь изменил в этом документе реквизит Статья движения денежных средств. Если в дальнейшем по каким либо причинам в Бухгалтерии предприятия этот документ снова будет зарегистрирован для обмена, то он заново поступит в Управление торговлей с первоначальным значением реквизита Статья движения денежных средств.

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

В большинстве случаев все делается просто. Нужно открыть правила обмена в конфигурации 1С:Конвертация данных, найти нужное правило конвертации объекта (ПКО), а в нем — правило конвертации нужного свойства (ПКС). Там необходимо установить флаг Не замещать значение свойств у существующих объектов в приемнике.

Запрет замещения свойств объекта при обмене данными

После этого в правилах обмена у выбранного свойства появится дополнительная строка <НеЗамещать>true</НеЗамещать> и при обмене, если соответствующий объект найден в базе-приемнике по полям поиска или по GUID, свойство останется неизменным.

Флаг Не замещать значение свойств у существующих объектов в приемнике работает также и для правил конвертации групп свойств (ПКГС), например, для табличных частей.

Флаг Не замещать значение свойств у существующих объектов в приемнике не работает

Однако, есть случаи, когда этот флаг не работает. Независимо от того, установлен он или снят, свойство все равно замещается. Это происходит, когда мы, например, пытаемся запретить замену реквизита табличной части объекта. В нашем примере реквизит Статья движения денежных средств как раз принадлежит табличной части Расшифровка платежа.

Флаг Не замещать значение свойств у существующих объектов в приемнике не работает потому, что при обмене табличные части и прочие группы свойств передаются целиком, как единый объект, без построчного сравнения. Это значит, что с помощью флага можно запретить только замещение табличной части целиком. Но у нас задача другая.

Для ее решения воспользуемся обработчиком ПКО ПослеЗагрузки. В нем нам потребуются три параметра:

  1. Объект — загруженный объект.
  2. Ссылка — ссылка на найденный объект в информационной базе-приемнике (если он найден).
  3. ОбъектНайден — если значение параметра равно Ложь, то объект не идентифицирован, то есть не найден в информационной базе. И наоборот.

Код обработчика ПослеЗагрузки будет примерно следующим:

Если ОбъектНайден Тогда //Если объект уже был ранее загружен

//Если количество строк с момента загрузки не изменилось
Если Объект.РасшифровкаПлатежа.Количество()=Ссылка.РасшифровкаПлатежа.Количество() Тогда

//Обходим табличные части загруженного и найденного объекта в цикле
Для Счетчик=0 По Объект.РасшифровкаПлатежа.Количество()-1 Цикл

//Если значение в найденном объекте не пустое
Если ЗначениеЗаполнено(Ссылка.РасшифровкаПлатежа[Счетчик].СтатьяДвиженияДенежныхСредств) Тогда

//Присваиваем реквизиту загруженного объекта значение из найденного объекта в базе-приемнике
Объект.РасшифровкаПлатежа[Счетчик].СтатьяДвиженияДенежныхСредств=Ссылка.РасшифровкаПлатежа[Счетчик].СтатьяДвиженияДенежныхСредств;

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЕсли;

У данного кода есть определенные недостатки. В частности, в табличной части могло остаться тоже количество строк, но измениться их содержание. При необходимости можно добавить в код дополнительные условия, при которых заданный реквизит не будет замещаться.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

восемь + тринадцать =