В некоторых случаях может потребоваться принудительная регистрация изменений для какого-либо объекта, их списка (или всех объектов). Для этой цели может использоваться метод ЗарегистрироватьИзменения() объекта ПланыОбменаМенеджер. Данный метод позволяет выполнять регистрацию изменений одиночных элементов данных или целых групп для одного или нескольких узлов.
Первый параметр данного метода – ссылка на узел плана обмена или массив ссылок на узлы, для которых выполняется регистрация изменений. Если первый параметр представляет собой одиночную ссылку на узел, то второй параметр может быть опущен. При этом выполняется регистрация изменений всех элементов данных, которые на данный момент присутствуют в базе данных и изменения которых могут быть зарегистрированы для данного узла (листинг 3.6).
Листинг 3.6. Регистрация изменений данных для указанного узла
Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Новый");
ПланыОбмена.ЗарегистрироватьИзменения(Узел);
Данный вариант использования метода может быть полезен для организации начальной передачи данных вновь созданному узлу.
Если же первый параметр представляет собой массив ссылок на узлы, то второй параметр обязательно должен быть указан (листинг 3.7).
Листинг 3.7. Регистрация изменений элемента данных для указанных узлов
Узлы = Новый Массив(2);
Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый");
Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Розничный");
Данные = Справочники.Номенклатура.НайтиПоКоду("000000004");
ПланыОбмена.ЗарегистрироватьИзменения(Узлы, Данные);
Впрочем, второй параметр может присутствовать и в том случае, если первый параметр – одиночная ссылка на узел. В зависимости от способа задания второго параметра можно зарегистрировать изменения одного элемента данных или же всех данных, относящихся к одному объекту конфигурации. Кроме того, можно зарегистрировать удаление объекта (указав в качестве второго параметра объект типа УдалениеОбъекта).
Для регистрации изменений одного элемента в качестве второго параметра может быть указан сам элемент данных, ссылка на объект базы данных или объект конфигурации.
Пример регистрации изменений всех данных, относящихся к объекту конфигурации, приведен в листинге 3.8.
Листинг 3.8. Регистрация изменений данных, относящихся к объекту конфигурации
Узлы = Новый Массив(2);
Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый");
Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Розничный");
ПланыОбмена.ЗарегистрироватьИзменения(Узлы, Метаданные.Справочники.Номенклатура);
До сих пор ничего не говорилось об очистке таблицы регистрации изменений. По большому счету существуют две основные стратегии выполнения данного действия:
Рассмотрим следующий пример. Считаем, что таблица регистрации изменений документа РасходнаяНакладная имеет следующее наполнение (табл. 3.10).
Таблица 3.10. Таблица регистрации изменений
ДокументСсылка.РасходнаяНакладная | Узел | Номер сообщения |
---|---|---|
Расходная накладная № 1 от… | Оптовый | 3 |
Расходная накладная № 1 от… | Розничный | Null |
Расходная накладная № 2 от… | Оптовый | 1 |
Расходная накладная № 2 от… | Розничный | 1 |
Расходная накладная № 3 от… | Оптовый | 2 |
Расходная накладная № 3 от… | Розничный | 1 |
Расходная накладная № 4 от… | Оптовый | 3 |
Расходная накладная № 4 от… | Розничный | Null |
Исходя из данных таблицы, можно сказать, что в узел Оптовый было отправлено три сообщения, в узел Розничный ? одно.
Используется стратегия ожидания подтверждающей квитанции, при этом от участника обмена Оптовый приходит сообщение, в котором указано, что последнее полученное от «нас» сообщение имело номер 2. Исходя из этой информации, можно удалить изменения, отправленные в сообщениях 1 и 2 (поле НомерСообщения таблицы регистрации изменений).
Таблица примет следующий вид (табл. 3.11).
Таблица 3.11. Таблица регистрации изменений
ДокументСсылка.РасходнаяНакладная | Узел | Номер сообщения |
---|---|---|
Расходная накладная № 1 от… | Оптовый | 3 |
Расходная накладная № 1 от… | Розничный | Null |
Расходная накладная № 2 от… | Розничный | 1 |
Расходная накладная № 3 от… | Розничный | 1 |
Расходная накладная № 4 от… | Оптовый | 3 |
Расходная накладная № 4 от… | Розничный | Null |
В случае гарантированной доставки таблица регистрации изменений очищается сразу после отправки сообщения. Например, таблица регистрации изменений имела следующий вид (табл. 3.12).
Таблица 3.12. Таблица регистрации изменений
ДокументСсылка.РасходнаяНакладная | Узел | Номер сообщения |
---|---|---|
Расходная накладная № 1 от… | Оптовый | 3 |
Расходная накладная № 1 от… | Розничный | Null |
Расходная накладная № 2 от… | Оптовый | 1 |
Расходная накладная № 3 от… | Оптовый | 2 |
Расходная накладная № 4 от… | Оптовый | 3 |
Расходная накладная № 4 от… | Розничный | Null |
В узел Розничный формируется сообщение с номером 2. После того как сообщение сформировано, таблица регистрации будет иметь следующий вид (табл. 3.13).
Таблица 3.13. Таблица регистрации изменений
ДокументСсылка.РасходнаяНакладная | Узел | Номер сообщения |
---|---|---|
Расходная накладная № 1 от… | Оптовый | 3 |
Расходная накладная № 1 от… | Розничный | 2 |
Расходная накладная № 2 от… | Оптовый | 1 |
Расходная накладная № 3 от… | Оптовый | 2 |
Расходная накладная № 4 от… | Оптовый | 3 |
Расходная накладная № 4 от… | Розничный | 2 |
Далее производится вызов метода по удалению записей в таблице регистрации изменений (метод рассматривается чуть позже). Таблица регистрации изменений примет такой вид (табл. 3.14).
Таблица 3.14. Таблица регистрации изменений
ДокументСсылка.РасходнаяНакладная | Узел | Номер сообщения |
---|---|---|
Расходная накладная № 1 от… | Оптовый | 3 |
Расходная накладная № 2 от… | Оптовый | 1 |
Расходная накладная № 3 от… | Оптовый | 2 |
Расходная накладная № 4 от… | Оптовый | 3 |
Для удаления записей регистрации изменений у менеджера планов обмена имеется метод УдалитьРегистрациюИзменений(). В качестве первого параметра метода может использоваться ссылка на узел или массив таких ссылок. В качестве второго параметра может указываться ссылка на объект, УдалениеОбъекта, объект конфигурации, число (номер сообщения).
Для удаления записей таблицы регистрации изменений с номерами сообщения не больше переданного (в примере с номерами 1 и 2) может использоваться следующий фрагмент кода (листинг 3.9).
Листинг 3.9. Пример удаления записей таблицы регистрации
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
// Загрузить сообщение обмена из файла и начать чтение сообщения.
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
// Удалить регистрацию с номерами сообщения не больше принятого (2).
НомерПринятого = ЧтениеСообщения.НомерПринятого;
ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерПринятого);
Пример удаления записей регистрации изменений для всех данных, которые зарегистрированы для узла, приведен в листинге 3.10.
Листинг 3.10. Пример удаления записей таблицы регистрации
Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый");
ПланыОбмена.УдалитьРегистрациюИзменений(Узел);
Можно удалить записи регистрации изменений конкретного элемента данных для одного или нескольких узлов (листинг 3.11).
Листинг 3.11. Пример удаления записей таблицы регистрации
Узлы = Новый Массив(2);
Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый");
Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Розничный");
Данные = Справочники.Номенклатура.НайтиПоКоду("000000004");
ПланыОбмена.УдалитьРегистрациюИзменений(Узлы, Данные);
Также можно удалить записи регистрации изменений всех данных, относящихся к объекту конфигурации, для одного или нескольких узлов (листинг 3.12).
Листинг 3.12. Пример удаления записей таблицы регистрации
Узлы = Новый Массив(2);
Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый");
Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Розничный");
ПланыОбмена.УдалитьРегистрациюИзменений(Узлы, Метаданные.Справочники.Номенклатура);