Почему нельзя добавить новый план обмена в расширение и как решить эту задачу?

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

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

Выясняем причину: архитектурные ограничения платформы

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

Даже в самых современных версиях платформы (8.3.24, 8.3.25 и выше) невозможно нажать кнопку «Добавить» в ветке планов обмена внутри расширения. Платформа просто не позволяет создавать «с нуля» новый объект этого типа в слое расширения. Однако это не означает, что мы не можем работать с механизмами обмена. Рассмотрим подробнее доступные нам инструменты.

Заимствование существующего плана обмена

Если нам необходимо внести изменения в логику работы обмена, мы можем воспользоваться механизмом заимствования. Рассмотрим, как это сделать по шагам:

  1. Найдем нужный план обмена в дереве объектов основной конфигурации.
  2. Нажмем правую кнопку мыши и выберем пункт «Добавить в расширение».
  3. После того как объект появился в расширении, мы получаем возможность модифицировать его функциональность.

Проанализируем, что именно мы можем изменять в заимствованном плане обмена:

Использование расширений в распределенных информационных базах (РИБ)

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

Для самого расширения также реализованы важные свойства:

Как добавить новые объекты из расширения в состав плана обмена

Часто задача стоит так: «Я создал новый справочник в расширении и хочу, чтобы он участвовал в обмене». Поскольку создать свой план обмена нельзя, мы должны использовать существующий. Рассмотрим подробнее, как включить новые объекты в Состав плана обмена.

Для этого необходимо выполнить следующие действия:

  1. Заимствовать план обмена из основной конфигурации в расширение.
  2. Создать новый объект (например, справочник НовыйСправочник_Расш) непосредственно в расширении.
  3. Открыть окно «Состав» заимствованного плана обмена в расширении и установить флаг регистрации для нашего нового справочника.

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

Программная регистрация изменений в расширении

Если мы добавили объект в состав плана обмена через расширение, нам может потребоваться программно управлять регистрацией изменений. Посмотрим на пример кода, который можно разместить, например, в модуле объекта документа, созданного в расширении:


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Проверим, не является ли запись загрузкой обмена
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Получим узел, для которого нужно зарегистрировать изменения
    УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Узел для филиала");
    
    Если Не УзелОбмена.Пустая() Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, ЭтотОбъект.Ссылка);
    КонецЕсли;
КонецПроцедуры

Альтернативные способы организации обмена без использования Планов обмена

Если архитектурное ограничение на создание нового плана обмена является критическим, а заимствование стандартных планов (например, СинхронизацияДанныхЧерезУниверсальныйФормат) перегружает систему, рассмотрим альтернативные варианты реализации обмена внутри расширения.

Вариант 1: Использование регистра сведений как очереди изменений.
Мы можем создать в расширении непериодический регистр сведений ОчередьОбмена_Расш. В нем будем хранить ссылки на измененные объекты. При записи любого объекта (через расширение метода ПередЗаписью или ПриЗаписи) мы добавляем запись в этот регистр. Внешняя обработка или фоновое задание будет считывать эти записи, передавать данные в другую базу и очищать регистр.

Вариант 2: HTTP-сервисы в расширении.
Платформа позволяет создавать полноценные HTTP-сервисы внутри расширений. Это отличный способ организовать обмен данными в реальном времени (Online). Мы можем описать методы GET или POST для передачи данных в формате JSON или XML.

Разберем пример простого метода HTTP-сервиса в расширении для получения данных о новом объекте:


Функция ПолучитьДанныеОбъекта(Запрос)
    ИмяОбъекта = Запрос.ПараметрыURL.Получить("Имя");
    // Логика поиска и сериализации данных в JSON
    Результат = Новый Структура("Статус", "Успешно");
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(СформироватьJSON(Результат));
    Возврат Ответ;
КонецФункции

Резюме и рекомендации

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

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

← На главную