В процессе сопровождения и настройки обмена данными между информационными базами «1С:Предприятие» технические специалисты часто сталкиваются со следующей проблемой: часть информации переносится автоматически, а часть заводится пользователями вручную. В результате в базах возникают дублирующие элементы (например, контрагенты или номенклатура), которые имеют одинаковые наименования или реквизиты, но разные уникальные идентификаторы (УИД / GUID).
В такие моменты у администраторов или разработчиков может возникнуть соблазн: дать пользователю возможность вручную отредактировать УИД в карточке объекта, чтобы сопоставить его с базой-источником. Давайте подробно проанализируем эту ситуацию, выясним технические ограничения платформы 1С и разберем безопасные архитектурные сценарии решения данной задачи.
Для начала разберем по шагам, как устроена ссылочная связь в платформе «1С:Предприятие». Ссылка на любой элемент справочника или документ физически состоит из двух параметров: типа метаданных и 128-битного уникального идентификатора (GUID), хранящегося в СУБД.
В архитектуре платформы действуют жесткие правила:
Объект.Ссылка = НовыйУИД вызовет ошибку компиляции или выполнения, поскольку свойство Ссылка доступно только для чтения.<Объект не найден...>.Таким образом, идея «вывести поле с УИД на форму и разрешить пользователю его менять» полностью противоречит архитектуре платформы 1С.
Если перед разработчиком стоит жесткая задача изменить идентификатор конкретного объекта базы данных на другой, предопределенный GUID, напрямую перезаписать его в существующей карточке не получится. Рассмотрим подробнее стандартный алгоритм, который применяется для этих целей в программном коде:
УстановитьСсылкуНового(), куда передается подготовленная ссылка.НайтиПоСсылкам() в базе данных отыскиваются все транзакции, документы и регистры, где использовалась старая ссылка.Посмотрим на пример реализации данного алгоритма на встроенном языке 1С:
// Пример программной замены УИД у элемента справочника "Контрагенты"
Процедура ЗаменитьУИДОбъекта(СтарыйОбъектСсылка, СтрокаНовыйGUID)
// Шаг 1. Создаем новый идентификатор из строки
НовыйGUID = Новый УникальныйИдентификатор(СтрокаНовыйGUID);
НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(НовыйGUID);
// Шаг 2. Проверяем, нет ли уже объекта с таким УИД в базе
Если ЗначениеЗаполнено(НоваяСсылка.ВерсияДанных) Тогда
ВызватьИсключение "Объект с указанным GUID уже существует в системе!";
КонецЕсли;
// Шаг 3. Создаем новый элемент и устанавливаем ему ссылку
НовыйОбъект = Справочники.Contragents.СоздатьЭлемент();
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
// Шаг 4. Копируем данные
ЗаполнитьЗначенияСвойств(НовыйОбъект, СтарыйОбъектСсылка.ПолучитьОбъект(), , "Ссылка, Код");
НовыйОбъект.Записать();
// Шаг 5. Поиск и замена ссылок по всей базе данных
ТаблицаСсылок = НайтиПоСсылкам(Новый Массив(СтарыйОбъектСсылка));
Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
// Здесь должен быть код по замене старой ссылки на новую в найденных объектах
КонецЦикла;
КонецПроцедуры
Важно понимать: данная операция является тяжелой транзакционной процедурой, требующей монопольного доступа к данным, контроля ссылочной целостности и высокой квалификации исполнителя. Давать подобный инструмент в руки рядового пользователя — это критический риск для работоспособности всей информационной системы.
Разберем, как правильно решать исходную задачу корректировки обмена («часть данных переносится, а часть заводится вручную») без применения деструктивных методов вмешательства в GUID.
В типовых конфигурациях 1С, построенных на базе Библиотеки Стандартных Подсистем (БСП), для целей интеграции используется специальный регистр сведений. Он может называться РегистрСведений.СоответствиеОбъектовИнформационныхБаз или РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.
Этот регистр работает по принципу «таблицы сопоставления»:
Если для обмена используется решение «1С:Конвертация данных», то жесткая привязка поиска только по УИД является архитектурной ошибкой настройки интеграции. Рассмотрим правильную стратегию настройки поиска:
ИНН и КПП, и только при их отсутствии система должна пытаться сопоставить данные по УИД или наименованию.Артикул или Штрихкод.СНИЛС или связке ФИО и даты рождения.Настройка правил синхронизации по бизнес-полям полностью исключает появление дублей, даже если пользователи вносят часть информации вручную параллельно с автоматическим обменом.
Если дублирующие элементы уже созданы пользователями в информационной базе, не нужно пытаться программно менять их идентификаторы. В системе «1С:Предприятие» предусмотрен стандартный и безопасный инструмент для слияния объектов.
Рассмотрим по шагам работу с этим инструментом:
При этом платформа автоматически найдет все документы, где фигурировал ручной дубль, заменит ссылку в этих документах на «Оригинал» из обмена, а сам дублирующий элемент пометит на удаление. Данная процедура абсолютно безопасна для базы данных, сохраняет ссылочную целостность и не требует изменения физических GUID в таблицах СУБД.