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