Как получить GUID без фигурных скобок в 1С 7.7: подробное руководство

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции устаревших систем на платформе 1С:Предприятие 7.7 с современными конфигурациями 1С 8.х, сторонними веб-сервисами, базами данных SQL или мобильными приложениями разработчики неизбежно сталкиваются с необходимостью генерации и передачи уникальных идентификаторов — GUID (UUID).

Исторически в операционных системах Microsoft Windows принят формат записи GUID с использованием заглавных букв и обрамлением в фигурные скобки, например: {6F9619FF-8B86-D011-B42D-00CF4FC964FF}. Однако современные веб-стандарты (включая REST API, форматы JSON, XML и стандарты обмена 1С 8.х EnterpriseData) требуют соблюдения стандарта RFC 4122, согласно которому GUID должен состоять только из строчных букв и не иметь фигурных скобок: 6f9619ff-8b86-d011-b42d-00cf4fc964ff.

В этой статье мы подробно разберем, как решить проблему генерации «чистого» GUID в 1С 7.7 различными способами, проанализируем синтаксис популярных внешних компонент и рассмотрим альтернативные варианты без регистрации сторонних библиотек в операционной системе.

Способ 1. Использование встроенного метода компоненты FormEx

Популярная внешняя компонента FormEx.dll предоставляет разработчикам удобный инструмент для работы с интерфейсом и системными функциями. Изначально метод генерации идентификатора ПолучитьGUID() возвращал строку исключительно в классическом представлении Microsoft (с фигурными скобками). Чтобы решить эту проблему и избавить программистов от написания лишнего кода по очистке строки, разработчик компоненты добавил специальный параметр управления форматированием.

Проанализируем синтаксис обновленного метода:

Сервис.ПолучитьGUID(<БезСкобок>)

Параметр <БезСкобок> является необязательным:

Рассмотрим практический пример использования этого метода в коде 1С 7.7:


// Загрузка компоненты FormEx и создание объекта Сервис
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 1 Тогда
    Сервис = СоздатьОбъект("Сервис");
    
    // Получение классического GUID со скобками
    ГуидСоСкобками = Сервис.ПолучитьGUID(0);
    Сообщить("GUID со скобками: " + ГуидСоСкобками); // Выведет: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
    
    // Получение чистого GUID без скобок
    ГуидБезСкобок = Сервис.ПолучитьGUID(1);
    Сообщить("GUID без скобок: " + ГуидБезСкобок);   // Выведет: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Иначе
    Предупреждение("Не удалось загрузить компоненту FormEx.dll!");
КонецЕсли;

Способ 2. Использование системного Windows-объекта Scriptlet.TypeLib

Что делать, если использовать внешнюю компоненту FormEx в конкретной задаче невозможно или нежелательно? Мы можем прибегнуть к стандартному COM-объекту операционной системы Windows — Scriptlet.TypeLib. Этот объект доступен на любой рабочей станции Windows и не требует регистрации каких-либо дополнительных DLL в системе.

Данный объект при обращении к свойству Guid генерирует новый уникальный идентификатор. Поскольку системная библиотека Windows возвращает строку с фигурными скобками и в верхнем регистре, мы применим стандартные функции платформы 1С 7.7 — СтрЗаменить() для удаления скобок и НРег() для приведения к нижнему регистру.

Разберем по шагам создание универсальной функции для интеграции:


//_____________________________________________________________________________
Функция СгенерироватьОчищенныйGUID() Экспорт
    Попытка
        // Создаем системный COM-объект
        TypeLib = СоздатьОбъект("Scriptlet.TypeLib");
        
        // Получаем сырой GUID вида "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"
        СыройГуид = TypeLib.Guid;
        
        // Удаляем открывающую фигурную скобку
        Результат = СтрЗаменить(СыройГуид, "{", "");
        
        // Удаляем закрывающую фигурную скобку
        Результат = СтрЗаменить(Результат, "}", "");
        
        // Приводим к нижнему регистру для соответствия веб-стандартам (RFC 4122)
        Возврат НРег(Результат);
    Исключение
        Сообщить("Ошибка вызова Scriptlet.TypeLib: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

Способ 3. Использование внешней компоненты v7plus.dll

Компонента v7plus.dll поставлялась фирмой «1С» в составе типовых конфигураций «семерки» и часто используется для обмена данными. В ней заложена утилита V7SysInfo, которая также умеет генерировать уникальные идентификаторы. Однако, аналогично системным библиотекам, она возвращает строку в формате Microsoft.

Для приведения результата работы v7plus.dll к стандартному виду без скобок мы можем объединить её вызов с алгоритмом строковой очистки. Рассмотрим этот пример кода:


//_____________________________________________________________________________
Функция ПолучитьГуидЧерезV7Plus() Экспорт
    Попытка
        // Пытаемся загрузить стандартную утилиту системной информации
        СистемнаяИнфо = СоздатьОбъект("AddIn.V7SysInfo");
        СыройГуид = СистемнаяИнфо.СоздатьGUID();
        
        // Очищаем от фигурных скобок и переводим в нижний регистр
        ЧистыйГуид = СтрЗаменить(СтрЗаменить(СыройГуид, "{", ""), "}", "");
        Возврат НРег(ЧистыйГуид);
    Исключение
        Сообщить("Не удалось использовать v7plus.dll для генерации GUID!", "I");
        Возврат "";
    КонецПопытки;
КонецФункции

Способ 4. Использование внешней компоненты 1С++ (1cpp.dll)

Если в вашей базе данных активно применяется мощная библиотека расширения 1С++, то вы можете задействовать специализированный класс GUID, разработанный специально для манипуляций с уникальными идентификаторами на низком уровне.

Посмотрим на пример генерации:


// Пример генерации GUID через ВК 1С++
Если ЗагрузитьВнешнююКомпоненту("1cpp.dll") = 1 Тогда
    ОбъектГуид = СоздатьОбъект("GUID");
    
    // Генерируем новый случайный идентификатор
    ОбъектГуид.Новый();
    
    // Получаем строковое представление
    ГуидСтрокой = ОбъектГуид.ВСтроку(); // Возвращает представление без скобок
    Сообщить("GUID через 1С++: " + НРег(ГуидСтрокой));
Иначе
    Сообщить("Компонента 1С++ не найдена!");
КонецЕсли;

Способ 5. Решение проблем прав доступа в терминальных сессиях (MSScriptControl)

В многопользовательских серверных средах (например, при работе пользователей через службы удаленных рабочих столов MS Terminal Services или Citrix) обычные учетные записи пользователей часто жестко ограничены в правах. Это блокирует создание и регистрацию сторонних ActiveX/COM объектов, таких как Scriptlet.TypeLib или внешние компоненты 1С.

Чтобы обойти это ограничение прав безопасности операционной системы, мы можем использовать системный хост сценариев MSScriptControl.ScriptControl, который обычно разрешен политиками безопасности Windows и позволяет выполнять код VBScript внутри изолированной виртуальной машины.

Рассмотрим, как реализовать этот отказоустойчивый обходной путь:


//_____________________________________________________________________________
Функция ПолучитьGUIDВТерминале() Экспорт
    Попытка
        // Инициализируем элемент управления скриптами
        СкриптКонтроль = СоздатьОбъект("MSScriptControl.ScriptControl");
        СкриптКонтроль.Language = "VBScript";
        
        // Формируем исполняемый VBScript-код для генерации GUID без обращения к реестру напрямую
        КодСкрипта = 
        "Function GetCleanGUID()" + РазделительСтрок +
        "   Set TypeLib = CreateObject(""Scriptlet.TypeLib"")" + РазделительСтрок +
        "   RawGuid = TypeLib.Guid" + РазделительСтрок +
        "   CleanGuid = Replace(Replace(RawGuid, ""{"", """"), ""}"", """")" + РазделительСтрок +
        "   GetCleanGUID = LCase(CleanGuid)" + РазделительСтрок +
        "End Function";
        
        СкриптКонтроль.AddCode(КодСкрипта);
        Результат = СкриптКонтроль.Run("GetCleanGUID");
        Возврат Результат;
    Исключение
        Сообщить("Ошибка генерации через MSScriptControl: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

Сравнительный анализ стандартов форматирования

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

  1. Стандарт Microsoft COM: {A1B2C3D4-E5F6-7A8B-9C0D-1E2F3A4B5C6D}. Обязательны фигурные скобки, буквы только в верхнем регистре. Используется в системных библиотеках Windows и по умолчанию в старых версиях внешних компонент 1С 7.7.
  2. Стандарт RFC 4122 (Веб, JSON, 1С 8.х): a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d. Строчные буквы, фигурные скобки отсутствуют. Применяется при обмене данными через формат XML/JSON в современных конфигурациях 1С 8.3 при сериализации объектов.

Важная рекомендация: Перед отправкой любого сгенерированного в 1С 7.7 идентификатора во внешнюю систему всегда принудительно очищайте его от фигурных скобок с помощью строковых функций платформы и приводите его к нижнему регистру с помощью функции НРег(). Это гарантирует бесперебойную работу механизмов синхронизации и исключит ошибки сопоставления объектов (так как для многих баз данных значения в разном регистре могут считаться отличающимися).

← На главную