Как в Конвертации данных 3.0 запретить перенос контрагентов без ИНН?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 на базе формата EnterpriseData (КД 3.0) нередко возникает задача ограничить перенос нормативно-справочной информации по определенным условиям. Например, требуется запретить выгрузку контрагентов, у которых не заполнен реквизит ИНН.

Разработчики, привыкшие к механизмам Конвертации данных 2.0, часто пытаются установить параметр Отказ = Истина; в обработчике ПриОтправкеДанных соответствующего ПКО (Правила конвертации объекта). Однако в КД 3.0 данный подход не работает: контрагент все равно попадает в выгрузку или возникает ошибка структуры XDTO. Проанализируем архитектуру КД 3.0, выясним причину такого поведения и разберем корректные способы решения задачи.

Почему не работает отказ в обработчиках ПКО?

В архитектуре КД 3.0 обязанности между правилами строго разделены:

  1. ПКО (Правила конвертации объектов) отвечают исключительно за преобразование данных объекта информационной базы в формат XDTO-пакета и обратно. В событии ПриОтправкеДанных отсутствует стандартный параметр Отказ. Попытка прервать исполнение оператором Возврат приводит к тому, что формируется пустой узел XDTO, который не пройдет валидацию схемы.
  2. ПОД (Правила обработки данных) определяют состав выгружаемых данных и правила, по которым эти данные должны конвертироваться. Именно на уровне ПОД принимается решение о том, нужно ли выгружать конкретный объект.

Способ 1. Отключение выгрузки через обработчик ПОД

Разберем основной способ запрета выгрузки контрагента без ИНН непосредственно в правилах конвертации КД 3.0. Для этого перейдем в обработчик события При обработке правила обработки данных для справочника Контрагенты (например, ПОД_Справочник_Контрагенты_Отправка_ПриОбработке).

В этом обработчике доступна коллекция ИспользованиеПКО, через которую мы можем управлять активностью правил для текущего объекта информационной базы (ДанныеИБ). Посмотрим на пример программного кода:


// Проверяем, является ли объект группой
ЭтоГруппа = ДанныеИБ.ЭтоГруппа;

// Проверяем заполнение ИНН для элементов
ИННЗаполнен = ЗначениеЗаполнено(ДанныеИБ.ИНН);

// Управляем выгрузкой через коллекцию ИспользованиеПКО
ИспользованиеПКО.Справочник_КонтрагентыГруппа = ЭтоГруппа;
ИспользованиеПКО.Справочник_Контрагенты = (Не ЭтоГруппа) И ИННЗаполнен;

Если условие ИННЗаполнен вернет значение Ложь, правило конвертации Справочник_Контрагенты отключится, и объект не будет включен в выгружаемое сообщение обмена.

Очистка регистрации на узле плана обмена

Рассмотрим важный нюанс: если объект уже был изменен в базе и зарегистрирован на узле плана обмена, то при простом отключении правила в ПОД он продолжит оставаться на регистрации. В результате при каждом следующем сеансе синхронизации система будет снова пытаться его обработать.

Чтобы избежать лишней нагрузки, снимем объект с регистрации прямо в обработчике ПОД, если он не прошел проверку по ИНН:


Если Не ЭтоГруппа И Не ИННЗаполнен Тогда
    ИспользованиеПКО.Справочник_Контрагенты = Ложь;
    ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ДанныеИБ.Ссылка);
КонецЕсли;

Способ 2. Фильтрация на уровне Правил регистрации объектов (ПРО)

Наиболее производительный и архитектурно верный вариант — вовсе не регистрировать контрагентов без ИНН на плане обмена. Это настраивается в модуле правил регистрации объектов (ПРО) конфигурации.

В обработчике регистрации справочника Контрагенты перед записью изменений проверяем условие:


Если Не Объект.ЭтоГруппа И Не ЗначениеЗаполнено(Объект.ИНН) Тогда
    Отказ = Истина;
КонецЕсли;

При таком подходе контрагент без ИНН даже не попадет в очередь на выгрузку, что экономит ресурсы сервера при формировании пакета обмена.

Особый случай: выгрузка контрагента по ссылке из документов

Разберем частую проблему: контрагент успешно отсекается в ПОД справочника, но все равно переносится в приемник. Это происходит тогда, когда в текущем сеансе обмена выгружается документ (например, РеализацияТоваровУслуг или ПоступлениеБезналичныхДС), в котором выбран данный контрагент.

Когда объект выгружается по ссылке из реквизита документа, платформа вызывает соответствующее ПКО напрямую, минуя ПОД справочника. Чтобы исключить такую ситуацию, проанализируем два варианта решения:

  1. Запретить выгрузку самого документа в ПОД: если в шапке документа указан контрагент с незаполненным ИНН, отключаем выгрузку документа через ИспользованиеПКО.<ИмяПКОДокумента> = Ложь;.
  2. Подменять контрагента в ПКО документа: в событии ПриОтправкеДанных конвертации документа подставлять предопределенного контрагента (например, служебного контрагента «Розничный покупатель»), если у исходного контрагента не заполнен ИНН.

Как зафиксировать предупреждение при фоновом обмене?

Стандартная процедура Сообщить() или вызов ОбщегоНазначенияКлиентСервер.СообщитьПользователю() не покажут окно с ошибкой, так как регламентная синхронизация выполняется в фоновом задании на сервере без интерактивного контекста пользователя.

Для оповещения пользователей и администраторов применим следующие подходы:

  1. Запись в журнал регистрации:
    
    ТекстСообщения = СтрШаблон("Контрагент %1 (код %2) пропущен при выгрузке: не заполнен ИНН.", 
        ДанныеИБ.Наименование, 
        ДанныеИБ.Код);
    
    ЗаписьЖурналаРегистрации(
        "Синхронизация данных",
        УровеньЖурналаРегистрации.Предупреждение,
        ДанныеИБ.Метаданные(),
        ДанныеИБ.Ссылка,
        ТекстСообщения
    );
    
  2. Использование подсистемы предупреждений БСП: в типовых решениях ошибки синхронизации фиксируются в специализированном регистре сведений ПредупрежденияПриСинхронизацииДанных с помощью вызовов процедур общего модуля ОбменДаннымиСервер или ОбменДаннымиXDTOСервер. Записанные предупреждения отображаются ответственным лицам в окне «Предупреждения при синхронизации данных».
← На главную