Как настроить регистрацию изменений в 1С, чтобы выгруженные объекты не перезаписывались в базе-приемнике?

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

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

Механизм регистрации изменений: основы

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

Рассмотрим основные настройки регистрации, которые упоминались в обсуждении:

Почему объекты перезаписываются повторно? Разбираем механизм квитирования

Одной из главных причин повторной выгрузки уже отправленных данных является отсутствие подтверждения от базы-приемника. Проанализируем, как работает этот процесс, который технически называется квитированием.

Рассмотрим пошагово стандартный цикл обмена:

  1. База-источник (УТ) формирует файл выгрузки. Каждому пакету данных присваивается уникальный номер сообщения (например, №50).
  2. Все объекты, попавшие в этот файл, в таблице регистрации помечаются номером 50, но не удаляются из нее.
  3. База-приемник (БП) загружает файл №50. В ответ она формирует свой файл, в заголовке которого указывает: «Я успешно приняла сообщение №50».
  4. При следующем обмене база-источник сначала читает файл-ответ от приемника. Видя подтверждение для номера 50, она окончательно удаляет записи об этих объектах из своей таблицы регистрации.

Важный вывод: если ваш обмен настроен как односторонний (вы просто копируете файл из УТ в БП и никогда не загружаете ответные файлы из БП в УТ), база-источник никогда не узнает, что данные дошли. Она будет хранить их в очереди вечно и при каждой выгрузке добавлять в новый файл. Для решения проблемы «перезаписи» необходимо организовать двусторонний обмен, даже если данные передаются только в одну сторону — файлы ответов (квитанции) должны возвращаться в источник.

Способ 1: Настройка правил конвертации «Не замещать»

Если механизм подтверждения работает исправно, но объект снова изменили в источнике, он неизбежно попадет в обмен. Чтобы при этом не пострадали данные в приемнике, нужно изменить логику обработки данных на стороне загрузки. Это делается в конфигурации «Конвертация данных 2.1».

Рассмотрим настройку правила конвертации объекта (ПКО):

  1. Найдите нужное ПКО (например, для документа РеализацияТоваровУслуг).
  2. В настройках правила установите флаг «Не замещать существующие объекты в приемнике (а только создавать новые)».

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

Способ 2: Тонкая настройка полей (ПКС)

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

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

Программное управление регистрацией

Выясним, как можно управлять регистрацией программно, чтобы избежать лишних выгрузок. Если мы установили «Авторегистрация — Запретить», мы можем использовать код в подписках на события. Рассмотрим пример кода, который регистрирует изменения только в том случае, если документ проведен:


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

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

Использование обработки «Регистрация изменений»

Для оперативного контроля рекомендуем использовать типовую обработку «Регистрация изменений для обмена данными» (в УТ 10.3 она обычно доступна через меню «Операции» — «Обработки»).

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

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

← На главную