Как программно и интерактивно управлять уникальными идентификаторами (UID) в 1С:Предприятие 8?

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

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

Понятие ссылки и уникального идентификатора

Прежде всего, проанализируем разницу между ссылкой и её внутренним идентификатором. Ссылка — это объектный тип в языке 1С, который несет в себе информацию о типе объекта и его адресе в базе данных. Уникальный идентификатор — это 128-битное число, которое является первичным ключом в таблицах СУБД (Microsoft SQL Server, PostgreSQL и др.).

Выясним важную особенность: получить текстовое представление идентификатора из ссылки очень просто, используя метод УникальныйИдентификатор(). Однако обратный процесс — создание объекта с конкретным, заранее известным идентификатором — требует соблюдения определенных правил и использования специальных методов платформы.

Назначение UID при создании нового объекта

Рассмотрим ситуацию, когда нам необходимо создать элемент справочника или документ, идентификатор которого мы получили из внешней системы (например, из другой базы 1С или файла XML). Основное правило платформы гласит: назначить UID можно только до того момента, пока объект не записан в базу данных.

Для этого в языке 1С предусмотрен метод УстановитьСсылкуНового(). Разберем по шагам алгоритм создания объекта с заданным GUID:

  1. Получаем строковое представление GUID из внешнего источника.
  2. Создаем новый объект типа УникальныйИдентификатор из этой строки.
  3. Формируем ссылку с помощью менеджера справочника методом ПолучитьСсылку().
  4. Присваиваем эту ссылку новому объекту перед его записью.

Посмотрим на практический пример кода:


// Предположим, у нас есть строковый GUID
СтрокаGUID = "b5361f02-5332-11eb-bbe0-005056921cc4";
НужныйUID = Новый УникальныйИдентификатор(СтрокаGUID);

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

// Формируем ссылку на основе нашего UID
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НужныйUID);

// Устанавливаем ссылку для будущего объекта
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);

// Заполняем реквизиты и записываем
НовыйЭлемент.Наименование = "Товар из внешней системы";
НовыйЭлемент.Записать();

Важно: Если вы попытаетесь вызвать УстановитьСсылкуНового() для объекта, который уже был записан (Выбран() = Истина), платформа проигнорирует это действие или вызовет ошибку, так как UID в СУБД фиксируется окончательно при первом вызове Записать().

Можно ли изменить UID у уже существующего объекта?

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

Однако, если задача стоит критически (например, нужно устранить дубли после некорректного обмена), мы можем использовать стратегию «Пересоздание с подменой ссылок». Рассмотрим этот процесс подробнее:

  1. Создание дубликата: Создаем новый элемент с правильным UID (используя метод УстановитьСсылкуНового(), как описано выше) и копируем в него все данные из старого элемента.
  2. Поиск и замена ссылок: Используем программный метод НайтиПомеченныеНаУдаление() или специализированные обработки (например, «Поиск и замена дублей»). Нам нужно найти все упоминания старой ссылки во всех таблицах базы и заменить их на новую ссылку.
  3. Удаление оригинала: После того как все ссылки заменены, старый элемент можно безопасно удалить.

Для массовой замены ссылок в коде можно использовать метод ЗаменитьСсылки():


МассивСтарыхСсылок = Новый Массив;
МассивСтарыхСсылок.Добавить(СтараяСсылка);

// Заменяем во всей базе СтараяСсылка на НоваяСсылка
// Параметр СпособРедактированияДанных позволяет выбрать объектную или транзакционную запись
ЗаменитьСсылки(МассивСтарыхСсылок, НоваяСсылка);

Редактирование UID на уровне метаданных конфигурации

Иногда проблема кроется глубже: разные идентификаторы имеют не элементы справочников, а сами объекты метаданных (например, справочник «Контрагенты» в одной базе имеет один внутренний UID, а в другой — другой). Это приводит к тому, что при объединении конфигураций 1С видит их как два разных справочника.

Для решения этой специфической задачи можно использовать механизм выгрузки конфигурации в файлы. Рассмотрим этот путь:

  1. В конфигураторе выберем пункт меню «Конфигурация» — «Выгрузить конфигурацию в файлы...».
  2. В каталоге выгрузки найдем XML-файл, описывающий нужный объект (например, Catalog.Контрагенты.xml).
  3. Откроем файл текстовым редактором и найдем атрибут uuid в корневом узле.
  4. Изменим значение на нужное и сохраним файл.
  5. Загрузим файлы обратно через «Конфигурация» — «Загрузить конфигурацию из файлов...».

Внимание: Этот метод крайне опасен. Ошибка в одной букве GUID или случайное дублирование идентификатора внутри конфигурации может привести к тому, что информационная база перестанет открываться. Всегда делайте резервную копию перед подобными манипуляциями.

Интерактивные методы и инструменты разработчика

Если вам нужно оперативно посмотреть или скопировать UID элемента в режиме «Предприятие», штатные формы часто этого не позволяют. В таком случае программисты обычно используют расширения или внешние обработки:

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

← На главную