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

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

Теперь нам нужно изменить процедуру регистрации изменений для узла с учетом ручной регистрации объектов. Будем выполнять полную регистрацию изменений для выбранного узла в обработке для выполнения обмена ОбменСУдаленнымиСкладами. А также нам понадобится возможность удаления всех записей регистрации изменений для узла.

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

Для этого обработчик события ПриИзменении для поля формы УзелОбмена дополним следующим образом (листинг 3.79).

Листинг 3.79. Обработчик события «ПриИзменении» поля «УзелОбмена»

&НаКлиенте

Процедура УзелОбменаПриИзменении(Элемент)

 

ДоступностьКнопок = ПолучитьДоступностьПоУзлу(УзелОбмена);

 

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

Элементы.ЗагрузитьДанные.Доступность = ДоступностьКнопок;

Элементы.ВыгрузитьДанные.Доступность = ДоступностьКнопок;

Элементы.УдалитьРегистрациюИзменений.Доступность = ДоступностьКнопок;

Элементы.ПолнаяРегистрацияИзменений.Доступность = ДоступностьКнопок;

 

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

Теперь создадим обработчик команды УдалитьРегистрациюИзменений и заполним следующим образом (листинг 3.80).

Листинг 3.80. Обработчик команды «УдалитьРегистрациюИзменений»

&НаКлиенте

Процедура УдалитьРегистрациюИзменений(Команда)

 

ОбменСУдаленнымиСкладами.ПолноеУдалениеРегистрацииДанныхПоУзлу(УзелОбмена);

 

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

В этом обработчике мы вызываем процедуру ПолноеУдалениеРегистрацииДанныхПоУзлу(), в которую передаем ссылку на узел обмена, для которого должна произойти очистка таблиц регистрации изменений. Эту процедуру мы поместим в общем модуле ОбменСУдаленнымиСкладами и заполним следующим образом (листинг 3.81).

Листинг 3.81. Удаление регистрации изменений для узла

Процедура ПолноеУдалениеРегистрацииДанныхПоУзлу(Узел) Экспорт

 

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

Сообщение.Текст = "Удаление регистрации всех данных для узла " + Узел;

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

ПланыОбмена.УдалитьРегистрациюИзменений(Узел);

 

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

Теперь создадим обработчик команды ПолнаяРегистрацияИзменений и заполним следующим образом (листинг 3.82).

Листинг 3.82. Обработчик команды «ПолнаяРегистрацияИзменений»

&НаКлиенте

Процедура ПолнаяРегистрацияИзменений(Команда)

 

ОбменСУдаленнымиСкладами.ПолнаяРегистрацияДанныхПоУзлу(УзелОбмена, Ложь);

 

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

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

Листинг 3.83. Полная регистрация изменений для узла

Процедура ПолнаяРегистрацияДанныхПоУзлу(Узел, РегистрироватьВсе) Экспорт

 

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

// значения параметра РегистрироватьВсе = Истина или

// значение склада в узле не установлено.

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

 

Если РегистрироватьВсе Или Узел.Склад.Пустая() Тогда

Сообщение.Текст = "Регистрация всех данных по узлу " + Узел;

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

ПланыОбмена.ЗарегистрироватьИзменения(Узел);

Иначе

Сообщение.Текст = "Регистрация данных по узлу " + Узел + " -----------";

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

ПланОбмена = Узел.Метаданные();

Состав = ПланОбмена.Состав;

 

Для Каждого ЭлементСостава Из Состав Цикл

Сообщение.Текст = " Регистрация данных " + ЭлементСостава.Метаданные + " по узлу " + Узел;

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

 

Если ЭлементСостава.Метаданные = Метаданные.Документы.РасходнаяНакладная Тогда

 

// Зарегистрировать изменения документов РасходнаяНакладная для узла, в случае если

// склад узла совпадает со складом накладной.

// Выбрать документы РасходнаяНакладная с отбором по складу узла.

Запрос = Новый Запрос("ВЫБРАТЬ

| Ссылка

|ИЗ

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

|ГДЕ

| Склад = &Склад");

 

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

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

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

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

ПланыОбмена.ЗарегистрироватьИзменения(Узел, Выборка.Ссылка);

КонецЦикла;

 

ИначеЕсли ЭлементСостава.Метаданные = Метаданные.РегистрыНакопления.УчетНоменклатуры Тогда

 

// Выбрать все различные регистраторы регистра.

Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ

| Регистратор

|ИЗ

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

|ГДЕ

| Склад = &Склад");

 

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

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

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

// Создать набор записей регистра с отбором по регистратору.

НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);

 

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

ПланыОбмена.ЗарегистрироватьИзменения(Узел, НаборЗаписей);

КонецЦикла;

 

Иначе

 

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

ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭлементСостава.Метаданные);

КонецЕсли;

 

КонецЦикла;

 

КонецЕсли;

 

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

Во втором параметре РегистрироватьВсе в процедуру ПолнаяРегистрацияДанныхПоУзлу() передается значение типа Булево. Если это значение Истина, то для данного узла будет выполняться регистрация изменения всех объектов (невзирая на принадлежность данного узла к какому-либо определенному складу). Такой же вариант регистрации будет осуществлен, если в качестве первого параметра будет передан узел, у которого в реквизите Склад содержится пустая ссылка.

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

Если в качестве второго параметра передается значение Ложь, расходные накладные и записи регистра накопления регистрируются как измененные только в случае совпадения склада со складом, определенным в узле плана обмена. Все остальные данные регистрируются обычным образом.

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

После этого создадим пустую базу розничного склада из выгруженной ранее конфигурации. В этой базе создадим такой же список узлов плана обмена Удаленные склады с такими же кодами узлов, что и в центральной базе. Установим префикс номеров и каталог обмена в форме настроек информационной базы так же, как мы это делали раньше. В обработке Обмен с удаленными складами выберем узел обмена Центральный офис, нажмем кнопку Загрузить данные и получим все изменения, переданные от центральной базы.

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

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