Способы регистрации изменений данных в механизмах обмена данными
В платформе 1С:Предприятие 8.х реализовано два механизма обмена данными: универсальный механизм обмена данными и механизм распределенной информационной базы. Оба эти механизма базируются на одних тех же технологиях. Одной из этих технологий является служба регистрации изменений данных.
Изменения данных могут регистрироваться в автоматическом режиме. Для этого необходимо при включении объекта метаданных в состав плана обмена разрешить автоматическую регистрацию: установить признак Авторегистрация в значение Разрешить.
Однако часто требуется регистрация не каждого изменения данных, или регистрация изменений смежных объектов, или зависящих от изменяемых данных. Это можно выполнить различными способами.
Регистрация изменений всех данных для указанного узла
Для регистрации изменений всех данных для конкретного узла плана обмена необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные значение Неопределено.
Пример. Регистрация изменения всех данных для узла Узел:
Код 1C v 8.х
Регистрация изменений всех данных одного типа
Для регистрации изменений данных одного типа необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные объект описания метаданных, соответствующий данным.
Пример: регистрация изменения всех элементов справочника Номенклатура для узла Узел:
Код 1C v 8.х
Регистрация изменений конкретных данных различных типов
Для регистрации конкретных данных различных типов необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные либо сами данные, либо ссылку на них.
Регистрация изменений данных объектных типов
К объектным типам относятся справочники, документы, планы счетов, планы видов характеристик, планы расчета, бизнес-процессы, задачи. Для их регистрации необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные либо сам объект, либо ссылку на него.
Регистрация изменений наборов записей
Регистрация изменений наборов записей зависит от типа регистра, которому принадлежит набор записей. В общем случае в наборе записей должен быть установлен отбор, определяющий содержимое набора записей с точки зрения логики конфигурации. Чтение данных набора необязательно.
Регистрация изменений наборов записей регистров, подчиненных регистратору
К таким регистрам относятся регистры накопления, регистры бухгалтерии, регистры расчета и регистры сведений со свойством РежимЗаписи, установленным в значение ПодчинениеРегистратору. Для регистрации изменений наборов записей указанных регистров необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные набор записей с установленным отбором, в котором в элемент отбора Регистратор установлено значение регистратора данного набора записей. При этом чтение данных набора записей перед его регистрацией не обязательно.
Регистрация изменений наборов записей независимых регистров
К таким регистрам относятся регистры сведений со свойством РежимЗаписи, установленным в значение Независимый. Для регистрации изменений наборов записей данного регистра необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные набор записей. Состав элементов отбора, при этом, должен строго соответствовать основному отбору регистра. Выбирать поля, входящие в основной отбор регистра необходимо в соответствии с логикой работы конфигурации (см. Подготовка конфигурации к работе в распределенной информационной базе).
Для регистрации данных регистра сведений, отбираемых по некоторому критерию, необходимо:
выбрать уникальные значения измерений регистра, входящих в основной отбор (если регистр сведений является периодическим и Период включен в основной отбор, то Период также должен участвовать в отборе)
выполнить регистрацию наборов записей с установленными значениями отбора, соответствующими каждой выбранной комбинации значений измерений (входящих в основной отбор).
Пример. Регистрация всех данных регистра сведений КомплектующиеНоменклатуры, имеющего измерения Номенклатура и ХарактеристикаНоменклатуры (входящие в основной отбор), а также измерения Комплектующая и ХарактеристикаКомплектующей (не входящие в основной отбор) и являющегося непериодическим:
Код 1C v 8.х
План обмена
Механизмы обмена данными «1С:Предприятия» позволяют организовывать обмен информацией, хранимой в базе данных, с другими программными системами. К механизмам обмена данными могут быть отнесены:
- Планы обмена,
- XML-сериализация,
- Средства чтения и записи документов XML.
При помощи планов обмена мы получаем информацию о том, какие элементы данных были изменены и в какой узел обмена их необходимо передать. Это возможно благодаря тому, что планы обмена содержат механизм регистрации изменений. Информация об измененных данных переносится с помощью сообщений, инфраструктура которых также поддерживается планами обмена.
Что такое план обмена
Для того чтобы существовала возможность обмена какими-либо данными с кем-либо, необходимо некоторым образом идентифицировать тех, с кем мы будем обмениваться, и для каждого из них описать перечень обмена. Обе эти задачи позволяет решать объект конфигурации «План обмена». Подобно тому, как элементами данных справочника являются элементы справочника, элементами данных плана обмена являются узлы плана обмена.
Каждый узел идентифицирует участника обмена по данному плану обмена. Кроме этого, в каждом плане обмена всегда существует один предопределенный узел, идентифицирующий данную информационную базу.
В обмене данными могут участвовать:
- объекты базы данных: элементы справочников, документы и т. д.,
- необъектные данные: наборы записей регистров, последовательностей, константы,
- специальный объект встроенного языка – УдалениеОбъекта .
Для упрощения изложения в дальнейшем будем называть эти элементы информационных структур объектами обмена. Разработчик имеет возможность определить состав каждого плана обмена, указав объекты конфигурации, данные которых должны участвовать в обмене по данному плану. При описании состава данных плана обмена разработчик имеет возможность указать для каждого типа объектов признак Авторегистрация . Этот признак определяет, каким образом план обмена будет отслеживать изменения данных.
Возможность отслеживать изменения данных реализована в плане обмена за счет использования механизма регистрации изменений. Работа этого механизма базируется на том, что каждый из объектов обмена имеет свойство ОбменДанными , с помощью которого можно указать, для каких узлов необходимо производить регистрацию изменений этого объекта. Любые изменения объекта обмена сводятся в конечном итоге к записи или удалению объекта обмена.
Так вот, признак Авторегистрация , устанавливаемый при указании состава данных плана обмена, позволяет указать, что параметры обмена данными будут формироваться каждый раз самим механизмом регистрации изменений на основании информации, содержащейся в плане обмена. После автоматического заполнения параметров обмена разработчик имеет возможность внести изменения в сформированные таким образом параметры. Кроме этого, существует возможность отключить авторегистрацию изменений, и тогда параметры обмена данными нужно будет формировать полностью средствами встроенного языка.
Итак, при записи и удалении объектов обмена план обмена формирует записи регистрации изменений. Записи регистрации изменений хранятся в таблицах регистрации изменений, причем для каждого объекта обмена ведется своя таблица. При изменении объекта обмена в таблице регистрации изменений создается столько записей, сколько узлов-получателей указано в параметрах обмена данными у объекта обмена. Каждая запись при этом будет хранить ссылку на свой узел-получатель.
Кроме ссылки на узел обмена, для которого регистрируются изменения, каждая запись таблицы регистрации изменений хранит также номер сообщения, в котором изменение было передано в первый раз в этот узел. До тех пор, пока сообщение не будет передано в первый раз, это поле хранит NULL .
Поскольку сообщения передаются в рамках плана обмена от одного узла к другому, каждое сообщение точно ассоциировано с планом обмена, имеет уникальный номер и одного отправителя и получателя. За нумерацию сообщений отвечает инфраструктура сообщений. Благодаря этому записи регистрации изменений и имеют возможность хранить номера сообщений, в которых эти изменения были переданы первый раз.
Инфраструктура сообщений позволяет также получать подтверждения от узла-получателя о приеме сообщений. Такое подтверждение содержится в каждом сообщении, приходящем от узла-получателя в виде номера последнего принятого сообщения. Впоследствии, проанализировав номер последнего принятого сообщения и номера сообщений, содержащиеся в записях регистрации изменений, разработчик может удалить записи регистрации изменений, прием которых подтвержден получателем.
Добавление плана обмена
Раскроем ветвь «Общие» дерева объектов конфигурации и добавим новый объект конфигурации План обмена с именем Филиалы , представление объекта – Филиал . На закладке «Данные» создадим реквизит плана обмена Главный , имеющий тип Булево .
Этот реквизит понадобится нам для того, чтобы разрешать коллизии при обмене данными. Под коллизией понимается ситуация, когда один и тот же объект обмена данными был изменен одновременно в двух узлах. В этом случае мы будем анализировать значение реквизита Главный и принимать изменения только в том случае, если они сделаны в главном узле. В случае коллизии изменения, произведенные не в главном узле, мы будем отвергать.
Теперь определим состав объектов, участвующих в обмене. Для этого на закладке «Основные» нажмем кнопку «Состав».
Создадим основную форму узла и добавим обработчик события формы ПриСозданииНаСервере . Этот обработчик понадобится нам для того, чтобы запретить установку реквизита Главный для предопределенного узла, соответствующего данной информационной базе.
Затем создадим основную форму списка плана обмена, чтобы описать в ней некоторые действия по регистрации нового узла обмена.
Суть этих действий будет заключаться в том, что при регистрации нового узла обмена мы должны будем сформировать для него все необходимые записи регистрации изменений для всех объектов конфигурации, входящих в данный план обмена. Это будет своего рода начальная синхронизация узла обмена всеми данными обмена.
Для этого на закладке «Команды» создадим команду ЗарегистрироватьИзменения .
Кнопка «Зарегистрировать изменения» должна быть доступна только в случае, если текущий узел не является предопределенным для данной информационной базы, иначе регистрация изменений невозможна. Чтобы обеспечить такое поведение кнопки, создадим в модуле формы списка функцию, выполняющуюся на сервере без контекста и возвращающую истину, если переданный в функцию узел является предопределенным.
Затем в окне элементов формы выделим элемент Список , вызовем его палитру свойств и создадим обработчик события ПриАктивизацииСтроки .
Процедуры обмена данными
Для инициализации обмена данными мы используем обработку. Добавим новый объект конфигурации Обработка с именем ОбменДанными . На закладке Формы создадим основную форму обработки. В окне редактора форм на закладке «Команды» создадим команду формы ВыполнитьОбмен .
Алгоритм работы этой процедуры заключается в следующем: в цикле мы перебираем узлы, которые содержатся в плане обмена Филиалы , и для всех узлов, кроме себя самого, производим сначала чтение сообщений, поступивших из других узлов обмена. Затем мы формируем для них сообщения, предназначенные для передачи и содержащие измененные данные для этого узла.
Процедуры записи и чтения данных
Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы .
Как работает механизм регистрации изменений в 1С
Механизм регистрации изменений используется для обмена данными. При выполнении обмена из базы-источника в базу-приемник передаются не все данные, а только те, для которых были зарегистрированы изменения. В 1С регистрация изменений доступна для следующих объектов:
- константа;
- справочник;
- документ;
- план счетов;
- план видов характеристик;
- план видов расчета;
- бизнес процесс;
- задача.
А так же для наборов записей:
- регистра сведений;
- регистра бухгалтерии;
- регистра накопления;
- регистра расчета;
- перерасчета.
Где хранится информация о зарегистрированных изменениях
Каждое изменение регистрируется в специальных служебных таблицах, в названии которых в конце есть слово Изменения, например, таблица изменений для справочника контрагентов будет называться Контрагенты.Изменения.
Структура таблицы изменений подобна для всех объектов:
- ключ элемента данных, для которого регистрируются изменения;
- ссылка на узел, для которого регистрируется изменение;
- номер сообщения, в котором было передано изменение.
Запись в таблице изменений проходит следующие преобразования:
- При регистрации изменения объекта создаются записи для всех узлов обмена, в которых этот объект должен быть зарегистрирован. При этом в графе Номер сообщения устанавливается значение NULL.
- При отправке данных в другую информационную базу в графе Номер сообщения устанавливается порядковый номер переданного сообщения.
- При получении данных из другой информационной базы передается номер последнего принятого сообщения. При этом из таблиц изменений удаляются строки, в которых номер сообщения меньше или равен принятому в другой базе. Таким образом удаляется регистрация изменений, которые уже были переданы и прием которых подтвержден.
Как сделать запрос к таблице изменений
Таблицы изменений по умолчанию не видны в конструкторе запросов. Но их можно вывести с помощью кнопки Отображать таблицы изменений.
Пример запроса к таблице изменений:
Как зарегистрировать изменение объекта в 1С
Для ручной регистрации изменений объектов существует обработка Регистрация изменений для обмена.
Изменения данных могут регистрироваться в автоматическом режиме. Для этого необходимо при включении объекта метаданных в состав плана обмена разрешить автоматическую регистрацию: установить для свойства Авторегистрация значение Разрешить.
Для того чтобы зарегистрироваться изменения вручную, программно у менеджера планов обмена существует функция ЗарегистрироватьИзменения() . Функция имеет два параметра:
- узел;
- данные.
Как зарегистрировать все изменения для узла
Для того, чтобы зарегистрировать все изменения для конкретного узла, нужно в первом параметре передать ссылку на узел, а во втором — значение Неопределено.
Как зарегистрировать все изменения объектов определенного типа
Для того, чтобы зарегистрировать изменения объектов определенного типа, нужно в первом параметре передать ссылку на узел, а во втором — объект описания метаданных.
Как зарегистрировать все изменения конкретных объектов
Для того, чтобы зарегистрировать изменение конкретного объекта, нужно в первом параметре передать ссылку на узел, а во втором — ссылку на объект.
Для того, чтобы зарегистрировать изменение конкретного объекта, нужно в первом параметре передать ссылку на узел, а во втором — ссылку на объект.
Для регистрации изменений наборов записей регистров, подчиненных регистратору необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные набор записей с установленным отбором, в котором в элемент отбора Регистратор установлено значение регистратора данного набора записей. При этом чтение данных набора записей перед его регистрацией не обязательно.
Для регистрации изменений наборов записей независимого регистра необходимо вызвать метод ЗарегистрироватьИзменения() менеджера планов обмена, передав ему в качестве параметра Данные набор записей. Состав элементов отбора, при этом, должен строго соответствовать основному отбору регистра.
Набор = РегистрыСведений . КомплектующиеНоменклатуры . СоздатьНаборЗаписей ( ) ;
Набор . Отбор . Номенклатура . Значение = Номенклатура ;
Набор . Отбор . Номенклатура . Использование = Истина ;
Набор . Отбор . ХарактеристикаНоменклатуры . Значение = ХарактеристикаНоменклатуры ;
Набор . Отбор . ХарактеристикаНоменклатуры . Использование = Истина ;
ПланыОбмена . ЗарегистрироватьИзменения ( Узел , Набор ) ;
Как удалить регистрацию изменений
Для того чтобы удалить информацию о зарегистрированных изменениях у менеджера планов обмена существует функция УдалитьРегистрациюИзменений() . Функция имеет два параметра:
- узел;
- номер сообщения.
Как удалить регистрацию изменений полностью
Если необходимо удалить всю информацию о зарегистрированных изменениях для конкретного узла, то второй параметр следует оставить пустым:
Как удалить регистрацию изменений с номером сообщения не больше заданного
Если необходимо удалить информацию о зарегистрированных изменениях и при этом известен номер последнего полученного второй базой сообщения, то нужно передать этот номер сообщения в качестве второго параметра:
Например, если номер сообщения равен 2, то из таблиц изменений будут удалены все записи с номерами 1 и 2.
Как работает механизм регистрации изменений в 1С : 1 комментарий
Здравствуйте.
Как будет выглядеть код для отмены определенных изменений для всех объектов?
Надо чтобы не передавались удаление объектов, а только пометка на удаление.
Что такое авторегистрация
Народ подскажите.
Есть справочник «Номенклатура». Я создал ПланОбмена «ОбменНоменклатурой», в нем выбрал указанный справочник. Подскажите, что значит «Авторегистрация»?
(9) я просто сделал на платформе. внес 2-е записи в номенклатуру — как посмотреть изменения. План Обмена нахожу вот так:
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка = ПланыОбмена.ОбменНоменклатурой.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
Сообщить(«Нашел»);
КонецЕсли;
КонецЦикла;
Дописал вот так, но пока непонятно как добраться до хранимых ссылок:
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка = ПланыОбмена.ОбменНоменклатурой.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
Запрос = Новый Запрос («ВЫБРАТЬ
| ОбменНоменклатурой.Наименование КАК Наименование,
| ОбменНоменклатурой.НомерОтправленного КАК НомерОтправленного,
| ОбменНоменклатурой.НомерПринятого КАК НомерПринятого,
| ОбменНоменклатурой.Представление КАК Представление
|ИЗ
| ПланОбмена.ОбменНоменклатурой КАК ОбменНоменклатурой»);
Есть два способа выбрать изменения. Первый просто запросом, это для посмотреть. План обмена при этом не блокируется.
ВЫБРАТЬ
Товар.Ссылка КАК Ссылка
ИЗ
Справочник.Товар.Изменения КАК Товар
ГДЕ
Товар.Узел = &Узел
Второй способ, выбрать изменения стандартными средствами. план обмена при этом блокируется
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПолучитьИмяВременногоФайла());
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена.Ссылка);
Выборка = ПланыОбмена.ВыбратьИзменения(УзелОбмена.Ссылка, ЗаписьСообщения.НомерСообщения);
Пока Выборка.Следующий() Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
Попытка
ВыгрузитьОбъектСправочника(ИмяСправочника, обОбъект.Ссылка, спРеквизиты);
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, обОбъект);
#Если Клиент Тогда
Сообщить(обОбъект.Код+» успешно синхронизирован с узлом «+УзелОбмена.Наименование);
#КонецЕсли
Исключение
ЗаписьЖурналаРегистрации(«Обмен данными», ,УзелОбмена, обОбъект, ОписаниеОшибки(),);
КонецПопытки;
КонецЦикла;
(14) Делаю запросом — в чем косяк:
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка = ПланыОбмена.ОбменНоменклатурой.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
Запрос = Новый Запрос («ВЫБРАТЬ
| НоменклатураИзменения.Ссылка КАК Ссылка,
| НоменклатураИзменения.Узел КАК Узел
|ИЗ
| Справочник.Номенклатура.Изменения КАК НоменклатураИзменения
|ГДЕ
| НоменклатураИзменения.Узел = &Узел»);
Запрос.УстановитьПараметр(«Узел»,ПланыОбмена.ОбменНоменклатурой.НайтиПоНаименованию(«ТестПланОбмена»));
Результат = Запрос.Выполнить().Выбрать();