Как исправить ошибку Значение поля Код не уникально при синхронизации данных в 1С

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

При выполнении синхронизации данных между информационными базами 1С (особенно через универсальный формат Enterprise Data или XDTO) пользователи часто сталкиваются с критической ошибкой: «Значение "..." поля "Код" не уникально». Эта ситуация полностью блокирует обмен, и стандартные средства «Исправления дублей» здесь обычно не помогают. Давайте подробно разберем, почему возникает эта ошибка, где именно искать проблемный объект и как правильно восстановить работу обмена.

Выясняем причину возникновения ошибки

Первое, что сбивает с толку начинающих разработчиков — это формат значения кода. Ошибка сообщает о неуникальности длинной строки вида ce92c30b-5e42-4f99-a7f7-2fe499fd19b8. Проанализируем ситуацию: в современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), именно такие строковые представления уникальных идентификаторов (GUID) используются в качестве Кода для узлов планов обмена.

Рассмотрим наиболее частые причины появления дублей:

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

Почему поиск по справочникам не дает результата

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


&НаСервереБезКонтекста
Функция НайтиЭлементСправочникаНаСервере()
    Идентификатор = Новый УникальныйИдентификатор("ce92c30b-5e42-4f99-a7f7-2fe499fd19b8");
    Для Каждого Спр Из Справочники Цикл
        СсылкаНаЭлемент = Спр.ПолучитьСсылку(Идентификатор);
        Если СсылкаНаЭлемент.ПолучитьОбъект() <> Неопределено Тогда
            Возврат СсылкаНаЭлемент;
        КонецЕсли;
    КонецЦикла;
КонецФункции

Проанализируем этот подход. Метод ПолучитьСсылку(Идентификатор) ищет объект по его внутреннему Binary UUID (ссылке в базе данных). Однако ошибка «Код не уникально» относится к строковому реквизиту Код. Это абсолютно разные поля! Объект может иметь одну ссылку, но в поле Код у него может быть записан GUID другой базы в виде строки. Поэтому искать нужно именно текстовое совпадение в реквизите Код, причем не только в справочниках, но и в планах обмена.

Способ 1. Универсальный поиск по всем метаданным

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


Функция НайтиОбъектПоКодуСтрокой(Знач ИскомыйКод) Экспорт
    Результат = Неопределено;
    МассивМетаданных = Новый Массив;
    МассивМетаданных.Добавить(Справочники);
    МассивМетаданных.Добавить(ПланыОбмена); // Это самое важное место!
    МассивМетаданных.Добавить(ПланыВидовХарактеристик);
    
    Для Каждого Коллекция Из МассивМетаданных Цикл
        Для Каждого Менеджер Из Коллекция Цикл
            // Пытаемся найти объект по коду
            Ссылка = Менеджер.НайтиПоКоду(ИскомыйКод);
            Если НЕ Ссылка.Пустая() Тогда
                Сообщить("Объект найден в: " + Менеджер);
                Возврат Ссылка;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Если этот код найдет элемент в ПланыОбмена, значит, у вас действительно конфликт узлов синхронизации.

Способ 2. Отладка фонового задания синхронизации

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

  1. Запустите 1С в режиме Конфигуратора.
  2. Откройте меню Отладка -> Настройка подключения и установите флажок «Автоматическое подключение фоновых заданий».
  3. В меню Отладка -> Остановка по ошибке установите галочку «Останавливаться по ошибке».
  4. Запустите синхронизацию. Когда отладчик остановится на строке УзелОбменаОбъект.Записать(), проанализируйте переменную УзелОбменаОбъект.

В момент остановки вы увидите в табло тип объекта. Скорее всего, это будет один из узлов Плана обмена (например, СинхронизацияДанныхЧерезУниверсальныйФормат).

Способ 3. Радикальное решение: удаление и пересоздание настройки

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

  1. Удаление настроек: В обеих базах (источнике и приемнике) удалите текущую настройку синхронизации данных.
  2. Очистка узлов: Зайдите в Все функции (Функции для технического специалиста) -> Планы обмена. Найдите соответствующий план обмена и убедитесь, что в нем нет «лишних» узлов, кроме предопределенного ЭтотУзел.
  3. Очистка файлов: Обязательно удалите все файлы обмена из каталога (или очистите содержимое FTP/Email-ящика), чтобы старые сообщения с «неправильными» кодами не мешали новой настройке.
  4. Новая настройка: Создайте синхронизацию заново «с нуля». При первом запуске система сгенерирует новые уникальные коды (GUID) для узлов, и конфликт уникальности исчезнет.

Важные рекомендации при работе с планами обмена

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

Таким образом, мы выяснили, что ошибка уникальности кода при синхронизации — это почти всегда конфликт узлов планов обмена. Тщательный поиск по всем метаданным (включая планы обмена) и последующая перенастройка синхронизации позволяют эффективно решить эту проблему даже начинающему специалисту.

← На главную