При настройке и тестировании сложных обменов данными в «1С:Предприятие» разработчики часто сталкиваются с жестким ограничением платформы: если для объекта в плане обмена включена авторегистрация, то при любой записи этого объекта изменения регистрируются абсолютно для всех существующих узлов этого плана. Напрямую в пользовательском режиме (без изменения конфигурации) нельзя просто «снять галочку» и приостановить регистрацию только для одного конкретного узла, сохранив при этом уже накопленные на нем данные.
В этой статье мы подробно разберем, почему возникает эта проблема, и рассмотрим несколько эффективных способов ее решения: от выгрузки и восстановления регистрации до тонкой настройки правил и использования минимального программного кода.
---
Прежде чем перейти к решениям, давайте проанализируем поведение платформы 1С. В конфигураторе для каждого объекта, входящего в состав плана обмена, устанавливается свойство Авторегистрация, которое может принимать значения Разрешить или Запретить. Если выбрано «Разрешить», то при любом изменении объекта (создании, перезаписи, проведении) платформа автоматически выполняет запись в таблицу регистрации изменений для каждого узла данного плана обмена (кроме предопределенного узла «ЭтотУзел»).
Возможность выборочно отключить эту автоматику для конкретного получателя стандартными платформенными настройками не предусмотрена. Однако в реальной практике, особенно при переходе со старых конфигураций на новые (например, при переносе данных из ЗУП 2.5 в ЗУП 3.1), возникает необходимость временно «заморозить» один из узлов на время тестов, не теряя при этом уже накопленную очередь изменений.
---
Этот метод является наиболее надежным, если вам требуется полностью исключить регистрацию новых объектов на период тестирования нового узла, но при этом нельзя потерять старые изменения. Рассмотрим этот процесс по шагам.
Регистрация изменений для обмена. С ее помощью мы можем увидеть все зарегистрированные объекты по нашему «проблемному» узлу. Нам необходимо выгрузить (сохранить) эти зарегистрированные изменения. Если стандартная обработка не позволяет сделать это напрямую в файл, можно воспользоваться универсальной обработкой Универсальный обмен данными в формате XML, выгрузив данные по правилам обмена, либо написать простейший скрипт для сохранения номеров сообщений и ссылок зарегистрированных объектов.Регистрация изменений для обмена загружаем ранее сохраненный список объектов и принудительно регистрируем их на этот созданный узел. Очередь обмена восстановлена в том виде, в котором она была до начала тестов.---
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП) и обмен настроен через стандартные механизмы синхронизации данных, вы можете управлять регистрацией без изменения кода конфигурации и без удаления узлов. Для этого используются Правила регистрации объектов (ПРО).
Давайте разберем, как это реализовать:
Конвертация данных (версии 2 или 3, в зависимости от технологии вашего обмена).ПередОбработкой или ПриРегистрации прописываем условие отбора по узлу-получателю. Например, мы можем заблокировать регистрацию для узла с конкретным кодом:
// Пример условия в правилах регистрации объектов
Если Получатель.Код = "Код_Заблокированного_Узла" Тогда
Отказ = Истина;
КонецЕсли;
После этого платформа при попытке зарегистрировать объект будет обращаться к логике БСП. Правила регистрации увидят, что получателем является заблокированный узел, и благодаря параметру Отказ = Истина отменят автоматическую регистрацию для него, в то время как для всех остальных узлов регистрация продолжит работать в штатном режиме.
---
Если вы являетесь разработчиком и у вас есть возможность внести минимальные изменения в конфигурацию (или внедрить расширение), можно управлять процессом регистрации программно. Для этого используется свойство ОбменДанными.Получатели, доступное у любого регистрируемого объекта.
Давайте посмотрим на пример реализации логики в подписке на событие ПередЗаписью для объектов, входящих в план обмена:
Процедура ПередЗаписьюОбъектаДляОбмена(Источник, Отказ) Экспорт
// Отключаем стандартное автоматическое заполнение получателей платформой
Источник.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
// Получаем список всех активных узлов плана обмена, кроме заблокированного
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка КАК Узел
|ИЗ
| ПланОбмена.ИмяВашегоПланаОбмена
|ГДЕ
| Ссылка <> &ИсключаемыйУзел
| И Ссылка <> &ЭтотУзел";
Запрос.УстановитьПараметр("ИсключаемыйУзел", НайтиИсключаемыйУзел()); // Функция поиска вашего заблокированного узла
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.ИмяВашегоПланаОбмена.ЭтотУзел());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Вручную добавляем в получатели только разрешенные узлы
Источник.ОбменДанными.Получатели.Добавить(Выборка.Узел);
КонецЦикла;
КонецПроцедуры
Установка свойства АвтоЗаполнение = Ложь указывает платформе, что разработчик берет управление регистрацией в свои руки. В коллекцию получателей мы добавляем только те узлы, на которые действительно нужно отправить изменения, полностью игнорируя заблокированный узел.
---
Если вам категорически нельзя менять конфигурацию, правила регистрации и удалять узел, но у вас есть возможность запускать внешние обработки, можно применить метод «пост-очистки».
Для этого пишется простая обработка, которая запускается вручную или по регламентному заданию (например, раз в час). Она анализирует новые зарегистрированные изменения по нашему узлу и удаляет регистрацию только для тех объектов, которые были изменены после определенной даты (начала вашего тестирования).
Для удаления регистрации используется метод ПланыОбмена.УдалитьРегистрациюИзменений(). Проанализируем пример кода:
// Задаем узел, для которого чистим новые изменения
УзелПолучатель = ПланыОбмена.НашПланОбмена.НайтиПоКоду("КОД_УЗЛА");
// Удаляем регистрацию выборочно. Например, для конкретного типа данных:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПолучатель, Справочники.Номенклатура);
// Или удаляем регистрацию вообще всех объектов для этого узла, если нужно полностью очистить очередь:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПолучатель);
Этот способ позволяет гибко контролировать состав зарегистрированных изменений «постфактум», не вмешиваясь в транзакции записи объектов пользователями, что гарантирует стабильность и высокую скорость работы информационной базы.