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

Стратегия распространения данных

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

В нашем примере мы реализуем стратегию распространения данных, согласно которой документы ПриходнаяНакладная и РасходнаяНакладная (и соответствующие им наборы записей регистра накопления УчетНоменклатуры) выгружаются только в том случае, если значение реквизита Склад документов (и наборов записей регистра накопления) совпадает по значению с одноименным реквизитом, определенным для узла-получателя.

Для этого дополним процедуру ЗаписатьСообщениеСИзменениями() в модуле плана обмена (см. листинг 3.59) следующим образом (листинг 3.62).

Листинг 3.62. Процедура «ЗаписатьСообщениеСИзменениями»

Процедура ЗаписатьСообщениеСИзменениями() Экспорт

 

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

// *** Механизм регистрации изменений.

ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);

Пока ВыборкаИзменений.Следующий() Цикл

Данные = ВыборкаИзменений.Получить();

 

// Проверить, нужен ли перенос данных. Если нет, то записать удаление этих данных.

Если Не ОбменСУдаленнымиСкладами.НуженПереносДанных(ЗаписьСообщения.Получатель, Данные) Тогда

ОбменСУдаленнымиСкладами.УдалениеДанных(Данные);

КонецЕсли;

 

// Записать данные в сообщение *** XML-сериализация.

ЗаписатьXML(ЗаписьXML, Данные);

КонецЦикла;

 

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

Добавленный фрагмент выделен жирным шрифтом.

В цикле перебора измененных данных, перед тем как записать данные в XML-файл, мы проверяем, нужно ли выгружать эти данные в узел-получатель. Проверка выполняется в функции НуженПереносДанных(), расположенной в общем модуле ОбменСУдаленнымиСкладами (см. листинг 3.63). В случае если выгрузка не должна производиться (функция возвращает Ложь), вызывается процедура УдалениеДанных(), расположенная в общем модуле ОбменСУдаленнымиСкладами (см. листинг 3.64).

Листинг 3.63. Функция для реализации стратегии переноса данных

Функция НуженПереносДанных(Получатель, Данные) Экспорт

 

Перенос = Истина;

Склад = Получатель.Склад;

 

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

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

 

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

Если Не Склад.Пустая() И Данные.Склад <> Склад Тогда

Перенос = Ложь;

КонецЕсли;

 

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

 

// Проверить, что у всех записей набора склад один и тот же.

СкладНабора = Неопределено;

Для Каждого Запись Из Данные Цикл

Если СкладНабора <> Неопределено И Запись.Склад <> СкладНабора Тогда

ВызватьИсключение "Склад должен быть одинаковый для всех записей";

КонецЕсли;

СкладНабора = Запись.Склад;

КонецЦикла;

 

// Проверить, совпадает ли склад набора записей со складом узла обмена.

Если Не Склад.Пустая() И СкладНабора <> Склад Тогда

Перенос = Ложь;

КонецЕсли;

КонецЕсли;

 

Возврат Перенос;

 

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

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

Если тип объекта ДокументОбъект.ПриходнаяНакладная или ДокументОбъект.РасходнаяНакладная или РегистрНакопленияНаборЗаписей.УчетНоменклатуры, то проверяется следующее условие переноса данных. Если реквизит Склад для узла-получателя заполнен и не равен значению одноименного реквизита документов ПриходнаяНакладная или РасходнаяНакладная или регистра накопления УчетНоменклатуры, то функция возвращает Ложь. Во всех остальных случаях возвращается Истина.

Для набора записей регистра накопления производится проверка на то, что во всех записях используется один склад. Данная проверка может и не проводиться, если такая ситуация изначально не может встретиться.

В случае если данные (полученные при выборке изменений) не подлежат выгрузке в узел-получатель, производится вызов процедуры УдалениеДанных(). В этой процедуре для данных, имеющих объектную природу, создается объект УдалениеОбъекта. Этим достигается удаление в узле-приемнике «ранее неправильно отосланных данных». Наборы записей регистров очищаются (листинг 3.64).

Листинг 3.64. Функция для удаления данных при обмене

Процедура УдалениеДанных(Данные) Экспорт

 

// Получить объект описания метаданного, соответствующий данным.

ОбъектМетаданных = ?(ТипЗнч(Данные) = Тип("УдалениеОбъекта"), Данные.Ссылка.Метаданные(), Данные.Метаданные());

 

Если Метаданные.Справочники.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда

 

// Записать удаление объекта для объектных данных.

Данные = Новый УдалениеОбъекта(Данные.Ссылка);

 

ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных)

ИЛИ Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных.Родитель)

ИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда

 

// Очистить данные.

Данные.Очистить();

 

КонецЕсли;

 

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

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