При работе с механизмом расширений в конфигурации «1С:Предприятие 8.3» разработчики часто сталкиваются с ситуацией, когда при попытке добавить новый План обмена кнопка создания объекта в дереве метаданных расширения оказывается неактивной (серой). Это вызывает недоумение, особенно когда другие объекты, такие как справочники или документы, добавляются без проблем. В этой статье мы подробно разберем причины такого поведения платформы, проанализируем возможности заимствования и выясним, как правильно организовать обмен данными, не изменяя основную конфигурацию.
Разберем ситуацию с точки зрения архитектуры. Платформа 1С накладывает жесткое ограничение на создание определенных типов объектов внутри расширений. К ним относятся и Планы обмена. В отличие от прикладных объектов (справочников, документов, регистров), планы обмена являются фундаментальными элементами, определяющими топологию распределенной базы данных и правила миграции данных на уровне ядра платформы.
Даже в самых современных версиях платформы (8.3.24, 8.3.25 и выше) невозможно нажать кнопку «Добавить» в ветке планов обмена внутри расширения. Платформа просто не позволяет создавать «с нуля» новый объект этого типа в слое расширения. Однако это не означает, что мы не можем работать с механизмами обмена. Рассмотрим подробнее доступные нам инструменты.
Если нам необходимо внести изменения в логику работы обмена, мы можем воспользоваться механизмом заимствования. Рассмотрим, как это сделать по шагам:
Проанализируем, что именно мы можем изменять в заимствованном плане обмена:
&Перед, &После или &Вместо для изменения логики регистрации изменений или формирования сообщения обмена.Начиная с версии платформы 8.3.12, разработчики получили мощный инструмент для работы в РИБ. Выясним, какие свойства за это отвечают. В плане обмена, который находится в основной конфигурации, появилось свойство ВключатьРасширенияКонфигурации. Если этот флаг установлен, то при обмене данными между узлами конфигурация расширения будет автоматически передаваться в подчиненные узлы.
Для самого расширения также реализованы важные свойства:
ИспользуетсяВРаспределеннойИнформационнойБазе — определяет участие объектов расширения в механизме РИБ.ГлавныйУзел — позволяет программно определять настройки обмена для конкретного расширения.Часто задача стоит так: «Я создал новый справочник в расширении и хочу, чтобы он участвовал в обмене». Поскольку создать свой план обмена нельзя, мы должны использовать существующий. Рассмотрим подробнее, как включить новые объекты в Состав плана обмена.
Для этого необходимо выполнить следующие действия:
НовыйСправочник_Расш) непосредственно в расширении.Важное замечание: такая возможность полноценно поддерживается в режиме совместимости платформы не ниже 8.3.15. В этом случае расширение «дописывает» свои объекты в список состава плана обмена основной конфигурации, не повреждая его целостность.
Если мы добавили объект в состав плана обмена через расширение, нам может потребоваться программно управлять регистрацией изменений. Посмотрим на пример кода, который можно разместить, например, в модуле объекта документа, созданного в расширении:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверим, не является ли запись загрузкой обмена
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Получим узел, для которого нужно зарегистрировать изменения
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Узел для филиала");
Если Не УзелОбмена.Пустая() Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, ЭтотОбъект.Ссылка);
КонецЕсли;
КонецПроцедуры
Если архитектурное ограничение на создание нового плана обмена является критическим, а заимствование стандартных планов (например, СинхронизацияДанныхЧерезУниверсальныйФормат) перегружает систему, рассмотрим альтернативные варианты реализации обмена внутри расширения.
Вариант 1: Использование регистра сведений как очереди изменений.
Мы можем создать в расширении непериодический регистр сведений ОчередьОбмена_Расш. В нем будем хранить ссылки на измененные объекты. При записи любого объекта (через расширение метода ПередЗаписью или ПриЗаписи) мы добавляем запись в этот регистр. Внешняя обработка или фоновое задание будет считывать эти записи, передавать данные в другую базу и очищать регистр.
Вариант 2: HTTP-сервисы в расширении.
Платформа позволяет создавать полноценные HTTP-сервисы внутри расширений. Это отличный способ организовать обмен данными в реальном времени (Online). Мы можем описать методы GET или POST для передачи данных в формате JSON или XML.
Разберем пример простого метода HTTP-сервиса в расширении для получения данных о новом объекте:
Функция ПолучитьДанныеОбъекта(Запрос)
ИмяОбъекта = Запрос.ПараметрыURL.Получить("Имя");
// Логика поиска и сериализации данных в JSON
Результат = Новый Структура("Статус", "Успешно");
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СформироватьJSON(Результат));
Возврат Ответ;
КонецФункции
Подводя итог, проанализируем основные выводы:
План обмена в расширении невозможно из-за ограничений платформы.Использование расширений для настройки обмена данными позволяет сохранить конфигурацию на поддержке, что значительно упрощает процесс будущих обновлений системы, при этом обеспечивая необходимую гибкость для бизнес-задач.