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