Как настроить авторегистрацию в планах обмена РИБ и зачем нужны подписки на события?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При проектировании и настройке распределенных информационных баз (РИБ) на платформе 1С:Предприятие 8 одним из ключевых вопросов является управление регистрацией изменений объектов. Разработчику необходимо четко понимать, каким образом данные будут распределяться между узлами системы. В этой статье мы подробно разберем, на что влияет свойство авторегистрации в планах обмена, когда следует выбирать режим «Разрешить», а когда — «Запретить», и как правильно использовать подписки на события для точечной регистрации данных.

Разберем основы: что такое авторегистрация в плане обмена?

Для каждого объекта метаданных (будь то справочник, документ, бизнес-процесс или регистр), который включен в состав плана обмена, в конфигураторе доступно свойство «Авторегистрация». Это свойство определяет поведение платформы 1С при записи данного объекта базы данных. Платформа предлагает два основных режима работы:

  1. Разрешить (автоматическая регистрация):

    В этом режиме платформа берет на себя все заботы по регистрации изменений. Как только в информационной базе записывается, изменяется или проводится объект, ссылка на него автоматически добавляется в таблицу регистрации изменений для всех существующих узлов этого плана обмена (кроме того узла, из которого эти изменения пришли). Это классический платформенный механизм РИБ «по умолчанию».

  2. Запретить (отключение авторегистрации):

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

Плюсы и минусы авторегистрации «Разрешить»

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

Преимущества автоматической регистрации:

Недостатки автоматической регистрации:

Когда авторегистрацию необходимо «Запретить»?

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

Программная регистрация изменений: как это сделать правильно?

Если для объекта метаданных авторегистрация запрещена, то обязанность по его регистрации перекладывается на плечи разработчика. Посмотрим на пример программной регистрации изменений с помощью встроенного языка платформы 1С.

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

Ниже представлен пример программного кода, который помещается в общий модуль конфигурации:


Процедура поОрганизацииРегистрацияПриЗаписи(Источник, Отказ) Экспорт

    // Шаг 1. Обязательно проверяем свойство ОбменДанными.Загрузка!
    // Если объект записывается в процессе загрузки из другой базы, 
    // повторно регистрировать его к обмену не нужно, иначе возникнет зацикливание.
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Шаг 2. Получаем реквизит организации из записываемого объекта
    Если НЕ ЗначениеЗаполнено(Источник.Организация) Тогда
        Возврат;
    КонецЕсли;

    ОрганизацияДокумента = Источник.Организация;

    // Шаг 3. Ищем узлы нашего плана обмена, для которых разрешена эта организация.
    // Предположим, у нас есть план обмена "ОбменПоОрганизациям" 
    // и в свойствах его узлов хранится ссылка на организацию.
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ОбменПоОрганизациям.Ссылка КАК Узел
        |ИЗ
        |   ПланОбмена.ОбменПоОрганизациям КАК ОбменПоОрганизациям
        |ГДЕ
        |   ОбменПоОрганизациям.Организация = &Организация
        |   И НЕ ОбменПоОрганизациям.ПометкаУдаления
        |   И НЕ ОбменПоОрганизациям.ЭтотУзел";
    
    Запрос.УстановитьПараметр("Организация", ОрганизацияДокумента);
    РезультатЗапроса = Запрос.Выполнить();

    Если НЕ РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Пока Выборка.Следующий() Цикл
            
            // Шаг 4. Выполняем регистрацию изменений для найденного узла
            ПланыОбмена.ЗарегистрироватьИзменения(Выборка.Узел, Источник.Ссылка);
            
        КонецЦикла;
    КонецЕсли;

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

Важно помнить: использование проверки Источник.ОбменДанными.Загрузка является критически важным стандартом разработки в 1С. Если вы пропустите эту проверку, то при приеме сообщения обмена в главном узле документ запишется, сработает подписка на событие, и этот же документ снова зарегистрируется на отправку в подчиненный узел. Это вызовет так называемый «эхо-эффект» (бесконечный гон данных туда-обратно).

Подписка «поОрганизацииРегистрация» — нужно ли всё отражать параллельно?

Возвращаясь к вопросу из обсуждения на форуме: если у нас есть подписка на событие (например, поОрганизацииРегистрация), которая точечно регистрирует изменения по определенному алгоритму, нужно ли параллельно включать авторегистрацию в плане обмена?

Ответ однозначный: Нет, ни в коем случае!

Если для объекта в плане обмена будет одновременно включена авторегистрация («Разрешить») и при этом будет работать подписка на событие, которая программно регистрирует изменения, произойдет следующее:

Таким образом, логика фильтрации по организации будет полностью сломана, и все документы улетят во все базы. Поэтому, если вы пишете свой программный код фильтрации в подписке на событие, авторегистрацию для этого объекта в плане обмена необходимо принудительно установить в значение «Запретить».

Особенности использования Библиотеки стандартных подсистем (БСП)

В современных конфигурациях 1С (таких как ERP, Комплексная автоматизация, Управление торговлей, Бухгалтерия предприятия) разработчики практически никогда не настраивают авторегистрацию вручную на уровне метаданных. Все механизмы обмена стандартизированы и управляются подсистемой БСП «Обмен данными».

Посмотрим, как это устроено в БСП:

Полезные приемы программного управления регистрацией

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

Проанализируем следующий пример кода:


// Создаем новый элемент справочника Номенклатура
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Тестовая позиция (без обмена)";

// Отключаем автоматическую регистрацию изменений платформой для этой записи
НовыйЭлемент.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;

// Теперь при записи элемент не будет зарегистрирован ни на одном узле плана обмена,
// несмотря на то, что в метаданных для справочника Номенклатура может стоять "Разрешить".
НовыйЭлемент.Записать();

Этот прием очень полезен при выполнении различных групповых обработок данных, загрузке технологической информации из внешних файлов или при проведении регламентных процедур, когда изменения не должны транслироваться в периферийные узлы РИБ.

Подведем итоги

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

← На главную