Как удалить выгруженные документы в базе-источнике после их успешной загрузки в приемник?

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

При реализации механизмов обмена данными разработчики часто сталкиваются со следующей задачей: необходимо выгрузить определенные документы (например, ЧекККМ) из локальной базы-источника в центральную базу-приемник, а затем удалить их из источника для экономии места, сохранив при этом объекты в приемнике. При этом возникает две ключевые технические проблемы, которые мы подробно разберем:

  1. Асинхронность файлового обмена: если выгрузка осуществляется через файл, база-источник в момент выгрузки не знает, успешно ли завершится чтение и проведение документов на стороне приемника.
  2. Механизм регистрации изменений: если физически удалить документ в источнике, платформа 1С автоматически зарегистрирует в плане обмена объект УдалениеОбъекта, в результате чего при следующем сеансе обмена эти же документы будут удалены и в базе-приемнике.

Рассмотрим, как правильно решить обе эти проблемы с помощью штатных механизмов платформы 1С:Предприятие и инструмента «1С:Конвертация данных».

Проблема асинхронности: почему нельзя удалять объекты сразу при выгрузке

Проанализируем типовую ошибку: попытку удалить объект в обработчиках правил конвертации данных (например, «После выгрузки объекта» или «После обработки правила выгрузки данных»). Выполняя прямое удаление на этапе формирования файла, мы создаем риск безвозвратной потери информации. Если файл обмена будет поврежден при передаче, возникнет ошибка структуры XML или сбой при проведении в базе-приемнике, в источнике данных уже не останется.

Для безопасного удаления требуется подтверждение факта успешного приема данных.

Решение 1. Подавление передачи удалений через модуль плана обмена

Выясним, как предотвратить удаление объектов в приемнике, если они были стерты в источнике. Для этого переопределим стандартную логику выгрузки изменений в модуле соответствующего плана обмена. В зависимости от типа узла используются процедуры ПриОтправкеДанныхГлавному или ПриОтправкеДанныхПодчиненному.

Посмотрим на пример кода, позволяющий перехватить регистрацию удаления и отменить отправку информации в узел:


Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента) Экспорт 
    // Проверяем тип отправляемого элемента
    Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") Тогда
        // Проверяем, относится ли удаление к нужному типу метаданных
        Если ЭлементДанных.Ссылка.Метаданные() = Метаданные.Документы.ЧекККМ Тогда
            // Значение Удалить исключает элемент из выгрузки и снимает регистрацию изменения
            ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Разберем значения перечисления ОтправкаЭлементаДанных, которые можно присвоить параметру ОтправкаЭлемента:

  1. ОтправкаЭлементаДанных.Удалить — отменяет запись элемента в сообщение обмена и одновременно снимает его с регистрации для данного узла. Это идеальный вариант: удаление не попадет в файл, и обмен «забудет» о нем.
  2. ОтправкаЭлементаДанных.Игнорировать — пропускает запись в текущее сообщение, но оставляет регистрацию активной для последующих сеансов.

Также при программном удалении документов в источнике можно сразу очистить регистрацию изменений средствами встроенного языка без ожидания следующего обмена:

ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, ДокументСсылка);

Решение 2. Двусторонний обмен с подтверждением приема (квитирование)

Чтобы гарантировать удаление данных только после их фактической загрузки в приемник, организуем квитирование сеансов обмена. Разберем по шагам алгоритм безопасного удаления:

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

Решение 3. Использование синхронного обмена через HTTP или Web-сервисы

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

  1. База-источник вызывает метод HTTP-сервиса базы-приемника и передает массив данных по чекам.
  2. База-приемник в рамках единой транзакции создает, заполняет и проводит документы, возвращая HTTP-статус 200 OK с подтверждением.
  3. База-источник, получив подтверждение успешной записи, сразу же удаляет переданные документы и очищает регистрацию изменений.

Архитектурная альтернатива: типовой механизм архивации чеков

В типовых конфигурациях 1С (таких как «1С:Розница», «1С:Управление торговлей», «1С:ERP») не принято передавать каждый отдельный ЧекККМ в центральную информационную базу. Рекомендуется использовать проверенный архитектурный паттерн:

  1. В конце смены кассир выполняет закрытие смены: чеки автоматически сворачиваются в сводный документ ОтчетОРозничныхПродажах.
  2. В центральную базу передается исключительно ОтчетОРозничныхПродажах, содержащий суммарные данные по проданным товарам и выручке.
  3. Для первичных чеков ККМ в кассовой базе запускается регламентная процедура «Архивация чеков ККМ», которая очищает табличные части и движения документов, оставляя только «шапку» для сохранения ссылочной целостности, либо удаляет старые чеки регламентным заданием.
← На главную