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