Чтобы устранить первую проблему несоответствия складов, поместим в модуле плана обмена Магазины обработчики событий ПриПолученииДанныхОтПодчиненного и ПриОтправкеДанныхПодчиненному.
Обработчик ПриОтправкеДанныхПодчиненному заполним следующим образом (листинг 3.30).
Листинг 3.30. Процедура «ПриОтправкеДанныхПодчиненному»
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)
// Определить Склад, которому принадлежат отправляемые данные (если он есть).
СкладДанных = ОпределитьСклад(ЭлементДанных);
// Отправить данные, у которых Склад соответствует складу подчиненного узла плана обмена.
Если СкладДанных <> Неопределено Тогда
Если СкладДанных <> Склад Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Это обработчик был подробно рассмотрен выше в листинге 3.26, за исключением функции ОпределитьСклад() для определения склада элемента данных обмена, который содержится в параметре ЭлементДанных. Код функции будет приведен в листинге 3.32.
Обработчик события ПриПолученииДанныхОтПодчиненного заполним следующим образом (листинг 3.31).
Листинг 3.31. Процедура «ПриПолученииДанныхОтПодчиненного»
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)
// Определить Склад, которому принадлежат получаемые данные.
СкладДанных = ОпределитьСклад(ЭлементДанных);
// Получить данные, у которых Склад соответствует складу подчиненного узла плана обмена.
Если СкладДанных <> Неопределено Тогда
Если СкладДанных <> Склад И Склад <> Справочники.Склады.ПустаяСсылка() Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
ОтправкаНазад = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Это обработчик был подробно рассмотрен выше в листинге 3.27, поэтому мы не будем здесь еще раз это повторять.
Кроме того, поместим в модуле плана обмена функцию ОпределитьСклад(), которая будет возвращать ссылку на склад переданного элемента данных или возвращать Неопределено, если реквизит Склад у элемента данных отсутствует (листинг 3.32).
Листинг 3.32. Функция «ОпределитьСклад»
Функция ОпределитьСклад(ЭлементДанных)
СкладДанных = Неопределено;
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Склады") Тогда
СкладДанных = ЭлементДанных.Ссылка;
ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ПриходнаяНакладная")
Или ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.РасходнаяНакладная") Тогда
СкладДанных = ЭлементДанных.Склад;
ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрНакопленияНаборЗаписей.УчетНоменклатуры") Тогда
// Определить склад набора записей регистра накопления УчетНоменклатуры по значению склада первой записи регистра.
Если ЭлементДанных.Количество() > 0 Тогда
СкладДанных = ЭлементДанных[0].Склад;
КонецЕсли;
КонецЕсли;
Возврат СкладДанных;
КонецФункции
Кроме ссылки на реквизит Склад у документов ПриходнаяНакладная, РасходнаяНакладная и ссылки на измерение Склад у набора записей регистра накопления УчетНоменклатуры функция также возвращает ссылку на сам элемент справочника Склады, так как в узле обмена должен присутствовать только «свой» элемент справочника.
Теперь создадим еще раз начальный образ центральной базы для узла обмена Оптовый, как описано в разделе «». При переносе элементов данных в начальный образ для каждого элемента данных вызывается обработчик события ПриОтправкеДанныхПодчиненному, поэтому данные, не соответствующие оптовому складу, не будут перенесены.
В результате в базу подчиненного узла помимо «общих» (не имеющих привязки к складу) данных будут перенесены только те данные, склад которых совпадает со складом узла обмена (рис. 3.21).
Рис. 3.21. Данные, перенесенные в узел обмена «Оптовый»
Если же в подчиненном узле ввести, например, расходную накладную с «неправильным» складом, то при получении изменений в главном узле в соответствии с обработчиком события ПриПолученииДанныхОтПодчиненного этот документ будет проигнорирован. То есть в базу данных он записан не будет, но изменения этого документа будут зарегистрированы для подчиненного узла. И при следующей отправке данных этому узлу в соответствии с обработчиком события ПриОтправкеДанныхПодчиненному ему будет послано удаление «неправильного» документа.