При организации обмена между двумя идентичными или сильно доработанными базами (например, на базе конфигурации 1C:Бухгалтерия 3.0) штатный механизм Распределенной Информационной Базы (РИБ) подходит не всегда. РИБ накладывает жесткие ограничения на возможность изменения структуры метаданных в подчиненных узлах: конфигурацию базы-приемника нельзя править напрямую, а любые обновления должны приходить строго из центрального узла.
Если требуется сохранить независимость разработки в базах, но при этом переносить только часть документов и справочников с отслеживанием регистрации изменений, разберем возможные архитектурные решения и их практическую реализацию.
Рассмотрим вариант, при котором сохраняется штатный механизм регистрации изменений платформы 1С, но снимаются ограничения на модификацию конфигурации в узлах. Для этого создается новый план обмена (или используется копия типового), у которого отключено специальное свойство.
Авторегистрация в значение Запретить.Такой подход позволяет службам платформы регистрировать изменения конкретных объектов для созданного узла обмена, но при этом базы остаются полностью самостоятельными с точки зрения конфигуратора.
Для переноса данных с использованием регистрационной таблицы собственного плана обмена можно применить обработку УниверсальныйОбменДаннымиXML. Этот вариант удобен тем, что позволяет переносить документы вместе с движениями и точечно управлять выборкой.
Проанализируем пошаговый алгоритм настройки выгрузки по зарегистрированным изменениям:
УниверсальныйОбменДаннымиXML на стороне базы-источника.ПланОбмена.УдалитьРегистрациюИзменений().Выясним, как настроить выборочный перенос объектов, чтобы в базу-приемник попадали не все создаваемые документы, а только соответствующие определенным критериям (например, только проведенные или относящиеся к конкретной организации).
Для реализации логики фильтрации создается подписка на событие ПриЗаписи или ПередЗаписью необходимых объектов. Рассмотрим пример кода подписки для регистрации документа:
Процедура ЗарегистрироватьДокументДляОбменаПриЗаписи(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
УзелОбмена = ПланыОбмена.МойОбменБезРИБ.НайтиПоКоду("ПРИЕМНИК");
Если ЗначениеЗаполнено(УзелОбмена) И Источник.Проведен Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Источник.Ссылка);
КонецЕсли;
КонецПроцедуры
Разберем частый вопрос: как избежать искажения номеров и создания дублей, если обмен идет в одну сторону и база-приемник служит только для забора данных.
Если приемник используется как накопительная база и данные в ней вручную не вводятся, префиксы узлов можно не назначать. Чтобы при загрузке объектов в приемник типовые механизмы БСП не переустанавливали номера и коды, запись должна производиться в специальном режиме обмена.
При использовании флага ОбменДанными.Загрузка = Истина отключена проверка бизнес-логики и программная установка новых номеров, благодаря чему загружаемый объект сохраняет оригинальный номер, код и идентификатор (GUID) из источника:
ОбъектЗагрузки = СсылкаНаОбъект.ПолучитьОбъект();
ОбъектЗагрузки.ОбменДанными.Загрузка = Истина;
ОбъектЗагрузки.Записать();
Чтобы сохранить типовую конфигурацию (например, БП 3.0) на полной поддержке без снятия защиты, все доработки обмена можно вынести в расширение.
Это позволяет безопасно обновлять типовую конфигурацию стандартными релизами, сохраняя всю логику выборочного обмена между базами.