Как запретить перезапись статусов документа (проведение, пометка на удаление) при обмене в Конвертации данных 2.0?

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

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

Типичный сценарий: в документе приемника пользователь устанавливает пользовательский флажок (например, НеЗамещать). Если документ уже загружен и скорректирован вручную, при последующих обменах данные из источника не должны перезаписывать документ приемника, даже если в базе-источнике документ изменили, сняли с проведения или пометили на удаление.

Разберем, почему стандартные попытки установить флаг НеЗамещатьОбъект = Истина в обработчике Перед загрузкой не блокируют изменения статусов проведения и пометки на удаление, и как правильно решить эту задачу.

Выясним причину проблемы

Проанализируем порядок выполнения обработчиков в КД 2.0 при загрузке данных:

  1. Обработчик "Перед загрузкой": Выполняется в самом начале, когда объект в базе данных приемника ещё не найден и не сопоставлен. В этот момент переменная Объект ещё не содержит найденную в БД ссылку с ее актуальными реквизитами. Попытка обратиться к реквизиту Объект.НеЗамещать приводит либо к ошибке, либо к обращению к еще не заполненному объекту.
  2. Поиск объекта (Поля поиска): Выполняется сопоставление по УИД или указанным реквизитам поиска. На этом этапе платформой устанавливается флаг ОбъектНайден (значение Истина или Ложь).
  3. Обработчик "При загрузке": Вызывается после поиска объекта в базе приемника, но до непосредственной записи новых значений в реквизиты. Именно здесь уже доступен найденный объект из БД, а также результат его поиска.

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

Основное решение: использование обработчика "При загрузке"

Для корректного запрета перезаписи документов и их системных статусов откроем соответствующее Правило Конвертации Объектов (ПКО) в КД 2.0 и перенесем логику в обработчик При загрузке.

Рассмотрим пример кода для обработчика При загрузке:

НеЗамещатьОбъект = ОбъектНайден И Объект.НеЗамещать;

Разобьем этот код по шагам:

  1. Переменная ОбъектНайден принимает значение Истина, если документ уже существует в базе-приемнике.
  2. Если документ найден, происходить чтение свойства Объект.НеЗамещать непосредственно из базы приемника.
  3. Если реквизит НеЗамещать установлен в значение Истина, свойству НеЗамещатьОбъект присваивается Истина, что полностью блокирует перезапись документа из источника.

Альтернативные способы защиты объектов в КД 2.0

В зависимости от архитектуры обмена и требований к безопасности данных можно использовать дополнительные механизмы защиты:

1. Полная отмена загрузки через отказ в "ПослеПоиска" или "При загрузке"

Если требуется полностью исключить любые манипуляции с найденным объектом (включая регистрацию изменений или проход по табличным частям), можно выставить отказ от загрузки объекта:


Если ОбъектНайден И Объект.НеЗамещать Тогда
    Отказ = Истина;
КонецЕсли;

В обработчике ПослеПоиска аналогом является проверка ссылки:


Если ЗначениеЗаполнено(СсылкаНаНайденныйОбъект) Тогда
    Если СсылкаНаНайденныйОбъект.НеЗамещать Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

2. Подписка на событие "ПередЗаписью" в базе-приемнике

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


Если ОбменДанными.Загрузка Тогда
    Если Не Источник.ЭтоНовый() И Источник.Ссылка.НеЗамещать Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Данный код проверяет флаг ОбменДанными.Загрузка. Если запись инициирована фоновым или интерактивным обменом, а в существующей ссылке документа установлен флажок защиты, операция записи блокируется платформой на 100% независимо от настроек правил конвертации.

← На главную