При развертывании дочерних филиалов, кассовых узлов или создании тестовых сред часто применяется метод прямого копирования существующего файла базы данных .1CD или резервной копии СУБД. Однако при попытке настроить синхронизацию данных между исходной базой и её копией администраторы часто сталкиваются с аппаратным конфликтом платформ. Программа выдает ошибку вида: «Ошибка при вызове метода контекста (Записать) УзелОбменаОбъект.Записать; по причине: Значение "..." поля "Код" не уникально».
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы работы планов обмена 1С и рассмотрим пошаговые практические методы решения проблемы как для рядовых пользователей, так и для программистов.
Для того чтобы понять природу ошибки, рассмотрим архитектуру механизма обмена данными в платформе «1С:Предприятие». В любом плане обмена существует специальный предопределенный элемент — «Этот узел» (в программной среде доступный как ЭтотУзел()). Он указывает на саму текущую информационную базу.
При создании базы данных путем копирования файла .1CD во вновь созданной базе полностью сохраняются все таблицы, включая настройки планов обмена. Таким образом, в дочерней базе узел «Этот узел» имеет абсолютно такой же уникальный идентификатор (GUID) в поле «Код», как и в основной базе.
Когда мы пытаемся настроить синхронизацию (например, через универсальный формат обмена), система выполняет следующие действия:
a86de10d-5bcb-473a-a715-785dc91da97a).Код в планах обмена обязано быть уникальным. Происходит аварийное завершение настройки.Рассмотрим, как решить эту проблему несколькими эффективными способами.
Если у вас нет доступа к конфигуратору или вы не хотите писать программный код, проще всего воспользоваться стандартной обработкой «Групповое изменение реквизитов». Она присутствует практически во всех современных конфигурациях на управляемых формах.
Выполним процедуру по шагам:
Синхронизация данных через универсальный формат (в зависимости от вашей конфигурации план обмена может называться иначе, например, ОбменУправлениеТорговлейБухгалтерияПредприятия30).Этот узел Равно Да (или Истина).7a на 7b).После завершения работы обработки собственному узлу дочерней базы будет присвоен новый уникальный код, что исключит конфликт уникальности при последующей синхронизации.
Если у вас есть внешняя обработка «Консоль кода» или возможность выполнить код на сервере, изменение идентификатора узла обмена можно выполнить с помощью короткого скрипта на встроенном языке 1С. Рассмотрим данный пример.
Запустим следующий программный код в дочерней информационной базе:
// Получаем объект "Этот узел" для нужного плана обмена
УзелОбъект = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел().ПолучитьОбъект();
// Генерируем новый GUID и приводим его к строковому формату без лишних символов
НовыйУникальныйИдентификатор = Строка(Новый УникальныйИдентификатор);
// Записываем новый код в узел обмена
УзелОбъект.Код = НовыйУникальныйИдентификатор;
УзелОбъект.Записать();
Сообщить("Код узла успешно изменен на: " + НовыйУникальныйИдентификатор);
Этот способ является наиболее безопасным и быстрым, поскольку платформа самостоятельно сгенерирует гарантированно уникальный идентификатор в формате GUID (UUID) стандарта RFC 4122.
Даже после изменения кода «Этого узла» при попытке настройки синхронизации вы можете столкнуться со следующей ошибкой: «Значение префикса программы "..." не уникально. Уже существует настройка синхронизации с таким же префиксом».
Это связано с тем, что в регистры сведений скопированной базы перенеслись старые записи о настройках обмена оригинальной системы. Чтобы исправить эту коллизию, выполним очистку служебных регистров:
Общие настройки узлов информационных баз. Откроем его список записей и удалим все строки, содержащие старые настройки синхронизации, которые мешают создать новое подключение.Префиксы информационных баз. Отредактируем или удалим конфликтующие записи, связанные с префиксом базы источника.При физическом копировании базы данных 1С дублируются не только узлы обмена, но и внутренний уникальный идентификатор самой информационной базы (UID ИБ). Это может приводить к сбоям при получении программных лицензий 1С, работе регламентных заданий, а также интеграции с облачными сервисами.
Рекомендуется выполнять процедуру сброса UID базы-копии. Рассмотрим, как это сделать для файлового варианта работы:
/ResetIBUniqueIdentifier. Пример командной строки:
"C:\Program Files\1cv8\common\1cestart.exe" DESIGNER /F "D:\1C_Bases\KKT_Copy" /ResetIBUniqueIdentifier
При таком запуске платформа сгенерирует абсолютно новый уникальный идентификатор для вашей копии информационной базы, что предотвратит множество скрытых конфликтов в будущем, включая проблемы с неуникальностью служебных объектов при синхронизации.
Применив описанные методики, мы полностью устраним конфликты уникальности GUID и восстановим корректный двусторонний обмен данными между базами.