В процессе разработки и сопровождения систем на платформе 1С:Предприятие 8 часто возникают ситуации, когда стандартных механизмов поиска объектов по коду или наименованию становится недостаточно. Особенно остро это ощущается при обмене данными, интеграции с внешними SQL-системами или при использовании «Конвертации данных». В основе любого ссылочного объекта 1С лежит Уникальный Идентификатор (UID или GUID). В этой статье мы подробно разберем, как управлять этими идентификаторами, можно ли их менять у существующих элементов и какие программные методы для этого существуют.
Прежде всего, проанализируем разницу между ссылкой и её внутренним идентификатором. Ссылка — это объектный тип в языке 1С, который несет в себе информацию о типе объекта и его адресе в базе данных. Уникальный идентификатор — это 128-битное число, которое является первичным ключом в таблицах СУБД (Microsoft SQL Server, PostgreSQL и др.).
Выясним важную особенность: получить текстовое представление идентификатора из ссылки очень просто, используя метод УникальныйИдентификатор(). Однако обратный процесс — создание объекта с конкретным, заранее известным идентификатором — требует соблюдения определенных правил и использования специальных методов платформы.
Рассмотрим ситуацию, когда нам необходимо создать элемент справочника или документ, идентификатор которого мы получили из внешней системы (например, из другой базы 1С или файла XML). Основное правило платформы гласит: назначить UID можно только до того момента, пока объект не записан в базу данных.
Для этого в языке 1С предусмотрен метод УстановитьСсылкуНового(). Разберем по шагам алгоритм создания объекта с заданным GUID:
УникальныйИдентификатор из этой строки.ПолучитьСсылку().Посмотрим на практический пример кода:
// Предположим, у нас есть строковый GUID
СтрокаGUID = "b5361f02-5332-11eb-bbe0-005056921cc4";
НужныйUID = Новый УникальныйИдентификатор(СтрокаGUID);
// Создаем новый элемент справочника
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
// Формируем ссылку на основе нашего UID
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НужныйUID);
// Устанавливаем ссылку для будущего объекта
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
// Заполняем реквизиты и записываем
НовыйЭлемент.Наименование = "Товар из внешней системы";
НовыйЭлемент.Записать();
Важно: Если вы попытаетесь вызвать УстановитьСсылкуНового() для объекта, который уже был записан (Выбран() = Истина), платформа проигнорирует это действие или вызовет ошибку, так как UID в СУБД фиксируется окончательно при первом вызове Записать().
Проанализируем техническую возможность изменения идентификатора у элемента, который уже живет в базе. Напрямую через встроенный язык 1С сделать это невозможно. Идентификатор является первичным ключом в таблице базы данных, и его изменение означало бы разрушение всех ссылочных связей во всей базе (в документах, регистрах сведений, движениях).
Однако, если задача стоит критически (например, нужно устранить дубли после некорректного обмена), мы можем использовать стратегию «Пересоздание с подменой ссылок». Рассмотрим этот процесс подробнее:
УстановитьСсылкуНового(), как описано выше) и копируем в него все данные из старого элемента.НайтиПомеченныеНаУдаление() или специализированные обработки (например, «Поиск и замена дублей»). Нам нужно найти все упоминания старой ссылки во всех таблицах базы и заменить их на новую ссылку.Для массовой замены ссылок в коде можно использовать метод ЗаменитьСсылки():
МассивСтарыхСсылок = Новый Массив;
МассивСтарыхСсылок.Добавить(СтараяСсылка);
// Заменяем во всей базе СтараяСсылка на НоваяСсылка
// Параметр СпособРедактированияДанных позволяет выбрать объектную или транзакционную запись
ЗаменитьСсылки(МассивСтарыхСсылок, НоваяСсылка);
Иногда проблема кроется глубже: разные идентификаторы имеют не элементы справочников, а сами объекты метаданных (например, справочник «Контрагенты» в одной базе имеет один внутренний UID, а в другой — другой). Это приводит к тому, что при объединении конфигураций 1С видит их как два разных справочника.
Для решения этой специфической задачи можно использовать механизм выгрузки конфигурации в файлы. Рассмотрим этот путь:
Catalog.Контрагенты.xml).uuid в корневом узле.Внимание: Этот метод крайне опасен. Ошибка в одной букве GUID или случайное дублирование идентификатора внутри конфигурации может привести к тому, что информационная база перестанет открываться. Всегда делайте резервную копию перед подобными манипуляциями.
Если вам нужно оперативно посмотреть или скопировать UID элемента в режиме «Предприятие», штатные формы часто этого не позволяют. В таком случае программисты обычно используют расширения или внешние обработки:
ВЫБРАТЬ Ссылка.УникальныйИдентификатор ИЗ Справочник.Номенклатура и увидеть текстовое значение.Резюмируя, работа с идентификаторами в 1С требует понимания жизненного цикла объекта. Назначить UID легко при создании, но практически невозможно изменить после записи без сложных процедур пересоздания. Использование методов ПолучитьСсылку() и УстановитьСсылкуНового() — это надежный и штатный способ обеспечить синхронность данных между различными информационными системами.