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