Клиент – крупный холдинг. Настроен обмен по правилам между двумя базами (УСХП) через 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)
<ПослеЗагрузки>
Если ОбъектНайден Тогда
ИсходныйОбъект = Объект.Ссылка.ПолучитьОбъект();
Если ИсходныйОбъект.ОтражатьВБухгалтерскомУчете Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
</ПослеЗагрузки>
Резюме
Учитывайте эту особенность при написании правил обмена. Надеюсь, статья сэкономит Ваше время и убережет от ошибок.