Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Доработка примера обмена данными в распределенной информационной базе
Дальше: Обработка для выполнения обмена

Распределение данных по подчиненным узлам

Чтобы устранить первую проблему несоответствия складов, поместим в модуле плана обмена Магазины обработчики событий ПриПолученииДанныхОтПодчиненного и ПриОтправкеДанныхПодчиненному.

Обработчик ПриОтправкеДанныхПодчиненному заполним следующим образом (листинг 3.30).

Листинг 3.30. Процедура «ПриОтправкеДанныхПодчиненному»

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)

 

// Определить Склад, которому принадлежат отправляемые данные (если он есть).

СкладДанных = ОпределитьСклад(ЭлементДанных);

 

// Отправить данные, у которых Склад соответствует складу подчиненного узла плана обмена.

Если СкладДанных <> Неопределено Тогда

 

Если СкладДанных <> Склад Тогда

 

ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;

 

КонецЕсли;

 

КонецЕсли;

 

КонецПроцедуры

Это обработчик был подробно рассмотрен выше в листинге 3.26, за исключением функции ОпределитьСклад() для определения склада элемента данных обмена, который содержится в параметре ЭлементДанных. Код функции будет приведен в листинге 3.32.

Обработчик события ПриПолученииДанныхОтПодчиненного заполним следующим образом (листинг 3.31).

Листинг 3.31. Процедура «ПриПолученииДанныхОтПодчиненного»

Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад)

 

// Определить Склад, которому принадлежат получаемые данные.

СкладДанных = ОпределитьСклад(ЭлементДанных);

 

// Получить данные, у которых Склад соответствует складу подчиненного узла плана обмена.

Если СкладДанных <> Неопределено Тогда

 

Если СкладДанных <> Склад И Склад <> Справочники.Склады.ПустаяСсылка() Тогда

 

ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;

ОтправкаНазад = Истина;

 

КонецЕсли;

 

КонецЕсли;

 

КонецПроцедуры

Это обработчик был подробно рассмотрен выше в листинге 3.27, поэтому мы не будем здесь еще раз это повторять.

Кроме того, поместим в модуле плана обмена функцию ОпределитьСклад(), которая будет возвращать ссылку на склад переданного элемента данных или возвращать Неопределено, если реквизит Склад у элемента данных отсутствует (листинг 3.32).

Листинг 3.32. Функция «ОпределитьСклад»

Функция ОпределитьСклад(ЭлементДанных)

 

СкладДанных = Неопределено;

Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.Склады") Тогда

 

СкладДанных = ЭлементДанных.Ссылка;

 

ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ПриходнаяНакладная")

Или ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.РасходнаяНакладная") Тогда

 

СкладДанных = ЭлементДанных.Склад;

 

ИначеЕсли ТипЗнч(ЭлементДанных) = Тип("РегистрНакопленияНаборЗаписей.УчетНоменклатуры") Тогда

 

// Определить склад набора записей регистра накопления УчетНоменклатуры по значению склада первой записи регистра.

Если ЭлементДанных.Количество() > 0 Тогда

 

СкладДанных = ЭлементДанных[0].Склад;

 

КонецЕсли;

 

КонецЕсли;

 

Возврат СкладДанных;

 

КонецФункции

Кроме ссылки на реквизит Склад у документов ПриходнаяНакладная, РасходнаяНакладная и ссылки на измерение Склад у набора записей регистра накопления УчетНоменклатуры функция также возвращает ссылку на сам элемент справочника Склады, так как в узле обмена должен присутствовать только «свой» элемент справочника.

Теперь создадим еще раз начальный образ центральной базы для узла обмена Оптовый, как описано в разделе «». При переносе элементов данных в начальный образ для каждого элемента данных вызывается обработчик события ПриОтправкеДанныхПодчиненному, поэтому данные, не соответствующие оптовому складу, не будут перенесены.

В результате в базу подчиненного узла помимо «общих» (не имеющих привязки к складу) данных будут перенесены только те данные, склад которых совпадает со складом узла обмена (рис. 3.21).

Рис. 3.21. Данные, перенесенные в узел обмена «Оптовый»

Если же в подчиненном узле ввести, например, расходную накладную с «неправильным» складом, то при получении изменений в главном узле в соответствии с обработчиком события ПриПолученииДанныхОтПодчиненного этот документ будет проигнорирован. То есть в базу данных он записан не будет, но изменения этого документа будут зарегистрированы для подчиненного узла. И при следующей отправке данных этому узлу в соответствии с обработчиком события ПриОтправкеДанныхПодчиненному ему будет послано удаление «неправильного» документа.

Назад: Доработка примера обмена данными в распределенной информационной базе
Дальше: Обработка для выполнения обмена