Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Ручная регистрация изменений
Дальше: Регистрация изменений для узла в обработке для выполнения обмена
Формирование списка узлов-получателей в обработчиках события «ПриЗаписи»

Для реализации первой задачи в модуле объекта РасходнаяНакладная поместим обработчик события ПередЗаписью и заполним его следующим образом (листинг 3.75).

Листинг 3.75. Обработчик события «ПередЗаписью» документа «РасходнаяНакладная»

Процедура ПередЗаписью(Отказ)

 

Если ОбменДанными.Получатели.Автозаполнение Тогда

ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Склад);

 

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

Если Не ЭтоНовый() Тогда

 

Запрос = Новый Запрос("

|ВЫБРАТЬ

| Склад

|ИЗ

| Документ.РасходнаяНакладная

|ГДЕ

| Ссылка = &ТекСсылка");

 

Запрос.УстановитьПараметр("ТекСсылка", Ссылка);

Выборка = Запрос.Выполнить().Выбрать();

Выборка.Следующий();

Если Выборка.Склад <> Склад Тогда

ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Выборка.Склад);

КонецЕсли;

КонецЕсли;

КонецЕсли;

 

// Вывести диагностическое сообщение о регистрации изменений.

ОбменСУдаленнымиСкладами.ВывестиРегистрацию(ЭтотОбъект);

 

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

В данном обработчике (в случае включения режима Автозаполнение) производится проверка соответствия выбранного склада в объекте и записанного в информационной базе. В случае расхождения документ регистрируется как для нового узла (в соответствии с измененным складом), так и для старого.

Затем с аналогичной целью поместим в модуле набора записей регистра накопления УчетНоменклатуры обработчик события ПриЗаписи и заполним его следующим образом (листинг 3.76).

Листинг 3.76. Обработчик события «ПередЗаписью» набора записей регистра «УчетНоменклатуры»

Процедура ПередЗаписью(Отказ)

 

Если ОбменДанными.Получатели.Автозаполнение Тогда

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

 

Для Каждого Запись Из ЭтотОбъект Цикл

Если СкладНабора = Неопределено

ИЛИ

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

ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Запись.Склад);

КонецЕсли;

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

КонецЦикла;

 

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Различные

| Склад

|ИЗ

| РегистрНакопления.УчетНоменклатуры

|ГДЕ

| Регистратор = &ТекСсылка";

Запрос.УстановитьПараметр("ТекСсылка", Отбор.Регистратор.Значение);

Выборка = Запрос.Выполнить().Выбрать();

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

 

// Включить регистрацию изменений набора записей для каждого склада.

ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Выборка.Склад);

 

КонецЦикла;

КонецЕсли;

 

// Вывести диагностическую информацию по набору записей.

ОбменСУдаленнымиСкладами.ВывестиРегистрацию(ЭтотОбъект);

 

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

Обе эти процедуры используют процедуры ВключитьРегистрацию() и ВывестиРегистрацию(). Эти процедуры мы поместим в общем модуле ОбменСУдаленнымиСкладами и заполним следующим образом (листинг 3.77, 3.78).

Листинг 3.77. Процедура «ВывестиРегистрацию()»

Процедура ВывестиРегистрацию(Данные) Экспорт

 

ОбменДанными = Данные.ОбменДанными;

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = " - Регистрация " + Данные.Метаданные() + ": " + Строка(Данные);

Сообщение.Сообщить();

 

// Вывести список узлов, куда будет выполняться регистрация объекта.

Для Каждого Получатель Из ОбменДанными.Получатели Цикл

Если Не ОбменДанными.Отправитель = Получатель Тогда

Сообщение.Текст = " - " + Получатель;

Сообщение.Сообщить();

КонецЕсли;

КонецЦикла;

 

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

Процедура ВывестиРегистрацию() выводит в окно сообщений данные об объекте, регистрация которого произошла, и узлах-получателях, для которых эта регистрация произошла.

Листинг 3.78. Процедура «ВключитьРегистрацию()»

Процедура ВключитьРегистрацию(ОбменДанными, Склад) Экспорт

 

// Получить список узлов для конкретного склада.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| УдаленныеСклады.Ссылка

|ИЗ

| ПланОбмена.УдаленныеСклады КАК УдаленныеСклады

|

|ГДЕ

| (УдаленныеСклады.Склад = &Склад ИЛИ

| УдаленныеСклады.Склад = &ПустойСклад)

| И УдаленныеСклады.ЭтотУзел = ЛОЖЬ";

 

Запрос.УстановитьПараметр("Склад", Склад);

Запрос.УстановитьПараметр("ПустойСклад", Справочники.Склады.ПустаяСсылка());

Выборка = Запрос.Выполнить().Выбрать();

 

// Зарегистировать изменения объекта для выбранных узлов.

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

ОбменДанными.Получатели.Добавить(Выборка.Ссылка);

КонецЦикла;

 

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

Задача процедуры ВключитьРегистрацию() ? определить всех возможных получателей регистрируемого изменения. В этот список попадут те узлы, у которых в реквизите Склад содержится ссылка на интересующий нас склад либо пустая ссылка (что расширяет функциональность решения). И, естественно, этот получатель не должен быть предопределенным узлом данного плана обмена.

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