Как правильно организовать архитектуру планов обмена в 1С при работе с несколькими базами?

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

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

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

Вариант 1: Индивидуальный план обмена для каждого направления

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

Преимущества этого подхода:

  1. Изоляция настроек: Изменение состава объектов в одном обмене никак не влияет на другие. Если завтра в четвертом обмене потребуется добавить регистрацию нового регистра сведений, это не затронет остальные четыре схемы.
  2. Простота настройки «в лоб»: В конфигураторе мы просто проставляем галочки у нужных объектов в составе плана обмена.
  3. Независимость конфигураций: Если базы-корреспонденты сильно отличаются (например, обмен с ERP, с самописной базой и с веб-сайтом), отдельные планы позволяют проще реализовать специфичную логику для каждого получателя.

Недостатки и риски:

Основной проблемой здесь становится избыточность метаданных и нагрузка на СУБД. Проанализируем ситуацию на уровне SQL. Для каждого объекта, включенного в состав плана обмена, система создает отдельную таблицу регистрации изменений. Если один и тот же справочник включен в 5 разных планов, в базе данных будет создано 5 физических таблиц регистрации для этого справочника. При каждой записи объекта 1С будет вынуждена записывать данные во все 5 таблиц в рамках одной транзакции, что существенно повышает риск возникновения взаимоблокировок (deadlocks) и замедляет работу пользователей.

Вариант 2: Один универсальный план обмена для всех узлов

Рассмотрим альтернативный, более современный подход: мы создаем один ПланОбмена, включаем в его состав все необходимые объекты, а разделение логики производим на уровне узлов этого плана обмена.

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

Механизм программной регистрации:

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


Процедура ПередЗаписьюОбъекта(Источник, Отказ)
    // Определяем, для каких узлов нужно зарегистрировать изменения
    ПланыОбмена.ЗарегистрироватьИзменения(УзелДляОбменаСБухгалтерией, Источник);
    
    Если Источник.ВидОбъектаПодходитДляСайта Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(УзелДляОбменаССайтом, Источник);
    КонецЕсли;
КонецПроцедуры

Этот подход позволяет гибко управлять составом данных, не создавая лишних объектов в дереве метаданных. Мы прописываем логику один раз, и она эффективно работает для любого количества узлов.

Влияние на производительность и блокировки

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

  1. Уменьшение количества таблиц регистрации: СУБД проще обслуживать одну таблицу регистрации изменений с индексами, чем десяток мелких таблиц. Это снижает фрагментацию индексов и оптимизирует работу кэша базы данных.
  2. Сокращение транзакций: При записи документа системе не нужно открывать и фиксировать изменения в пяти разных местах. Запись происходит в одну таблицу регистрации, где меняется только ссылка на узел.
  3. Упрощение обслуживания: Очистка таблиц регистрации изменений (например, при зависании одного из обменов) выполняется гораздо быстрее и прозрачнее, когда данных меньше и они структурированы в одном месте.

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

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

Это позволяет конечному пользователю или администратору системы менять состав обмена вообще без внесения изменений в конфигуратор. Вы можете добавить фильтр «выгружать только документы по конкретной организации для этого узла», и система сама будет управлять регистрацией изменений.

Когда все же стоит создавать разные планы обмена?

Несмотря на общую рекомендацию минимизировать количество планов, существуют исключения. Рассмотрим ситуации, когда разделение оправдано:

Итоговые рекомендации по проектированию

Подводя итог нашему анализу, сформулируем правила выбора архитектуры:

  1. Соблюдайте принцип «один ко многим»: Старайтесь использовать один план обмена для всех однотипных баз-корреспондентов.
  2. Используйте узлы для фильтрации: Помните, что каждый узел в плане обмена — это независимая очередь сообщений. Используйте программную регистрацию или правила БСП для того, чтобы в каждый узел попадали только нужные данные.
  3. Откажитесь от авторегистрации: Для сложных систем с множеством потребителей лучше отключить автоматическую регистрацию и реализовать логику через подписки на события. Это даст вам полный контроль над тем, кто и что получает.
  4. Мониторинг: При любом подходе важно следить за размером таблиц регистрации (через стандартные обработки «Регистрация изменений для обмена»). Помните, что «забытый» и не удаленный узел в любом плане обмена будет накапливать данные вечно, замедляя всю систему.

Таким образом, правильнее сделать один универсальный план обмена (если базы имеют схожую природу данных) и настроить в нем пять узлов. Это обеспечит максимальную производительность SQL-сервера и упростит дальнейшее развитие системы синхронизации.

← На главную