При организации обмена данными между двумя идентичными конфигурациями 1С специалисты часто сталкиваются с неприятной проблемой: после очередной синхронизации справочник Валюты (а также другие справочники, такие как ЕдиницыИзмерения, ВидыНачислений и т.д.) начинает дублироваться. В базе-приемнике появляются две абсолютно одинаковые записи, например, два «Российских рубля» или два «Доллара США» с идентичными кодами и наименованиями.
Простое удаление дубликатов штатными средствами помогает лишь временно — до следующего сеанса обмена. В этой статье мы подробно разберем, почему возникает эта проблема, как правильно её локализовать и какие существуют системные методы её окончательного решения.
Для того чтобы понять природу проблемы, заглянем во внутреннее устройство платформы 1С:Предприятие. Каждый ссылочный объект в системе (будь то документ, элемент справочника или бизнес-процесс) обладает уникальным идентификатором — GUID (UUID). Это 128-битное число, которое выглядит примерно так: 123e4567-e89b-12d3-a456-426614174000.
Рассмотрим стандартный сценарий:
Валюты и вручную создал элемент «USD» (Доллар США). Платформа автоматически присвоила ему случайный GUID-1.Ниже мы проанализируем четыре основных метода решения этой проблемы, от быстрого исправления «здесь и сейчас» до глубокой системной настройки правил синхронизации.
Если дубликаты уже созданы, их необходимо правильно объединить, перенаправив все движения документов на «правильный» элемент, а «неправильный» — удалить.
Рассмотрим этот процесс по шагам:
Валюты.Важное предупреждение: этот шаг решает проблему только в текущий момент. Если не выполнить шаги, описанные ниже, при следующем обмене дубликат валюты появится снова!
В современных конфигурациях 1С, использующих Библиотеку стандартных подсистем (БСП), информация о связях между объектами разных баз хранится в специальных регистрах сведений. Если вы объединили дубликаты ручным способом, эти связи могут нарушиться.
Проанализируем работу с ключевыми регистрами:
РегистрСведений.СоответствияОбъектовИнформационныхБаз — используется в традиционных планах обмена.РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов — используется при интеграции через EnterpriseData.Когда вы удалили дубликат валюты, запись в этих регистрах может начать ссылаться на несуществующий объект (в поле «Ссылка» появится надпись <Объект не найден>). При очередном обмене это вызовет либо сбой синхронизации, либо повторную генерацию дубля.
Чтобы исправить это, перейдем в меню «Функции для технического специалиста» (или «Все функции»), найдем указанные регистры, отфильтруем записи по справочнику Валюты, найдем записи с «битыми» ссылками и вручную переустановим в них правильную ссылку на оставшуюся в базе валюту.
Если вы используете обмены, настроенные через конфигурацию «Конвертация данных 2.1» (или КД 3.0), самым надежным и системным решением будет изменение правил поиска объектов.
Выясним, как настроить правила, чтобы сопоставление происходило не по GUID, а по ключевым полям:
Валюты.Искать объект по внутреннему идентификатору (Искать по УИД).Код (цифровой код валюты, например, 643) и СимвольныйКод (например, RUB) установим флаг «Поиск».Теперь при обмене система сначала попытается найти валюту по ее символьному или цифровому коду. Если в базе-приемнике уже есть валюта с кодом «643», система сопоставит ее с пришедшей из источника и не будет создавать новый элемент, даже если их GUID различаются.
В некоторых случаях (например, когда правила обмена типовые и их изменение крайне нежелательно) единственным выходом становится физическое приравнивание GUID элементов в обеих базах. Это гарантирует бесперебойную работу стандартных планов обмена.
Поскольку напрямую изменить GUID существующего объекта через стандартный интерфейс или простым присвоением реквизита в 1С нельзя, программисты используют метод программного воссоздания элемента с заданным идентификатором.
Рассмотрим пример кода, который решает эту задачу. Мы берем GUID валюты из базы-источника, удаляем «неправильный» элемент в приемнике и создаем новый с правильным GUID:
// Пример программного создания элемента справочника с фиксированным GUID
УИД_Источника = Новый УникальныйИдентификатор("d84d1bc4-3b47-11e8-80e3-00155d011f01"); // GUID "USD" из первой базы
СсылкаПриемника = Справочники.Валюты.ПолучитьСсылка(УИД_Источника);
// Проверим, нет ли уже объекта с таким идентификатором в приемнике
ОбъектПриемник = СсылкаПриемника.ПолучитьОбъект();
Если ОбъектПриемник = Неопределено Тогда
// Создаем новый элемент справочника и принудительно назначаем ему нужный GUID
НовыйЭлемент = Справочники.Валюты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(СсылкаПриемника);
// Заполняем реквизиты элемента
НовыйЭлемент.Код = "840";
НовыйЭлемент.СимвольныйКод = "USD";
НовыйЭлемент.Наименование = "Доллар США";
Попытка
НовыйЭлемент.Записать();
Сообщить("Элемент успешно создан с требуемым GUID!");
Исключение
Сообщить("Ошибка записи элемента: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
После выполнения данного скрипта в базе-приемнике появится элемент справочника Валюты, чей GUID будет абсолютно идентичен GUID из источника. При обмене сопоставление отработает идеально.
Подводя итоги, дадим важный совет по администрированию баз данных. Практически все дубли в системных справочниках возникают из-за ручного ввода данных пользователями. Чтобы исключить человеческий фактор:
Валюты вручную («текстовым вводом»).