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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

 

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

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

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

|ВЫБРАТЬ

| Склад

|ИЗ

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

|ГДЕ

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

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

 

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

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

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

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

КонецЕсли;

КонецЕсли;

КонецЕсли;

 

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

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

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

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

 

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

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

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

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

|ИЗ

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

|ГДЕ

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

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

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

 

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

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

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

 

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

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

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

КонецЦикла;

 

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

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

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