Как работают публичные идентификаторы синхронизируемых объектов (ПИСО) и зачем они нужны?

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

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

Разбираемся в логике ПИСО

Многие начинающие разработчики совершают ошибку, пытаясь реализовать «перекрестные» ссылки. Они думают, что в Базе 1 нужно хранить ссылку на локальный объект и GUID из Базы 2, а в Базе 2 — наоборот. Однако это ведет к путанице и нарушению целостности данных.

Давайте проанализируем, как это работает на самом деле:

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

Пошаговое решение проблемы сопоставления объектов

Чтобы успешно настроить обмен данными, придерживайтесь следующего алгоритма:

Шаг 1. Определение ключа. Выберите атрибут, который будет служить идентификатором. Это может быть уникальный GUID, сгенерированный специально для синхронизации, либо бизнес-ключ (например, ИНН+КПП для контрагента).

Шаг 2. Фиксация в обеих базах. Вы должны программно обеспечить, чтобы для одного и того же физического объекта в Базе 1 и Базе 2 в поле публичного идентификатора было записано идентичное значение.

Шаг 3. Использование механизма ПИСО. Когда система начинает процесс обмена, она обращается к таблице соответствий. Рассмотрим, как выглядит этот процесс в коде (концептуально):


// Псевдокод логики поиска объекта через ПИСО
Функция НайтиОбъектПоИдентификатору(ИдентификаторОбъекта)
    // Система ищет запись, где внешний ключ равен переданному идентификатору
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ СсылкаИЗБазы1 ИЗ РегистрСведений.ПИСО ГДЕ ПубличныйКлюч = &Ключ";
    Запрос.УстановитьПараметр("Ключ", ИдентификаторОбъекта);
    Результат = Запрос.Выполнить().Выгрузить();
    Если Результат.Количество() > 0 Тогда
        Возврат Результат[0].СсылкаИЗБазы1;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
КонецФункции

Почему не нужно искать «магические» ссылки?

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

Когда вы обеспечиваете идентичность ключа в обеих базах, механизм обмена 1С сам подбирает соответствующую ссылку в приемнике. Если вы видите, что GUID совпадают в обеих базах, значит, система уже настроена на использование идентичных ключей. Если же вы столкнулись с проблемой дублирования, значит, где-то в цепочке передается разный идентификатор для одного и того же объекта — поможет обработка удаления дублей и исправления синхронизации.

Рекомендации по отладке

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

Таким образом, суть работы с ПИСО заключается не в поиске «недоступной магии», а в дисциплине поддержания одинаковых внешних идентификаторов для синхронизируемых объектов. Как только вы обеспечите это соответствие, механизм обмена будет работать стабильно и без дублирования данных. Для очистки уже возникших ошибок есть обработка поиска и удаления дублей объектов.

← На главную