Можно ли открыть УИД объекта на редактирование пользователю в 1С?

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

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

В такие моменты у администраторов или разработчиков может возникнуть соблазн: дать пользователю возможность вручную отредактировать УИД в карточке объекта, чтобы сопоставить его с базой-источником. Давайте подробно проанализируем эту ситуацию, выясним технические ограничения платформы 1С и разберем безопасные архитектурные сценарии решения данной задачи.

Почему технически невозможно просто «открыть УИД на редактирование»?

Для начала разберем по шагам, как устроена ссылочная связь в платформе «1С:Предприятие». Ссылка на любой элемент справочника или документ физически состоит из двух параметров: типа метаданных и 128-битного уникального идентификатора (GUID), хранящегося в СУБД.

В архитектуре платформы действуют жесткие правила:

  1. УИД — это неизменяемое свойство. В объектной модели 1С не существует метода, позволяющего напрямую перезаписать ссылку у существующего в базе объекта. Конструкция вида Объект.Ссылка = НовыйУИД вызовет ошибку компиляции или выполнения, поскольку свойство Ссылка доступно только для чтения.
  2. Нарушение ссылочной целостности. Если бы платформа теоретически позволяла «на лету» менять GUID существующей записи в таблице СУБД, то во всех документах, регистрах сведений и накопления, где ранее фигурировал этот элемент, ссылки мгновенно бы разрушились. Пользователи увидели бы на месте контрагента или номенклатуры системную надпись <Объект не найден...>.

Таким образом, идея «вывести поле с УИД на форму и разрешить пользователю его менять» полностью противоречит архитектуре платформы 1С.

Как программисты обходят это ограничение (технический путь)

Если перед разработчиком стоит жесткая задача изменить идентификатор конкретного объекта базы данных на другой, предопределенный GUID, напрямую перезаписать его в существующей карточке не получится. Рассмотрим подробнее стандартный алгоритм, который применяется для этих целей в программном коде:

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

Посмотрим на пример реализации данного алгоритма на встроенном языке 1С:


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

Важно понимать: данная операция является тяжелой транзакционной процедурой, требующей монопольного доступа к данным, контроля ссылочной целостности и высокой квалификации исполнителя. Давать подобный инструмент в руки рядового пользователя — это критический риск для работоспособности всей информационной системы.

Правильные методы исправления обменов без изменения УИД

Разберем, как правильно решать исходную задачу корректировки обмена («часть данных переносится, а часть заводится вручную») без применения деструктивных методов вмешательства в GUID.

1. Использование регистров соответствия

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

Этот регистр работает по принципу «таблицы сопоставления»:

2. Настройка полей поиска в правилах обмена

Если для обмена используется решение «1С:Конвертация данных», то жесткая привязка поиска только по УИД является архитектурной ошибкой настройки интеграции. Рассмотрим правильную стратегию настройки поиска:

Настройка правил синхронизации по бизнес-полям полностью исключает появление дублей, даже если пользователи вносят часть информации вручную параллельно с автоматическим обменом.

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

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

Рассмотрим по шагам работу с этим инструментом:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных и откроем обработку Поиск и удаление дублей.
  2. Выберем область поиска (например, справочник «Контрагенты») и настроим правила сравнения (например, совпадение по ИНН или по наименованию).
  3. Нажмем кнопку «Найти дубли». Система сгруппирует похожие записи.
  4. Определим, какой элемент будет являться «Оригиналом» (например, элемент, который пришел из внешней базы через обмен).
  5. Элемент, созданный пользователем вручную, укажем в качестве дубля.
  6. Нажмем кнопку «Перенести ссылки и удалить дубли».

При этом платформа автоматически найдет все документы, где фигурировал ручной дубль, заменит ссылку в этих документах на «Оригинал» из обмена, а сам дублирующий элемент пометит на удаление. Данная процедура абсолютно безопасна для базы данных, сохраняет ссылочную целостность и не требует изменения физических GUID в таблицах СУБД.

← На главную