В процессе интеграции конфигураций 1С через правила обмена «Конвертация данных 2.1» часто встречается типовая задача: документы должны попадать в бухгалтерскую базу только при взведенном реквизите ОтражатьВБухгалтерскомУчете (или флаге БУ). Однако на практике пользователи нередко снимают данный флаг уже после того, как документ был успешно выгружен и проведен в базе-приемнике. В результате очередного обмена в базе-приемнике такой документ остается без изменений, создавая расхождения между управленческим и регламентированным учетом.
Разберем подробнее, почему стандартный отбор в источнике приводит к зависанию данных, как правильно скорректировать логику правил обмена и каких подводных камней платформы 1С следует избегать при программной установке пометки на удаление.
Проанализируем типовую ошибку при настройке правил выгрузки данных (ПВД) или правил конвертации объектов (ПКО). Если в обработчике ПередВыгрузкой установить условие с проверкой флага и применить команду Отказ = Истина, то при снятии признака БУ документ просто не включается в файл выгрузки. Планы обмена при этом регистрируют факт изменения объекта, но после передачи пакета и получения квитанции регистрация снимается. База-приемник вообще не получает никаких сведений об этом документе и не может узнать, что он больше не должен числиться в учете.
Следовательно, для синхронизации статуса документ обязательно должен быть передан в базу-приемник, где обработчик загрузки примет решение о его дальнейшей судьбе.
Разберем по шагам базовую схему реализации:
Посмотрим на пример частой ошибки начинающих разработчиков. Нередко в обработчике ПриЗагрузке пытаются написать следующий код:
// ОШИБОЧНЫЙ ПОДХОД
Если Не Объект.ОтражатьВБухгалтерскомУчете Тогда
Объект.ПометкаУдаления = Истина;
Отказ = Истина; // Запись будет отменена!
КонецЕсли;
Выясним причину, почему этот код не сработает: в механизмах КД 2.1 взведение флага Отказ = Истина в событии ПриЗагрузке полностью прерывает дальнейшие стандартные действия универсальной обработки загрузки. Платформа просто отменяет штатную запись объекта в базу данных. В результате значение Объект.ПометкаУдаления = Истина останется только в оперативной памяти и не сохранится в таблицах информационной базы.
Чтобы пометка на удаление корректно зафиксировалась, рассмотрим два правильных варианта реализации в обработчике ПриЗагрузке.
Вариант 1. Штатная запись через механизмы КД:
Мы модифицируем свойства объекта и позволяем КД штатно вызвать процедуру записи объекта.
Если Не Объект.ОтражатьВБухгалтерскомУчете Тогда
// Если объект уже записан в базе (не новый)
Если Не Объект.ЭтоНовый() Тогда
Объект.ПометкаУдаления = Истина;
// Отказ НЕ устанавливаем, чтобы сработала стандартная запись
Иначе
// Предотвращаем создание нового документа-призрака
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Вариант 2. Явная запись через ссылку и прерывание дальнейшей загрузки:
Этот способ оптимален, если вы не хотите, чтобы при снятии признака БУ перезаписывались остальные реквизиты, табличные части и движения ранее проведенного документа.
Если Не Объект.ОтражатьВБухгалтерскомУчете Тогда
Если Не Объект.ЭтоНовый() Тогда
НайденныйОбъект = Ссылка.ПолучитьОбъект();
Если НайденныйОбъект <> Неопределено Тогда
НайденныйОбъект.УстановитьПометкуУдаления(Истина);
КонецЕсли;
КонецЕсли;
// Прерываем дальнейшую загрузку реквизитов из файла
Отказ = Истина;
КонецЕсли;
Проанализируем сопутствующий риск: если мы уберем условие на флаг БУ в источнике, то в выгрузку начнут попадать вообще все новые документы, изначально созданные без этого признака. Если база-приемник будет слепо принимать такие объекты, она заполнится новыми, сразу помеченными на удаление документами.
Чтобы избежать замусоривания приемника, необходимо строго проверять признак новизны объекта. Если объект в базе-приемнике не найден по полям поиска (или метод Объект.ЭтоНовый() возвращает Истина), а признак БУ выключен, мы обязаны взвести Отказ = Истина. В таком случае новый лишний объект в базе создан не будет.
Обратим особое внимание на инфраструктуру распределенных или регулярных двусторонних обменов. Если между базами настроена обратная выгрузка документов, то установка пометки удаления в приемнике приведет к тому, что документ зарегистрируется на узле плана обмена для обратной отправки.
В следующем сеансе обмена документ придет в базу-источник с признаком ПометкаУдаления = Истина, и система пометит на удаление исходный рабочий управленческий документ, в котором пользователь просто снял галочку. Чтобы предотвратить эту коллизию, в правилах обратной загрузки в базу-источник необходимо программно блокировать обновление реквизита ПометкаУдаления, если в источнике документ не предназначен для бухгалтерского учета.