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