При настройке одностороннего обмена между базами 1С с помощью правил, созданных в Конвертации данных 2.0 (КД 2.0), часто возникает необходимость защитить отредактированные документы в базе-приемнике от случайного перезаписывания при повторной выгрузке из источника.
Типичный сценарий: в документе приемника пользователь устанавливает пользовательский флажок (например, НеЗамещать). Если документ уже загружен и скорректирован вручную, при последующих обменах данные из источника не должны перезаписывать документ приемника, даже если в базе-источнике документ изменили, сняли с проведения или пометили на удаление.
Разберем, почему стандартные попытки установить флаг НеЗамещатьОбъект = Истина в обработчике Перед загрузкой не блокируют изменения статусов проведения и пометки на удаление, и как правильно решить эту задачу.
Проанализируем порядок выполнения обработчиков в КД 2.0 при загрузке данных:
Объект ещё не содержит найденную в БД ссылку с ее актуальными реквизитами. Попытка обратиться к реквизиту Объект.НеЗамещать приводит либо к ошибке, либо к обращению к еще не заполненному объекту.ОбъектНайден (значение Истина или Ложь).Если пытаться взводить НеЗамещатьОбъект = Истина в событиях, выполняющихся до поиска объекта, платформа не блокирует сопоставление системных полей (таких как Проведен и ПометкаУдаления), из-за чего измененный или снятый с проведения документ в источнике меняет свой статус и в приемнике.
Для корректного запрета перезаписи документов и их системных статусов откроем соответствующее Правило Конвертации Объектов (ПКО) в КД 2.0 и перенесем логику в обработчик При загрузке.
Рассмотрим пример кода для обработчика При загрузке:
НеЗамещатьОбъект = ОбъектНайден И Объект.НеЗамещать;
Разобьем этот код по шагам:
ОбъектНайден принимает значение Истина, если документ уже существует в базе-приемнике.Объект.НеЗамещать непосредственно из базы приемника.НеЗамещать установлен в значение Истина, свойству НеЗамещатьОбъект присваивается Истина, что полностью блокирует перезапись документа из источника.В зависимости от архитектуры обмена и требований к безопасности данных можно использовать дополнительные механизмы защиты:
Если требуется полностью исключить любые манипуляции с найденным объектом (включая регистрацию изменений или проход по табличным частям), можно выставить отказ от загрузки объекта:
Если ОбъектНайден И Объект.НеЗамещать Тогда
Отказ = Истина;
КонецЕсли;
В обработчике ПослеПоиска аналогом является проверка ссылки:
Если ЗначениеЗаполнено(СсылкаНаНайденныйОбъект) Тогда
Если СсылкаНаНайденныйОбъект.НеЗамещать Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Если правила обмена часто меняются или обновляются, надежным решением будет вынос логики запрета из КД 2.0 напрямую в конфигурацию-приемник. Для этого создается подписка на событие ПередЗаписью соответствующего документа в приемнике:
Если ОбменДанными.Загрузка Тогда
Если Не Источник.ЭтоНовый() И Источник.Ссылка.НеЗамещать Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Данный код проверяет флаг ОбменДанными.Загрузка. Если запись инициирована фоновым или интерактивным обменом, а в существующей ссылке документа установлен флажок защиты, операция записи блокируется платформой на 100% независимо от настроек правил конвертации.