При проведении обменов между информационными базами 1С (например, между конфигурациями «Управление торговлей», «Зарплата и управление персоналом» и «Бухгалтерия предприятия») часто возникает проблема задвоения элемента справочника — например, валюты, организации или контрагента. Названия и коды элементов полностью совпадают, но система воспринимает их как два разных объекта. Причина кроется в различном Уникальном Идентификаторе (GUID / UUID).
Рассмотрим, можно ли поменять GUID у уже существующего объекта в 1С, почему попытка прямых правок не всегда оправдана и какими методами правильно устранять подобные задвоения.
Проанализируем механику работы ссылок в платформе «1С:Предприятие». Уникальный идентификатор жестко связан со ссылкой объекта в базе данных. Встроенный язык 1С не позволяет напрямую изменить GUID у уже записанного элемента.
Метод УстановитьСсылкуНового() работает исключительно для еще не записанных объектов (когда свойство ЭтоНовый() возвращает Истина). Изменение же ссылки напрямую на уровне СУБД (через SQL-запросы) сопряжено с высокими рисками: нарушение целостности данных, появление битых ссылок вида <Объект не найден> и искажение структуры бинарного представления _IDRRef.
Поэтому на практике задача смены GUID решается либо заменой ссылок на правильный элемент, либо созданием нового элемента с нужным GUID и последующим слиянием дублей.
Если дублирующие объекты уже созданы в базе и на них ссылаются документы или регистры, менять сам GUID объекта не требуется. Достаточно перенаправить все ссылки со «старого» (ошибочного) элемента на «правильный» (эталонный).
Разберем порядок действий по шагам:
Выясним ситуативный вариант: если вам необходимо, чтобы в базе появился элемент с конкретным GUID (например, совпадающим с опорной базой-источником), мы можем сформировать ссылку до момента первой записи элемента.
Посмотрим на пример кода 1С, реализующего данную логику:
// Создаем новый объект справочника
НоваяВалюта = Справочники.Валюты.СоздатьЭлемент();
// Задаем необходимый GUID в виде строки
СтрокаGUID = "b8bea012-3da9-4d01-8855-48811771af7a";
УникальныйИдентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
// Формируем ссылку на основе идентификатора
СсылкаНового = Справочники.Валюты.ПолучитьСсылку(УникальныйИдентификатор);
// Устанавливаем ссылку до записи объекта
НоваяВалюта.УстановитьСсылкуНового(СсылкаНового);
НоваяВалюта.Наименование = "руб.";
НоваяВалюта.Код = "643";
// Записываем объект
НоваяВалюта.Записать();
После создания элемента с нужным GUID запускаем обработку замены ссылок для перенаправления всех существующих документов на вновь созданный элемент.
Иногда при перенаправлении ссылок система выдает ошибку о том, что объект используется в глобальных настройках или константах и не может быть изменен. Чтобы обойти это ограничение при обработке данных, используем режим загрузки данных ОбменДанными.Загрузка = Истина.
Проанализируем пример кода для установки ссылки в константу без срабатывания модулей проверки:
// Создаем менеджер значения константы
МенеджерЗначения = Константы.ВалютаУправленческогоУчета.СоздатьМенеджерЗначения();
// Отключаем внутренние проверки платформы
МенеджерЗначения.ОбменДанными.Загрузка = Истина;
// Находим правильную ссылку через запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Валюты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Валюты КАК Валюты
|ГДЕ
| НЕ Валюты.ПометкаУдаления
| И Валюты.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", "руб.");
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
МенеджерЗначения.Значение = РезультатЗапроса.Ссылка;
МенеджерЗначения.Записать();
КонецЕсли;
Чтобы проблема с разницей GUID не возникала при будущих обменах, необходимо скорректировать правила конвертации объектов (ПКО):
СправочникСсылка.Валюты).Код, Наименование, ИНН и т.д.Также при использовании обменов на базе Библиотеки Стандартных Подсистем (БСП) синхронизацию объектов можно настроить через специальный регистр сведений Соответствие объектов информационных баз. Интерактивная настройка сопоставления свяжет два элемента с разными GUID, предотвратив повторное создание дублей при загрузке данных.