Для реализации первой задачи в модуле объекта РасходнаяНакладная поместим обработчик события ПередЗаписью и заполним его следующим образом (листинг 3.75).
Листинг 3.75. Обработчик события «ПередЗаписью» документа «РасходнаяНакладная»
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Получатели.Автозаполнение Тогда
ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Склад);
// Проверить, изменился ли склад в существующем документе.
Если Не ЭтоНовый() Тогда
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Склад
|ИЗ
| Документ.РасходнаяНакладная
|ГДЕ
| Ссылка = &ТекСсылка");
Запрос.УстановитьПараметр("ТекСсылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Если Выборка.Склад <> Склад Тогда
ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Выборка.Склад);
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Вывести диагностическое сообщение о регистрации изменений.
ОбменСУдаленнымиСкладами.ВывестиРегистрацию(ЭтотОбъект);
КонецПроцедуры
В данном обработчике (в случае включения режима Автозаполнение) производится проверка соответствия выбранного склада в объекте и записанного в информационной базе. В случае расхождения документ регистрируется как для нового узла (в соответствии с измененным складом), так и для старого.
Затем с аналогичной целью поместим в модуле набора записей регистра накопления УчетНоменклатуры обработчик события ПриЗаписи и заполним его следующим образом (листинг 3.76).
Листинг 3.76. Обработчик события «ПередЗаписью» набора записей регистра «УчетНоменклатуры»
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Получатели.Автозаполнение Тогда
СкладНабора = Неопределено;
Для Каждого Запись Из ЭтотОбъект Цикл
Если СкладНабора = Неопределено
ИЛИ
Запись.Склад <> СкладНабора Тогда
ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Запись.Склад);
КонецЕсли;
СкладНабора = Запись.Склад;
КонецЦикла;
// Выбрать все различные склады регистра с отбором по регистратору.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Различные
| Склад
|ИЗ
| РегистрНакопления.УчетНоменклатуры
|ГДЕ
| Регистратор = &ТекСсылка";
Запрос.УстановитьПараметр("ТекСсылка", Отбор.Регистратор.Значение);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Включить регистрацию изменений набора записей для каждого склада.
ОбменСУдаленнымиСкладами.ВключитьРегистрацию(ОбменДанными, Выборка.Склад);
КонецЦикла;
КонецЕсли;
// Вывести диагностическую информацию по набору записей.
ОбменСУдаленнымиСкладами.ВывестиРегистрацию(ЭтотОбъект);
КонецПроцедуры
Обе эти процедуры используют процедуры ВключитьРегистрацию() и ВывестиРегистрацию(). Эти процедуры мы поместим в общем модуле ОбменСУдаленнымиСкладами и заполним следующим образом (листинг 3.77, 3.78).
Листинг 3.77. Процедура «ВывестиРегистрацию()»
Процедура ВывестиРегистрацию(Данные) Экспорт
ОбменДанными = Данные.ОбменДанными;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = " - Регистрация " + Данные.Метаданные() + ": " + Строка(Данные);
Сообщение.Сообщить();
// Вывести список узлов, куда будет выполняться регистрация объекта.
Для Каждого Получатель Из ОбменДанными.Получатели Цикл
Если Не ОбменДанными.Отправитель = Получатель Тогда
Сообщение.Текст = " - " + Получатель;
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ВывестиРегистрацию() выводит в окно сообщений данные об объекте, регистрация которого произошла, и узлах-получателях, для которых эта регистрация произошла.
Листинг 3.78. Процедура «ВключитьРегистрацию()»
Процедура ВключитьРегистрацию(ОбменДанными, Склад) Экспорт
// Получить список узлов для конкретного склада.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| УдаленныеСклады.Ссылка
|ИЗ
| ПланОбмена.УдаленныеСклады КАК УдаленныеСклады
|
|ГДЕ
| (УдаленныеСклады.Склад = &Склад ИЛИ
| УдаленныеСклады.Склад = &ПустойСклад)
| И УдаленныеСклады.ЭтотУзел = ЛОЖЬ";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ПустойСклад", Справочники.Склады.ПустаяСсылка());
Выборка = Запрос.Выполнить().Выбрать();
// Зарегистировать изменения объекта для выбранных узлов.
Пока Выборка.Следующий() Цикл
ОбменДанными.Получатели.Добавить(Выборка.Ссылка);
КонецЦикла;
КонецПроцедуры
Задача процедуры ВключитьРегистрацию() ? определить всех возможных получателей регистрируемого изменения. В этот список попадут те узлы, у которых в реквизите Склад содержится ссылка на интересующий нас склад либо пустая ссылка (что расширяет функциональность решения). И, естественно, этот получатель не должен быть предопределенным узлом данного плана обмена.