Как изменить GUID объекта в 1С и побороть задвоение справочников при обменах?

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

При проведении обменов между информационными базами 1С (например, между конфигурациями «Управление торговлей», «Зарплата и управление персоналом» и «Бухгалтерия предприятия») часто возникает проблема задвоения элемента справочника — например, валюты, организации или контрагента. Названия и коды элементов полностью совпадают, но система воспринимает их как два разных объекта. Причина кроется в различном Уникальном Идентификаторе (GUID / UUID).

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

Ограничение платформы: почему нельзя просто переписать GUID

Проанализируем механику работы ссылок в платформе «1С:Предприятие». Уникальный идентификатор жестко связан со ссылкой объекта в базе данных. Встроенный язык 1С не позволяет напрямую изменить GUID у уже записанного элемента.

Метод УстановитьСсылкуНового() работает исключительно для еще не записанных объектов (когда свойство ЭтоНовый() возвращает Истина). Изменение же ссылки напрямую на уровне СУБД (через SQL-запросы) сопряжено с высокими рисками: нарушение целостности данных, появление битых ссылок вида <Объект не найден> и искажение структуры бинарного представления _IDRRef.

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

Способ 1. Использование обработки «Поиск и замена дублей»

Если дублирующие объекты уже созданы в базе и на них ссылаются документы или регистры, менять сам GUID объекта не требуется. Достаточно перенаправить все ссылки со «старого» (ошибочного) элемента на «правильный» (эталонный).

Разберем порядок действий по шагам:

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

Способ 2. Программное создание объекта с требуемым GUID

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

Посмотрим на пример кода 1С, реализующего данную логику:


// Создаем новый объект справочника
НоваяВалюта = Справочники.Валюты.СоздатьЭлемент();

// Задаем необходимый GUID в виде строки
СтрокаGUID = "b8bea012-3da9-4d01-8855-48811771af7a";
УникальныйИдентификатор = Новый УникальныйИдентификатор(СтрокаGUID);

// Формируем ссылку на основе идентификатора
СсылкаНового = Справочники.Валюты.ПолучитьСсылку(УникальныйИдентификатор);

// Устанавливаем ссылку до записи объекта
НоваяВалюта.УстановитьСсылкуНового(СсылкаНового);
НоваяВалюта.Наименование = "руб.";
НоваяВалюта.Код = "643";

// Записываем объект
НоваяВалюта.Записать();

После создания элемента с нужным GUID запускаем обработку замены ссылок для перенаправления всех существующих документов на вновь созданный элемент.

Способ 3. Перезапись значений констант и сброс проверок

Иногда при перенаправлении ссылок система выдает ошибку о том, что объект используется в глобальных настройках или константах и не может быть изменен. Чтобы обойти это ограничение при обработке данных, используем режим загрузки данных ОбменДанными.Загрузка = Истина.

Проанализируем пример кода для установки ссылки в константу без срабатывания модулей проверки:


// Создаем менеджер значения константы
МенеджерЗначения = Константы.ВалютаУправленческогоУчета.СоздатьМенеджерЗначения();

// Отключаем внутренние проверки платформы
МенеджерЗначения.ОбменДанными.Загрузка = Истина;

// Находим правильную ссылку через запрос
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Валюты.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.Валюты КАК Валюты
    |ГДЕ
    |	НЕ Валюты.ПометкаУдаления
    |	И Валюты.Наименование = &Наименование";

Запрос.УстановитьПараметр("Наименование", "руб.");
РезультатЗапроса = Запрос.Выполнить().Выбрать();

Если РезультатЗапроса.Следующий() Тогда
    МенеджерЗначения.Значение = РезультатЗапроса.Ссылка;
    МенеджерЗначения.Записать();
КонецЕсли;

Способ 4. Доработка правил обмена в «Конвертации данных»

Чтобы проблема с разницей GUID не возникала при будущих обменах, необходимо скорректировать правила конвертации объектов (ПКО):

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

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

← На главную