Как решить проблему задвоения справочника «Валюты» при обмене между идентичными базами 1С?

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

При организации обмена данными между двумя идентичными конфигурациями 1С специалисты часто сталкиваются с неприятной проблемой: после очередной синхронизации справочник Валюты (а также другие справочники, такие как ЕдиницыИзмерения, ВидыНачислений и т.д.) начинает дублироваться. В базе-приемнике появляются две абсолютно одинаковые записи, например, два «Российских рубля» или два «Доллара США» с идентичными кодами и наименованиями.

Простое удаление дубликатов штатными средствами помогает лишь временно — до следующего сеанса обмена. В этой статье мы подробно разберем, почему возникает эта проблема, как правильно её локализовать и какие существуют системные методы её окончательного решения.

Глубинная причина возникновения дублей: концепция GUID

Для того чтобы понять природу проблемы, заглянем во внутреннее устройство платформы 1С:Предприятие. Каждый ссылочный объект в системе (будь то документ, элемент справочника или бизнес-процесс) обладает уникальным идентификатором — GUID (UUID). Это 128-битное число, которое выглядит примерно так: 123e4567-e89b-12d3-a456-426614174000.

Рассмотрим стандартный сценарий:

  1. В базе-источнике пользователь зашел в справочник Валюты и вручную создал элемент «USD» (Доллар США). Платформа автоматически присвоила ему случайный GUID-1.
  2. В базе-приемнике другой пользователь (или тот же самый) проделал аналогичную операцию: вручную создал «USD». Платформа сгенерировала для него другой случайный GUID-2.
  3. С точки зрения пользователя, элементы абсолютно одинаковы (код 840, наименование «USD»). Но с точки зрения платформы 1С — это два совершенно разных объекта, так как их внутренние идентификаторы не совпадают.
  4. При выполнении обмена система пытается сопоставить пришедший объект по его GUID-1. Не найдя его в базе-приемнике, она послушно создает новую запись с GUID-1. В результате в базе-приемнике у вас оказывается два доллара: один с GUID-1 (пришедший по обмену), другой с GUID-2 (созданный локально).

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

Способ 1. Оперативное слияние дублей и очистка базы

Если дубликаты уже созданы, их необходимо правильно объединить, перенаправив все движения документов на «правильный» элемент, а «неправильный» — удалить.

Рассмотрим этот процесс по шагам:

  1. Откроем обработку «Поиск и замена дублей» (в современных конфигурациях она доступна в разделе «Администрирование» — «Обслуживание» — «Корректировка данных»).
  2. Выберем область поиска: справочник Валюты.
  3. Зададим правила сравнения: по совпадению полей «Код» или «Символьный код».
  4. Запустим поиск. Система сгруппирует похожие элементы.
  5. В качестве «оригинала» (правильного элемента) выберем ту валюту, которая была перенесена из базы-источника (чтобы сохранить соответствие по GUID для будущих обменов).
  6. Нажмем кнопку «Объединить». Обработка заменит ссылки во всех документах и регистрах на выбранный оригинал, после чего пометит дубликат на удаление.
  7. Произведем стандартное удаление помеченных объектов.

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

Способ 2. Корректировка регистров сопоставления БСП

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

Проанализируем работу с ключевыми регистрами:

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

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

Способ 3. Изменение правил обмена в «Конвертации данных»

Если вы используете обмены, настроенные через конфигурацию «Конвертация данных 2.1» (или КД 3.0), самым надежным и системным решением будет изменение правил поиска объектов.

Выясним, как настроить правила, чтобы сопоставление происходило не по GUID, а по ключевым полям:

  1. Откроем правила обмена в конфигурации «Конвертация данных».
  2. Найдем нужное нам **Правило конвертации объектов (ПКО)** для справочника Валюты.
  3. В настройках ПКО перейдем на вкладку «Настройки выполнения» и снимем флаг Искать объект по внутреннему идентификатору (Искать по УИД).
  4. Перейдем в список свойств этого ПКО и для свойств Код (цифровой код валюты, например, 643) и СимвольныйКод (например, RUB) установим флаг «Поиск».
  5. Сохраним правила обмена и загрузим их в наши базы 1С.

Теперь при обмене система сначала попытается найти валюту по ее символьному или цифровому коду. Если в базе-приемнике уже есть валюта с кодом «643», система сопоставит ее с пришедшей из источника и не будет создавать новый элемент, даже если их GUID различаются.

Способ 4. Программное выравнивание GUID в базах

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

Поскольку напрямую изменить GUID существующего объекта через стандартный интерфейс или простым присвоением реквизита в 1С нельзя, программисты используют метод программного воссоздания элемента с заданным идентификатором.

Рассмотрим пример кода, который решает эту задачу. Мы берем GUID валюты из базы-источника, удаляем «неправильный» элемент в приемнике и создаем новый с правильным GUID:


// Пример программного создания элемента справочника с фиксированным GUID
УИД_Источника = Новый УникальныйИдентификатор("d84d1bc4-3b47-11e8-80e3-00155d011f01"); // GUID "USD" из первой базы
СсылкаПриемника = Справочники.Валюты.ПолучитьСсылка(УИД_Источника);

// Проверим, нет ли уже объекта с таким идентификатором в приемнике
ОбъектПриемник = СсылкаПриемника.ПолучитьОбъект();

Если ОбъектПриемник = Неопределено Тогда
    // Создаем новый элемент справочника и принудительно назначаем ему нужный GUID
    НовыйЭлемент = Справочники.Валюты.СоздатьЭлемент();
    НовыйЭлемент.УстановитьСсылкуНового(СсылкаПриемника);
    
    // Заполняем реквизиты элемента
    НовыйЭлемент.Код = "840";
    НовыйЭлемент.СимвольныйКод = "USD";
    НовыйЭлемент.Наименование = "Доллар США";
    
    Попытка
        НовыйЭлемент.Записать();
        Сообщить("Элемент успешно создан с требуемым GUID!");
    Исключение
        Сообщить("Ошибка записи элемента: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

После выполнения данного скрипта в базе-приемнике появится элемент справочника Валюты, чей GUID будет абсолютно идентичен GUID из источника. При обмене сопоставление отработает идеально.

Профилактика проблемы: работа с классификатором

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

← На главную