Регистрация изменений для плана обмена

Курс

Свойство ОбменДанными

У всех объектов и наборов записей, которые могут быть зарегистрированы в плане обмена есть свойство ОбменДанными, которое предназначено для управления обменом данными.

Свойство ОбменДанными имеет тип ПараметрыОбменаДанными. Оно не сохраняется в базе данных и имеет 3 свойства:

  • Загрузка
  • Отправитель
  • Получатели

Режим обмена

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

Например, справочник Договоры подчинен справочнику Контрагенты. В этом случае нельзя записать договор без заполнения реквизита Владелец:

А так запишется:

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

В типовых конфигурациях 1С в обработчиках ПередЗаписью и ПриЗаписи модуля объекта и модуля набора записей можно встретить следующий фрагмент кода:

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

Запись с установленным свойством ОбменДанными.Загрузка = Истина часто называются записью в режиме обмена или записью в режиме загрузки данных.

Запись в режиме обмена также можно использовать для более быстрой записи объектов. Например, когда нужно изменить значение одного реквизита у всех объектов:

Запись в режиме обмена нужно использовать с осторожностью. Не нужно всегда записывать все объекты в режиме обмена. В обработчиках ПередЗаписью и ПриЗаписи может выполняться код, который создает определенные записи в регистре сведений или определенным образом заполняет служебную табличную часть. А так как в начале этих обработчиков выполняется проверка на запись в режиме обмена, то этот код не будет выполнен.

Стоит отметить, что в режиме обмена нельзя проводить документы. В этом случае будет получена ошибка «Действие не может выполняться в режиме загрузки данных»:

Автоматическая регистрация

Свойство Получатели объекта ПараметрыОбменаДанными содержит в себе набор узлов плана обмена, на которых будет зарегистрирован записываемый объект. Данное свойство заполняется автоматически если при настройке состава плана обмена была разрешена автоматическая регистрация:

Данное свойство заполняется до вызова события ПередЗаписью. Непосредственно в самом событии оно уже заполнено узлами плана обмена:

Если в обработчике ПередЗаписью очистить свойство Получатели, то объект не будет зарегистрирован ни на одном из узлов плана обмена:

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

Изменять данное свойство в обработчике ПередЗаписью не имеет смысла. Автоматическое заполнение свойства Получатели узлами плана обмена выполняется до вызова данного обработчика:

Но при программной записи объекта через свойство АвтоЗаполнение можно выключить автоматическое заполнение узлов-получателей:

Также у свойства Получатели есть метод Заполнить, который позволяет заполнить данное свойство всеми узлами плана обмена, для которых включена автоматическая регистрация данного объекта:

Свойство АвтоЗаполнение не влияет на метод Заполнить. То есть если установить АвтоЗаполнение = Ложь и вызвать метод Заполнить, узлы все равно будут заполнены согласно настройки состава плана обмена.

Свойство ОбменДанными также доступно при удалении объекта в обработчике ПередУдалением. В этом случае в свойстве Получатели будут узлы плана обмена, для которых будет зарегистрировано удаление объекта.

Узел-отправитель

Установка свойства ОбменДанными.Загрузка = Истина не отменяет автоматическое заполнение свойства Получатели. Поэтому даже при записи в режиме обмена будет выполняться регистрация изменений.

В этом случае можно столкнуться с такой ситуацией: из другой базы была загружена новая номенклатура. Она была записана в режиме обмена в базу. Во время записи была выполнена регистрация на всех узлах плана обмена (кроме предопределенного), в том числе на том узле, из которого она пришла. Затем она была выгружена в тот узел, там записана и снова зарегистрирована для текущего узла. Снова загружена в текущий узел и т.д. В результате один объект будет без конца выгружаться туда-сюда.

Чтобы этого избежать используется свойство Отправитель. В данном свойстве указывается ссылка на узел, из которого был загружен объект. В результате при регистрации изменений для узла-отправителя не будет выполняться регистрация:

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

Для ручной регистрации изменений нужно запретить автоматическую регистрацию:

И программно заполнять узлы в обработчике ПередЗаписью.

Для добавления нового узла используется метод Добавить:

В этом случае объект будет зарегистрирован только на узле с кодом «000000002».

Для удаления узла из получателей можно воспользоваться методом Удалить. Перед удалением можно проверить есть ли в наборе необходимый узел методом Содержит:

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

Но как правило делается так:

  • Запрещается автоматическая регистрация
  • Создаются подписки на событие ПередЗаписью для справочников, документов и наборов записей. Плюс отдельная подписка на событие ПередУдалением для всех объектов.
  • В процедурах подписок выполняется регистрация объектов, в зависимости от различных условий.

Можно вручную заполнять узлы при программной записи объекта:

Программная регистрация

Для программной регистрации изменений используется метод ЗарегистрироватьИзменения. Первым параметром нужно передать узел или массив узлов, вторым — ссылку на объект, который нужно зарегистрировать:

Для регистрации сразу нескольких объектов вторым параметром можно передать массив:

Для регистрации константы вторым параметром нужно передать ключ константы:

Для регистрации регистра сведений нужно передать набор записей. При этом отбор в наборе записей должен совпадать с основным отбором регистра сведений:

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

Если нужно зарегистрировать все элементы одного справочника (документа, регистра и т.д.), то вторым параметром нужно передать объект метаданных:

Для регистрации всех объектов, которые входят в состав плана обмена, второй параметр нужно вообще не указывать. В этом случае первым параметром может быть только узел плана обмена, массив узлов нельзя указать:

Методом ИзменениеЗарегистрировано можно проверить зарегистрирован ли объект для определенного узла. Если зарегистрирован метод вернет Истина, иначе Ложь. Параметры такие же как у метода ЗарегистрироватьИзменения:

Удаление регистрации

Для удаления регистрации изменений используется метод УдалитьРегистрациюИзменений. Параметры такие же как у метода ЗарегистрироватьИзменения.

Рассмотрим данный метод на примерах:

Вторым параметром можно передать число. В этом случае с регистрации будут сняты все объекты, у которых в таблице регистрации изменений в колонке Номер сообщения содержится номер, который меньше или равен переданному параметру (но не равен NULL):


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok