При работе с механизмами интеграции и обмена данными в крупноблочных конфигурациях, таких как 1С:ERP Управление предприятием, разработчики часто сталкиваются с необходимостью управления регистрацией изменений. Стандартный сценарий «выгрузил данные — хочу сразу очистить регистрацию для узла» таит в себе множество подводных камней, особенно если эта операция выполняется некорректно или внутри транзакции записи объектов. В этой статье мы подробно разберем, какими методами платформы и Библиотеки стандартных подсистем (БСП) следует решать эту задачу правильно и безопасно.
Если перед нами стоит задача полностью очистить все зарегистрированные изменения для конкретного узла плана обмена (стереть так называемый «кэш» выгрузки), не нужно искать сложные обходные пути в общих модулях БСП. Для этого в платформе «1С:Предприятие 8» реализован быстрый и оптимизированный на уровне СУБД метод:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена);
Рассмотрим подробнее особенности работы этого метода:
Часто у разработчиков возникает соблазн удалить регистрацию изменений непосредственно в коде, который записывает объект, или в конце транзакции выгрузки. Проанализируем ситуацию, почему так делать не рекомендуется:
УдалитьРегистрациюИзменений могут сработать платформенная авторегистрация или подписки на события БСП (например, ПередЗаписью или ПриЗаписи). В итоге объект все равно будет зарегистрирован заново перед фиксацией транзакции.Выясним, как правильно обойти регистрацию изменений при записи объектов по стандартам БСП. Вместо того чтобы сначала регистрировать объект, а затем пытаться удалить эту регистрацию, её необходимо заблокировать в момент записи объекта. Для этого у записываемого объекта перед вызовом метода Записать() устанавливают специальные свойства:
// Отключаем автозаполнение получателей (блокируем регистрацию на узлах обмена)
ЭтотОбъект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
ЭтотОбъект.ОбменДанными.Получатели.Очистить();
ЭтотОбъект.Записать();
Если запись выполняется в рамках интеграционных процедур, когда выполнять бизнес-логику и регистрировать изменения на других узлах вообще не требуется, используют стандартное свойство:
ЭтотОбъект.ОбменДанными.Загрузка = Истина;
ЭтотОбъект.Записать();
В БСП включение режима загрузки автоматически предотвращает регистрацию изменений на всех связанных узлах планов обмена.
В конфигурациях на базе БСП (включая 1С:ERP) удаление регистрации изменений никогда не происходит сразу «вдогонку» за выгрузкой. Архитектура обмена построена на принципе квитирования — подтверждения успешного приема данных получателем. Это гарантирует, что данные не потеряются в случае сбоя сети или ошибки при записи в принимающей базе.
Разберем по шагам, как работает этот процесс:
НомерОтправленного.НомерПринятого.
ПланыОбмена.УдалитьРегистрациюИзменений(Отправитель, НомерПринятого);
Такой вызов удаляет из таблиц регистрации только те записи для данного узла, номер сообщения у которых меньше или равен полученному. Те изменения, которые возникли в базе за время, пока сообщение шло до приемника, гарантированно сохраняются и будут выгружены при следующем сеансе связи.
Если вам требуется управлять регистрацией изменений интерактивно или программно в соответствии со стандартами 1С, используйте готовый инструментарий:
ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(Получатель, Данные, ПроверятьРазрешениеВыгрузки);
Таким образом, для полной очистки таблиц регистрации изменений используйте платформенный метод ПланыОбмена.УдалитьРегистрациюИзменений(Узел) вне транзакций записи, а при необходимости точечного отключения регистрации при записи документов применяйте свойства коллекции ОбменДанными.