При реализации механизмов обмена данными разработчики часто сталкиваются со следующей задачей: необходимо выгрузить определенные документы (например, ЧекККМ) из локальной базы-источника в центральную базу-приемник, а затем удалить их из источника для экономии места, сохранив при этом объекты в приемнике. При этом возникает две ключевые технические проблемы, которые мы подробно разберем:
УдалениеОбъекта, в результате чего при следующем сеансе обмена эти же документы будут удалены и в базе-приемнике.Рассмотрим, как правильно решить обе эти проблемы с помощью штатных механизмов платформы 1С:Предприятие и инструмента «1С:Конвертация данных».
Проанализируем типовую ошибку: попытку удалить объект в обработчиках правил конвертации данных (например, «После выгрузки объекта» или «После обработки правила выгрузки данных»). Выполняя прямое удаление на этапе формирования файла, мы создаем риск безвозвратной потери информации. Если файл обмена будет поврежден при передаче, возникнет ошибка структуры XML или сбой при проведении в базе-приемнике, в источнике данных уже не останется.
Для безопасного удаления требуется подтверждение факта успешного приема данных.
Выясним, как предотвратить удаление объектов в приемнике, если они были стерты в источнике. Для этого переопределим стандартную логику выгрузки изменений в модуле соответствующего плана обмена. В зависимости от типа узла используются процедуры ПриОтправкеДанныхГлавному или ПриОтправкеДанныхПодчиненному.
Посмотрим на пример кода, позволяющий перехватить регистрацию удаления и отменить отправку информации в узел:
Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента) Экспорт
// Проверяем тип отправляемого элемента
Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") Тогда
// Проверяем, относится ли удаление к нужному типу метаданных
Если ЭлементДанных.Ссылка.Метаданные() = Метаданные.Документы.ЧекККМ Тогда
// Значение Удалить исключает элемент из выгрузки и снимает регистрацию изменения
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разберем значения перечисления ОтправкаЭлементаДанных, которые можно присвоить параметру ОтправкаЭлемента:
ОтправкаЭлементаДанных.Удалить — отменяет запись элемента в сообщение обмена и одновременно снимает его с регистрации для данного узла. Это идеальный вариант: удаление не попадет в файл, и обмен «забудет» о нем.ОтправкаЭлементаДанных.Игнорировать — пропускает запись в текущее сообщение, но оставляет регистрацию активной для последующих сеансов.Также при программном удалении документов в источнике можно сразу очистить регистрацию изменений средствами встроенного языка без ожидания следующего обмена:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ДокументСсылка);
Чтобы гарантировать удаление данных только после их фактической загрузки в приемник, организуем квитирование сеансов обмена. Разберем по шагам алгоритм безопасного удаления:
ПриПолученииКвитанции считывается номер успешно принятого пакета, из регистра извлекается список документов и выполняется их удаление.Если специфика инфраструктуры позволяет организовать прямое взаимодействие между базами, самым надежным решением является переход на синхронный обмен:
200 OK с подтверждением.В типовых конфигурациях 1С (таких как «1С:Розница», «1С:Управление торговлей», «1С:ERP») не принято передавать каждый отдельный ЧекККМ в центральную информационную базу. Рекомендуется использовать проверенный архитектурный паттерн:
ОтчетОРозничныхПродажах.ОтчетОРозничныхПродажах, содержащий суммарные данные по проданным товарам и выручке.