Как в КД 2.1 пометить документ на удаление в приемнике после снятия признака выгрузки в источнике

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

В процессе интеграции конфигураций 1С через правила обмена «Конвертация данных 2.1» часто встречается типовая задача: документы должны попадать в бухгалтерскую базу только при взведенном реквизите ОтражатьВБухгалтерскомУчете (или флаге БУ). Однако на практике пользователи нередко снимают данный флаг уже после того, как документ был успешно выгружен и проведен в базе-приемнике. В результате очередного обмена в базе-приемнике такой документ остается без изменений, создавая расхождения между управленческим и регламентированным учетом.

Разберем подробнее, почему стандартный отбор в источнике приводит к зависанию данных, как правильно скорректировать логику правил обмена и каких подводных камней платформы 1С следует избегать при программной установке пометки на удаление.

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

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

Следовательно, для синхронизации статуса документ обязательно должен быть передан в базу-приемник, где обработчик загрузки примет решение о его дальнейшей судьбе.

Алгоритм решения через обработчик ПриЗагрузке

Разберем по шагам базовую схему реализации:

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

Критическая особенность параметра Отказ в обработчике ПриЗагрузке

Посмотрим на пример частой ошибки начинающих разработчиков. Нередко в обработчике ПриЗагрузке пытаются написать следующий код:


// ОШИБОЧНЫЙ ПОДХОД
Если Не Объект.ОтражатьВБухгалтерскомУчете Тогда
    Объект.ПометкаУдаления = Истина;
    Отказ = Истина; // Запись будет отменена!
КонецЕсли;

Выясним причину, почему этот код не сработает: в механизмах КД 2.1 взведение флага Отказ = Истина в событии ПриЗагрузке полностью прерывает дальнейшие стандартные действия универсальной обработки загрузки. Платформа просто отменяет штатную запись объекта в базу данных. В результате значение Объект.ПометкаУдаления = Истина останется только в оперативной памяти и не сохранится в таблицах информационной базы.

Чтобы пометка на удаление корректно зафиксировалась, рассмотрим два правильных варианта реализации в обработчике ПриЗагрузке.

Вариант 1. Штатная запись через механизмы КД:

Мы модифицируем свойства объекта и позволяем КД штатно вызвать процедуру записи объекта.


Если Не Объект.ОтражатьВБухгалтерскомУчете Тогда
    // Если объект уже записан в базе (не новый)
    Если Не Объект.ЭтоНовый() Тогда
        Объект.ПометкаУдаления = Истина;
        // Отказ НЕ устанавливаем, чтобы сработала стандартная запись
    Иначе
        // Предотвращаем создание нового документа-призрака
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Вариант 2. Явная запись через ссылку и прерывание дальнейшей загрузки:

Этот способ оптимален, если вы не хотите, чтобы при снятии признака БУ перезаписывались остальные реквизиты, табличные части и движения ранее проведенного документа.


Если Не Объект.ОтражатьВБухгалтерскомУчете Тогда
    Если Не Объект.ЭтоНовый() Тогда
        НайденныйОбъект = Ссылка.ПолучитьОбъект();
        Если НайденныйОбъект <> Неопределено Тогда
            НайденныйОбъект.УстановитьПометкуУдаления(Истина);
        КонецЕсли;
    КонецЕсли;
    // Прерываем дальнейшую загрузку реквизитов из файла
    Отказ = Истина;
КонецЕсли;

Защита от создания документов-призраков в приемнике

Проанализируем сопутствующий риск: если мы уберем условие на флаг БУ в источнике, то в выгрузку начнут попадать вообще все новые документы, изначально созданные без этого признака. Если база-приемник будет слепо принимать такие объекты, она заполнится новыми, сразу помеченными на удаление документами.

Чтобы избежать замусоривания приемника, необходимо строго проверять признак новизны объекта. Если объект в базе-приемнике не найден по полям поиска (или метод Объект.ЭтоНовый() возвращает Истина), а признак БУ выключен, мы обязаны взвести Отказ = Истина. В таком случае новый лишний объект в базе создан не будет.

Опасность зацикливания при двустороннем обмене

Обратим особое внимание на инфраструктуру распределенных или регулярных двусторонних обменов. Если между базами настроена обратная выгрузка документов, то установка пометки удаления в приемнике приведет к тому, что документ зарегистрируется на узле плана обмена для обратной отправки.

В следующем сеансе обмена документ придет в базу-источник с признаком ПометкаУдаления = Истина, и система пометит на удаление исходный рабочий управленческий документ, в котором пользователь просто снял галочку. Чтобы предотвратить эту коллизию, в правилах обратной загрузки в базу-источник необходимо программно блокировать обновление реквизита ПометкаУдаления, если в источнике документ не предназначен для бухгалтерского учета.

← На главную