Рассмотрим ситуацию, с которой иногда сталкиваются при эксплуатации распределенных информационных баз (РИБ) или настроенных обменов по правилам конвертации. Имеется стабильно работающий годами обмен, например, между центральной базой «1С:Управление торговлей 10.3» и множеством периферийных узлов «1С:Розница 2.2». Внезапно выясняется, что несколько узлов Розницы начали «перебивать» друг другу документы при выгрузке в центральную базу.
Проанализируем ситуацию глубже: открыв регистр сведений СоответствиеОбъектовДляОбмена (или аналогичный регистр публичных идентификаторов), мы обнаруживаем, что документам, созданным в разных периферийных базах, присвоены абсолютно одинаковые идентификаторы (GUID). Из-за этого при загрузке пакета данных система воспринимает их как один и тот же объект и просто перезаписывает данные.
Разберем по шагам, как работает механизм сопоставления, почему возникают такие конфликты и как их гарантированно устранить.
Регистр сведений СоответствиеОбъектовДляОбмена необходим для связи объектов, которые были созданы независимо в разных информационных базах. В каждой базе документ имеет свой уникальный внутренний GUID платформы. Чтобы при обмене система понимала, что «Заказ клиента №1» из базы А — это тот же самый заказ, что и в базе Б, используются публичные идентификаторы или таблицы соответствий.
Алгоритм при загрузке работает так:
Если из-за какой-то ошибки два разных документа из узла 1 и узла 2 получают одинаковый идентификатор в этом регистре, центральная база загрузит первый документ, а когда придет пакет из второго узла, система найдет этот же документ по ID и перезапишет его данными из второго узла.
Выясним причину, по которой могут формироваться одинаковые идентификаторы. Как правило, сама платформа 1С генерирует GUID абсолютно уникальными, и шанс их естественного совпадения равен нулю. Проблема всегда носит программный или административный характер.
УстановитьУникальныйИдентификатор().Посмотрим на практические шаги по устранению этой проблемы. Просто очистить регистр в одной базе недостаточно — при следующем обмене дубли прилетят снова.
Сначала нужно доказать, что проблема исходит из узла отправки. Выгрузите проблемный документ в файл с помощью стандартной обработки «Универсальный обмен данными в формате XML».
Откройте полученный XML-файл в текстовом редакторе и найдите тег с УИД документа (обычно это Ссылка или атрибут УникальныйИдентификатор). Сделайте то же самое во второй проблемной базе. Если GUID в файлах совпадают — проблема на 100% в правилах выгрузки или префиксах на стороне Розницы.
Проанализируем правила конвертации объектов. Откройте правила обмена в конфигурации «Конвертация данных 2.0». Найдите проблемные документы. Проверьте вкладку «События» у Правил Конвертации Объектов (ПКО). Ищите подобный код:
// Пример потенциально опасного кода в правилах выгрузки
СтрокаУИД = ПолучитьУИДПоНомеру(Источник.Номер);
УстановитьУникальныйИдентификатор(СтрокаУИД);
Если такой код есть, и он опирается на номер документа, вам необходимо срочно проверить уникальность префиксов узлов РИБ в настройках Розницы.
Чтобы разорвать ошибочные связи, необходимо выполнить полную очистку. Разберем порядок действий:
СоответствиеОбъектовДляОбмена (можно удалить записи только для проблемных узлов и типов документов, чтобы не гонять весь объем данных заново).Важное замечание: При эксплуатации обменов, написанных с использованием правил конвертации, никогда не полагайтесь на ручную нумерацию документов без жесткого контроля префиксов информационных баз. Ошибка платформы в генерации неуникальных GUID исключена, поэтому всегда ищите «шаловливые ручки», которые вмешались в логику работы правил обмена.