В практике разработки на платформе 1С:Предприятие часто возникает задача разделения потоков данных при синхронизации. Типичный пример: справочники должны обновляться в режиме реального времени (каждые 5-10 минут), а тяжелые документы — только в ночное время, чтобы не нагружать каналы связи и сервер в рабочие часы. Рассмотрим, как реализовать такую схему, используя один объект ПланОбмена и несколько узлов, привязанных к одной физической базе.
Разберем типичную ошибку начинающих разработчиков. Кажется, что можно использовать один узел и просто фильтровать данные в правилах выгрузки в зависимости от времени суток. Однако здесь кроется критическая проблема — нумерация сообщений. Если система выгрузила сообщение №100, в которое попали только справочники, то при получении подтверждения (квитанции) от базы-приемника, платформа автоматически снимет с регистрации все изменения, которые были зафиксированы на момент формирования сообщения №100, включая документы, которые вы «отфильтровали» программно. В итоге документы просто не будут переданы.
Использование двух независимых узлов позволяет иметь две автономные очереди регистрации изменений и два независимых счетчика сообщений. Это гарантирует, что подтверждение доставки справочников по «узлу №1» никак не повлияет на регистрацию документов по «узлу №2».
Проанализируем техническую сторону вопроса. Платформа идентифицирует отправителя сообщения по коду узла, который указан в файле обмена. Поэтому для корректной работы необходимо соблюдать принцип зеркальности. Разберем по шагам, как это настроить:
ПБ_НСИ (для справочников) и ПБ_ДОК (для документов).Рассмотрим схему именования кодов (префиксов), предложенную в обсуждении:
Для того чтобы данные автоматически распределялись по нужным узлам, нам потребуется настроить ПравилаРегистрацииОбъектов. Выясним причину, по которой это лучше делать программно или через специализированные правила. В коде регистрации мы можем проверить, для какого узла в данный момент срабатывает событие.
Рассмотрим пример программной регистрации изменений в модуле объекта или через подписку на события:
Процедура ПриЗаписиОбъектаДляОбмена(Источник, Отказ)
ПланОбменаСсылка = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Обмен с филиалом");
// Получаем узлы: один для НСИ, другой для документов
УзелНСИ = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("ПБ_НСИ");
УзелДОК = ПланыОбмена.СинхронизацияДанныхЧерезУниversalныйФормат.НайтиПоКоду("ПБ_ДОК");
Если Метаданные.Справочники.Содержит(Источник.Метаданные()) Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелНСИ, Источник);
ИначеЕсли Метаданные.Документы.Содержит(Источник.Метаданные()) Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелДОК, Источник);
КонецЕсли;
КонецПроцедуры
Если вы работаете с типовой конфигурацией и не хотите глубоко менять логику БСП, можно рассмотреть вариант со «служебным» узлом. Суть метода заключается в следующем: в течение дня все документы регистрируются на одном узле, который не участвует в обмене по расписанию. Ночью запускается регламентное задание, которое переносит регистрацию с этого узла на основной рабочий узел.
Рассмотрим пример кода для переноса регистрации объектов:
Процедура ПеренестиРегистрациюМеждуУзлами(УзелИсточник, УзелПриемник)
// Выбираем все изменения, зарегистрированные для документов на узле-источнике
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелИсточник, 1);
Пока ВыборкаИзменений.Следующий() Цикл
ОбъектИзменения = ВыборкаИзменений.Получить();
// Регистрируем на основном узле
ПланыОбмена.ЗарегистрироватьИзменения(УзелПриемник, ОбъектИзменения);
// Снимаем с регистрации на служебном узле
ПланыОбмена.УдалитьРегистрациюИзменений(УзелИсточник, ОбъектИзменения);
КонецЦикла;
КонецПроцедуры
Важный нюанс: при таком подходе нужно быть осторожным с удалением регистрации. Если во время работы регламентного задания произойдет сбой, вы можете потерять часть данных. Поэтому рекомендуется сначала убедиться в успешной регистрации на целевом узле.
В современных конфигурациях на базе Библиотеки стандартных подсистем создание нескольких настроек обмена с одной базой может блокироваться интерфейсом. Рассмотрим, как это обойти:
УникальныйИдентификатор (GUID), возможно, потребуется создать запись в справочнике УзлыИнформационныхБаз программно или изменить настройки префиксов.Подведем итог: использование нескольких узлов для одной базы — это мощный инструмент оптимизации. Он позволяет разделить высокочастотный обмен НСИ и пакетную выгрузку документов, обеспечивая надежность за счет раздельных механизмов квитирования (подтверждения) сообщений.