Каталог решений - Конвертация Данных. Нюансы использования конструкции "НеЗамещатьОбъект = Истина" в обработчике события "ПриЗагрузке"

Конвертация Данных. Нюансы использования конструкции "НеЗамещатьОбъект = Истина" в обработчике события "ПриЗагрузке"

Конвертация Данных. Нюансы использования конструкции "НеЗамещатьОбъект = Истина" в обработчике события "ПриЗагрузке"

В наличии

У конвертации данных есть «особенности», которые «пьют кровь» программистов. Эта статья про очередную обнаруженную «особенность».

Категория:

Описание

Клиент – крупный холдинг. Настроен обмен по правилам между двумя базами (УСХП) через ftp ресурс. Пользователи стали жаловаться, что после обмена «затираются» реквизиты документов, а иногда документы «прилетают» не полностью заполненными. В источнике —  все ок. Проблема прослеживалась на платформах с 8.3.10 по 8.3.14

Расследование

Правила обмена уже выучил наизусть. Закономерность в проблеме с реквизитами обнаружить не удалось. Типы документов различные, реквизиты тоже: то склад, то номенклатура в ТЧ, то организация … .  От google никакого толку. Наконец, удалось «поймать» файл выгрузки с косячными документами (пока пользователи сообщат о проблеме, уже пройдет следующая синхронизация).

В правилах обмена у некоторых документов при загрузке стояла проверка, чтобы не портить документы в приемнике:

(1)
<Правило>
     <Код> ПеремещениеТоваров </Код>
     <ПриЗагрузке>
          Если ОбъектНайден Тогда
                ИсходныйОбъект = Объект.Ссылка.ПолучитьОбъект();
                Если ИсходныйОбъект.ОтражатьВБухгалтерскомУчете тогда
                    НеЗамещатьОбъект  =  Истина;
                КонецЕсли;
          КонецЕсли;
     </ ПриЗагрузке >
     <СинхронизироватьПоИдентификатору>true</СинхронизироватьПоИдентификатору>
     <Источник>ДокументСсылка. ПеремещениеТоваров </Источник>
     <Приемник>ДокументСсылка. ПеремещениеТоваров </Приемник>
</Правило>

 

Из справки: «НеЗамещатьОбъект — Булево — Если установить значение Истина, то существующий объект информационной базы не будет изменен.»

Причина проблемы (на примере реквизита «Склад»)

При выгрузке данных в xml используется кеширование, т.е. в первом  выгружаемом объекте (в нашем случае документ «Перемещение товара») склад выгружается полностью:

(2)
<Объект Нпп="27" Тип="ДокументСсылка.ПеремещениеТоваров" ИмяПравила="ПеремещениеТоваров">

…

     <Ссылка Нпп="28" НеСоздаватьЕслиНеНайден="true">
          <Свойство Имя="{КлючПоискаВИБИсточнике}">
               <Значение>{"#",f9727404-36b6-4005-a5b4-77243dc0ff00,419:80bf9457a55a905311e6b55f082221c2}</Значение>
          </Свойство>
          <Свойство Имя="{ИмяТипаВИБИсточнике}">
               <Значение>СправочникСсылка.Склады</Значение>
          </Свойство>
          <Свойство Имя="{УникальныйИдентификатор}">
               <Значение>082221c2-b55f-11e6-80bf-9457a55a9053</Значение>
          </Свойство>
          <Свойство Имя="Код">
               <Значение>00825    </Значение>
          </Свойство>
          <Свойство Имя="Наименование">
               <Значение>Склад бабы Вали</Значение>
          </Свойство>
     </Ссылка>

…

</Объект>

Далее всех последующих объектов выгрузки вместо склада «Склад бабы Вали» подставляется тег <Нпп>28</Нпп> (чтобы не выгружать каждый раз одно и то же и уменьшить объем файла выгрузки).

(3)
<Объект Нпп="266" Тип="ДокументСсылка.КомплектацияНоменклатуры" ИмяПравила="КомплектацияНоменклатуры">

…

     <Свойство Имя="Склад">
          <Нпп>28</Нпп>
     </Свойство>

…

</Объект>

…

И вот возникла ситуация, когда при загрузке в приемник документ «Перемещение Товаров» (именно тот, в котором выгружена ссылка на склад (2)) соответствует условию правила (1) (т.е. в базе уже есть документ с установленным реквизитом БУ и его под страхом смерти нельзя загружать) и выполняется код:

НеЗамещатьОбъект  =  Истина;

Вследствие чего у всех объектов, у которых в xml свойство склад имело значение <Нпп>28</Нпп>, реквизит «Склад» чудесным образом превратился в неопределено («затерся»).

Решение

Правила обмена были переписаны:

(4)
<ПослеЗагрузки>
    Если ОбъектНайден Тогда
         ИсходныйОбъект = Объект.Ссылка.ПолучитьОбъект();
         Если ИсходныйОбъект.ОтражатьВБухгалтерскомУчете Тогда
             Отказ = Истина;
         КонецЕсли;
    КонецЕсли;
</ПослеЗагрузки>

Резюме

 Учитывайте эту особенность при написании правил обмена. Надеюсь, статья сэкономит Ваше время и убережет от ошибок.

has been added to your cart:
Оформление заказа