Как работает механизм подтверждения приема данных при обмене между ЗУП 3.1 и Бухгалтерией 3.0?

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

При настройке типовой синхронизации между конфигурациями «Зарплата и управление персоналом 3.1» (ЗУП) и «Бухгалтерия предприятия 3.0» (БП) через файл обмена часто возникает вопрос: как система понимает, что данные уже переданы? Почему при повторной синхронизации программа не выгружает одни и те же документы бесконечно? Разберем подробно внутреннее устройство этого процесса, который в профессиональной среде 1С называется квитированием.

Понятие регистрации изменений и Планов обмена

Прежде чем рассматривать сам процесс передачи файла, проанализируем, как 1С узнает, что объект вообще нужно выгрузить. В каждой конфигурации существуют специальные объекты метаданных — Планы обмена. Рассмотрим их роль: для каждого документа (например, ВедомостьНаВыплатуЗарплаты или ОтражениеЗарплатыВБухучете), включенного в состав плана обмена, система создает скрытую таблицу регистрации изменений.

Разберем три ситуации, когда объект попадает в эту таблицу:

  1. Создание нового объекта: Как только вы записываете новый документ, он автоматически регистрируется к выгрузке.
  2. Изменение существующего объекта: При перепроведении или редактировании записи регистрация обновляется.
  3. Ручная регистрация: Через специальную обработку «Регистрация изменений для обмена данными» программист или администратор может принудительно добавить любой объект в очередь на выгрузку.

Важно понимать: пока запись находится в таблице регистрации, 1С считает, что данные «изменены и не переданы». Но снятие этой записи происходит вовсе не в момент нажатия кнопки «Синхронизировать» в базе-источнике.

Алгоритм «Квитирования» (подтверждения)

Рассмотрим пошагово цикл обмена через файл, чтобы выяснить, в какой момент очищается регистрация. Для корректной работы требуется выполнение «круга» из трех этапов:

Этап 1: Выгрузка из ЗУП. Программа собирает все зарегистрированные объекты, упаковывает их в XML-файл и присваивает этому пакету НомерСообщения (например, №10). В этот момент в таблице регистрации изменений для этих объектов проставляется пометка: «отправлено в сообщении №10». Однако сами записи из таблицы не удаляются.

Этап 2: Загрузка в БП и ответ. Когда вы загружаете этот файл в Бухгалтерию, программа считывает данные. Если загрузка прошла успешно, БП запоминает, что последнее принятое сообщение от ЗУП имеет номер 10. При следующей выгрузке из БП в сторону ЗУП (даже если данных для передачи нет) в заголовке XML-файла будет передана техническая информация: «Я успешно получила твое сообщение №10».

Этап 3: Снятие регистрации в ЗУП. Когда ЗУП принимает файл от БП, она первым первым делом смотрит на номер подтвержденного сообщения. Увидев число 10, ЗУП выполняет команду:

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

Только после этого объекты, у которых номер сообщения был меньше или равен 10, исчезают из таблицы регистрации и больше не выгружаются.

Структура заголовка XML-файла

Проанализируем содержимое самого файла обмена. Если открыть его текстовым редактором, в самом начале можно увидеть блок Header (или его аналог в зависимости от формата EnterpriseData). Нас интересуют два ключевых атрибута:

Посмотрим на пример логики: если ЗУП отправила файл с MessageNo = 50, то регистрация снимется только тогда, когда она получит от БП файл, где в поле ReceivedNo будет стоять число 50 или выше. Это гарантирует, что если файл потеряется или в процессе загрузки произойдет сбой (например, отключится электричество), данные не будут считаться переданными и выгрузятся повторно при следующем сеансе.

Почему регистрация изменений может не сниматься?

Иногда пользователи сталкиваются с тем, что одни и те же документы «гуляют» между базами постоянно. Проанализируем основные причины такой ситуации:

  1. Односторонний обмен: Пользователь регулярно выгружает данные из ЗУП в БП, но никогда не запускает процесс синхронизации в ЗУП для приема «квитанции» от БП. В этом случае ЗУП никогда не узнает об успешном приеме, и файл обмена будет расти в геометрической прогрессии.
  2. Ошибки при загрузке: Если в базе-приемнике документ не загрузился из-за ошибки (например, не заполнено обязательное поле или сработал запрет редактирования), транзакция загрузки может откатиться. БП не подтвердит получение этого номера сообщения.
  3. Использование COM-соединения: При прямом подключении одной базы к другой квитирование происходит мгновенно в рамках одного сеанса. Если вы перешли с COM-соединения на файловый обмен, помните, что теперь требуется «двойной прогон» для очистки очереди.

Как проверить состояние регистрации программно?

Если вы хотите убедиться, какие именно объекты ожидают отправки и какой номер сообщения им присвоен, можно воспользоваться запросом к виртуальной таблице изменений. Рассмотрим пример для документа «Начисление зарплаты»:


ВЫБРАТЬ
    Изменения.Ссылка КАК Документ,
    Изменения.НомерСообщения КАК НомерПакета
ИЗ
    Документ.НачислениеЗарплаты.Изменения КАК Изменения
ГДЕ
    Изменения.Узел = &УзелОбмена

В колонке НомерСообщения вы увидите либо NULL (объект зарегистрирован, но еще ни разу не включался в файл), либо конкретное число (объект уже был отправлен, но база-источник еще не получила подтверждение о его доставке).

Особенности синхронизации через EnterpriseData

В современных версиях ЗУП 3.1 и БП 3.0 используется универсальный формат EnterpriseData. Механизм квитирования здесь работает по тем же принципам Планов обмена, но сама структура файла более сложная. Выясним важный нюанс: при обмене через универсальный формат подтверждение об успешном приеме передается даже в том случае, если в базе-приемнике не было создано новых объектов (например, если присланный объект идентичен текущему по версии). Это позволяет «разгружать» таблицы регистрации изменений в источнике, не засоряя базу-приемник лишними записями.

Таким образом, мы выяснили, что обмен в 1С — это всегда двусторонний диалог. База-приемник не просто молча принимает данные, она отправляет «уведомление о вручении», которое является единственным законным основанием для базы-источника очистить свою очередь выгрузки.

← На главную