258 документов
← К списку

Ручная регистрация изменений

страница

Ручная регистрация изменений

Если автоматическая регистрация изменений не производится, то перед вызовом обработчиков ПередЗаписью и ПриУдалении сброс и заполнение списка получателей не осуществляются. Исходя из этого, заполнение данного списка может производиться в любом фрагменте кода, как показано в листинге 3.3.

Листинг 3.3. Пример заполнения списка узлов

Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый");

Объект.ОбменДанными.Получатели.Добавить(Узел);

Объект.Записать();

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

Вернемся к примеру с несколькими планами обмена (условия – в предыдущем разделе).

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

Листинг 3.4. Пример обработчика события «ПередЗаписью»

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

 

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

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

 

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

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

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

|ВЫБРАТЬ

|    Склад

|ИЗ

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

|ГДЕ

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

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

 

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

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

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

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

КонецЕсли;

КонецЕсли;    

КонецЕсли;    

 

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

Процедура для регистрации изменений объекта в конкретном узле обмена будет выглядеть следующим образом (листинг 3.5).

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

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

 

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

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

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

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

|ИЗ

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

|ГДЕ

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

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

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

 

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

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

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

 

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

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

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

КонецЦикла;

 

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

Обе рассмотренные процедуры одновременно решают две задачи:

  • Регистрируют изменения для узла, у которого реквизит Склад совпадает со складом, указанным в документе.
  • Производят проверку (для ранее существовавших документов), не изменился ли склад. Если склад изменился, то производится регистрация изменения для узла, значение реквизита Склад которого соответствует старому значению документа (хранимому на момент проверки в информационной базе). Далее в момент выгрузки изменений данная регистрация может быть «подменена» на объект УдалениеОбъекта, что приведет к удалению накладной, «не свойственной» узлу.