Уникальные идентификаторы GUID (Globally Unique Identifier) активно используются в 1С:Предприятие для маркировки объектов, синхронизации данных между базами, интеграции с внешними системами и обеспечения уникальности записей. Без них невозможно корректно организовать обмен данными между узлами распределённой информационной базы, работать с REST API или настраивать сложные механизмы идентификации.
В этой статье вы найдёте все актуальные способы генерации GUID в 1С 8.3 и 8.2 — от стандартных функций платформы до программных решений с использованием внешних компонент. Мы разберём нюансы работы с уникальными идентификаторами в типовых конфигурациях (УТ 11, БП 3.0, ЗУП 3.1, ERP 2), покажем примеры кода для разных сценариев и предупредим о типичных ошибках, которые приводят к дублированию или потере идентификаторов.
Что такое GUID и зачем он нужен в 1С
GUID (или UUID) — это 128-битный идентификатор, который гарантированно уникален в пространстве и времени. В 1С:Предприятие он представлен в формате строки из 36 символов, например: {550E8400-E29B-41D4-A716-446655440000}. Основные области применения:
- 🔄 Обмен данными между распределёнными базами (РИБ, УРИБ, обмен через XML/JSON)
- 🔗 Интеграция с внешними системами (сайты, CRM, ERP, банковские сервисы)
- 📌 Идентификация объектов в механизмах версиирования и истории изменений
- 🔐 Безопасность: генерация токенов, ключей доступа, маркеров сессий
В типовых конфигурациях 1С GUID автоматически присваиваются многим объектам (справочникам, документам, регистрам), но иногда требуется сгенерировать идентификатор вручную — например, при создании новых элементов через код или при настройке нестандартного обмена.
Способ 1: Стандартная функция НовыйУникальныйИдентификатор()
Самый простой и надёжный способ — использовать встроенную функцию платформы НовыйУникальныйИдентификатор(). Она доступна во всех версиях 1С:Предприятие 8.2/8.3 и генерирует GUID в формате, совместимом с большинством внешних систем.
Пример кода:
Перем мНовыйGUID;
// Генерация нового GUID
мНовыйGUID = Новый УникальныйИдентификатор();
// Вывод результата в сообщение
Сообщить("Сгенерированный GUID: " + мНовыйGUID.УникальныйИдентификатор());
Особенности метода:
- ✅ Работает без подключения внешних компонент
- ✅ Совместим с РИБ, УРИБ и другими механизмами обмена
- ⚠️ В некоторых старых версиях платформы (до 8.3.6) может требовать явного приведения типа
Если вам нужно получить GUID в виде строки без фигурных скобок, используйте конструкцию Строка(мНовыйGUID.УникальныйИдентификатор()) или Формат(мНовыйGUID, "UUID") (в новых версиях платформы).
Способ 2: Генерация через COM-объект (для Windows)
В операционных системах Windows можно использовать COM-объект Scriptlet.TypeLib для генерации GUID. Этот метод полезен, если требуется совместимость с внешними Windows-приложениями или когда нужна альтернатива стандартной функции.
Пример кода:
Перем мGUIDCOM, мРезультатGUID;
Попытка
мGUIDCOM = Новый COMОбъект("Scriptlet.TypeLib");
мРезультатGUID = мGUIDCOM.Guid;
Сообщить("GUID через COM: " + мРезультатGUID);
Исключение
Сообщить("Ошибка создания COM-объекта: " + ОписаниеОшибки());
КонецПопытки;
⚠️ Внимание: Этот метод работает только на Windows и требует прав на создание COM-объектов. В Linux-версиях 1С:Предприятие или при работе через веб-клиент он вызовет ошибку.
Сравнение с стандартной функцией:
| Критерий | НовыйУникальныйИдентификатор() |
COM-объект Scriptlet.TypeLib |
|---|---|---|
| Кросс-платформенность | ✅ Да | ❌ Только Windows |
| Требуются дополнительные права | ❌ Нет | ✅ Да |
| Совместимость с РИБ | ✅ Полная | ✅ Полная |
| Производительность | ⚡ Быстрее | ⏳ Медленнее |
Способ 3: Использование внешних компонент (для сложных сценариев)
Если стандартные методы не подходят (например, требуется генерация GUID по специфическим алгоритмам или в нестандартных форматах), можно подключить внешнюю компоненту. Популярные варианты:
- 📦 AddIn на C++/C# (например,
NativeAPIилиOneScript.Native) - 🌐 HTTP-сервисы (запрос к API, возвращающему GUID)
- 📄 1С:Интеграция (для работы с Microsoft SQL Server и его функцией
NEWID())
Пример подключения внешней компоненты на C#:
// Предварительно компонента должна быть зарегистрирована в системе
Перем мВнешняяКомпонента, мGUIDизКомпоненты;
мВнешняяКомпонента = Новый COMОбъект("MyGuidGenerator.AddIn");
мGUIDизКомпоненты = мВнешняяКомпонента.GenerateGuid();
Сообщить("GUID из внешней компоненты: " + мGUIDизКомпоненты);
⚠️ Внимание: Использование внешних компонент требует их предварительной регистрации на клиентских машинах и может вызвать проблемы при обновлении 1С или смене операционной системы. Всегда тестируйте решение на всех рабочих местах пользователей.
Как зарегистрировать внешнюю компоненту в 1С?
1. Скопируйте файл компоненты (например, MyAddIn.dll) в папку с установленной 1С или в системный каталог (например, C:\Windows\System32).
2. Зарегистрируйте компоненту через командную строку: regsvr32 MyAddIn.dll.
3. В конфигураторе 1С добавьте ссылку на компоненту в разделе Внешние компоненты.
4. Перезапустите 1С и проверьте работоспособность через код: Новый COMОбъект("MyAddIn.ClassName").
Способ 4: Генерация GUID в запросах 1С
В некоторых случаях удобно генерировать GUID непосредственно в тексте запроса — например, при массовом создании записей в регистрах или временных таблицах. Для этого используется функция UUID() (доступна в 1С:Предприятие 8.3.10+).
Пример запроса:
ВЫБРАТЬ
UUID() КАК НовыйИдентификатор,
"Тестовое значение" КАК Описание
ПОМЕСТИТЬ втТаблицаСGUID
Особенности метода:
- 🔹 Работает только в управляемых формах и тонком клиенте
- 🔹 Не поддерживается в старых версиях платформы (до 8.3.10)
- 🔹 Может использоваться для заполнения реквизитов типа
УникальныйИдентификаторпрямо в запросе
Если функция UUID() недоступна, альтернативный вариант — генерация GUID в коде с последующей передачей в запрос через параметр:
мGUID = Новый УникальныйИдентификатор();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| &мGUID КАК НовыйИдентификатор,
| ""Тест"" КАК Описание";
Запрос.УстановитьПараметр("мGUID", мGUID);
Результат = Запрос.Выполнить();
Функция UUID() в запросах 1С появилась только в версии 8.3.10. В более старых версиях используйте генерацию GUID в коде с передачей через параметры запроса.
Способ 5: Получение GUID из существующих объектов 1С
Часто требуется не сгенерировать новый GUID, а получить идентификатор уже существующего объекта (справочника, документа, регистра). Для этого у всех прикладных объектов есть свойство УникальныйИдентификатор().
Примеры:
// Получение GUID справочника "Номенклатура"
мСсылка = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");
мGUID = мСсылка.УникальныйИдентификатор();
Сообщить("GUID номенклатуры: " + мGUID);
// Получение GUID документа "РеализацияТоваровУслуг"
мДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
мGUIDДок = мДокумент.УникальныйИдентификатор();
Сообщить("GUID нового документа: " + мGUIDДок);
Важные нюансы:
- 🔍 GUID присваивается объекту при первом сохранении в базу. У несозданного объекта (например,
СправочникОбъект.Новый()) идентификатора нет. - 🔄 При копировании объекта (метод
Скопировать()) GUID не копируется — создаётся новый. - 🗑️ При удалении объекта его GUID не освобождается и не может быть повторно использован для других объектов.
Используйте УникальныйИдентификатор() только для сохранённых объектов|Не сравнивайте GUID как строки — используйте метод СравнитьУникальныеИдентификаторы()|При обмене данными проверяйте GUID на пустое значение (ЗначениеЗаполнено())|Не модифицируйте GUID вручную — это приведёт к ошибкам синхронизации-->
Типичные ошибки при работе с GUID в 1С и как их избежать
Ошибки с уникальными идентификаторами часто ведут к потере данных, дублированию записей или сбоям обмена. Рассмотрим наиболее распространённые проблемы и способы их решения.
Ошибка 1: Сравнение GUID как строк
Некорректное сравнение:
мGUID1 = Новый УникальныйИдентификатор();
мGUID2 = Новый УникальныйИдентификатор();
Если мGUID1.УникальныйИдентификатор() = мGUID2.УникальныйИдентификатор() Тогда
// Этот код никогда не выполнится, даже если GUID одинаковые!
КонецЕсли;
Правильное сравнение:
Если мGUID1.СравнитьУникальныеИдентификаторы(мGUID2) Тогда
Сообщить("GUID совпадают!");
КонецЕсли;
Ошибка 2: Пустые GUID при обмене данными
Если при обмене между базами приходит объект с пустым GUID, это может привести к созданию дубля. Всегда проверяйте:
Если НЕ ЗначениеЗаполнено(мОбъект.УникальныйИдентификатор()) Тогда
мОбъект.УникальныйИдентификатор = Новый УникальныйИдентификатор();
КонецЕсли;
Ошибка 3: Конфликты GUID в распределённых базах
В РИБ или УРИБ конфликты GUID возникают, если:
- 🔄 Один и тот же объект был изменён в двух узлах одновременно
- 📥 При обмене не проверяется уникальность идентификаторов
- 🔧 Вручную изменялись GUID в базе данных
⚠️ Внимание: Если в распределённой базе возник конфликт GUID, не пытайтесь исправить его вручную через SQL или конфигуратор. Используйте штатные механизмы синхронизации или обратитесь к специалисту по 1С. Неправильные действия могут привести к невосстановимой потере данных.
FAQ: Частые вопросы о GUID в 1С
Можно ли в 1С создать GUID без фигурных скобок { }?
Да, для этого используйте функцию Формат() (в новых версиях платформы) или преобразуйте в строку с заменой:
мGUID = Новый УникальныйИдентификатор();
мGUIDБезСкобок = СтрЗаменить(мGUID.УникальныйИдентификатор(), "{", "");
мGUIDБезСкобок = СтрЗаменить(мGUIDБезСкобок, "}", "");
Как сгенерировать GUID в 1С на мобильной платформе?
На мобильной платформе 1С:Предприятие доступна стандартная функция НовыйУникальныйИдентификатор(). Альтернативные методы (например, COM-объекты) не работают. Пример:
мGUID = Новый УникальныйИдентификатор();
Сообщить("GUID на мобильном клиенте: " + мGUID.УникальныйИдентификатор());
Что делать, если при обмене данными GUID дублируются?
Дублирование GUID при обмене указывает на ошибку в логике синхронизации. Проверьте:
- Настройки правил обмена (возможно, отключена проверка уникальности)
- Код обработчиков
ПередЗаписьюилиПриЗаписи— там может принудительно присваиваться новый GUID - Логи обмена на наличие ошибок
Если проблема сохраняется, воспользуйтесь обработкой "Поиск и замена дублей по GUID" из 1С:ИТС.
Можно ли использовать GUID как первичный ключ в регистрах сведений?
Технически можно, но это не рекомендуется. GUID занимает 16 байт (против 4 байт у Число или Строка(9)), что увеличивает размер базы и замедляет выборки. Оптимальный вариант — использовать GUID как дополнительный реквизит для синхронизации, а в качестве ключа оставить стандартный тип (например, Строка или Число).
Как проверить, что GUID в 1С соответствует стандарту RFC 4122?
Сгенерированный в 1С GUID соответствует стандарту RFC 4122 (версия 4 — случайные идентификаторы). Проверить его можно:
- По длине строки (36 символов с учётом дефисов)
- По формату:
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, где4— версия, аy— вариант (8, 9, A или B) - С помощью регулярного выражения:
мШаблон = "^\{?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}?$";
мПроверка = РегВыражение(мШаблон, "i");
Если мПроверка.Найти(мGUID.УникальныйИдентификатор()) Тогда
Сообщить("GUID соответствует стандарту!");
Иначе
Сообщить("Ошибка формата GUID!");
КонецЕсли;