Как сгенерировать GUID (UUID) в 1С:Предприятии 7.7?

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

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

Способ 1. Использование системного COM-объекта Scriptlet.TypeLib (без сторонних DLL)

Проанализируем самый универсальный и надежный способ получения системного GUID без необходимости установки дополнительных внешних компонент. В операционной системе Windows доступен встроенный COM-сервер Scriptlet.TypeLib, который обращается напрямую к стандартной функции WinAPI CoCreateGuid().

Посмотрим на пример функции формирования чистого GUID:


Функция ПолучитьСистемныйGUID()
    Перем ОбъектTypeLib, СтрGUID;
    
    Попытка
        ОбъектTypeLib = СоздатьОбъект("Scriptlet.TypeLib");
        СтрGUID = ОбъектTypeLib.Guid;
        // Свойство Guid возвращает строку вида "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\r\n"
        // Вырезаем ровно 36 символов самого GUID без скобок и служебных знаков переноса
        Возврат Сред(СтрGUID, 2, 36);
    Исключение
        Сообщить("Ошибка инициализации Scriptlet.TypeLib: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

Этот способ формирует валидный идентификатор стандарта RFC 4122 (UUID v4), который корректно проходит валидацию на строгих серверных шлюзах и не требует регистрации сторонних библиотек.

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

Рассмотрим вариант с использованием библиотеки V7PLUS.DLL, которая входит в состав типовых конфигураций 1С 7.7. Библиотека содержит служебный объект AddIn.V7SysInfo, в котором реализован штатный метод создания уникального идентификатора.

Посмотрим на программный код вызова компоненты:


Функция ПолучитьGUID_V7Plus()
    Перем Инфо, Идентификатор;
    
    Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") = 0 Тогда
        Сообщить("Не удалось загрузить v7plus.dll", "!");
        Возврат "";
    КонецЕсли;
    
    Попытка
        Инфо = СоздатьОбъект("AddIn.V7SysInfo");
        Идентификатор = Инфо.СоздатьGUID();
        Возврат Идентификатор;
    Исключение
        Сообщить("Ошибка при вызове AddIn.V7SysInfo: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

Важный нюанс: на 64-битных операционных системах Windows (Windows 10, Windows 11, Windows Server) библиотека v7plus.dll может требовать ручной регистрации через regsvr32, а также отключения механизма DEP (Data Execution Prevention), иначе при интенсивном вызове компоненты возможны сбои.

Способ 3. Запуск кода JavaScript через MSScriptControl

Если контрагент предоставил готовый алгоритм генерации на языке JavaScript и требует строгого следования его логике, мы можем выполнить его непосредственно внутри 1С с помощью Windows Script Host (WSH).

Разберем пример передачи и исполнения скрипта через MSScriptControl.ScriptControl:


Функция ПолучитьGUID_ScriptControl()
    Перем Скрипт, ТекстСкрипта, Результат;
    
    Попытка
        Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
        Скрипт.Language = "JScript";
        
        ТекстСкрипта = "
        |function s4(){
        |    return Math.floor((1 + Math.random()) * 0x10000)
        |               .toString(16)
        |               .substring(1);
        |};
        |function guid(){
        |    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
        |           s4() + '-' + s4() + s4() + s4();
        |};";
        
        Скрипт.AddCode(ТекстСкрипта);
        Результат = Скрипт.Run("guid");
        Возврат Результат;
    Исключение
        Сообщить("Ошибка выполнения ScriptControl: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

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

Если в вашей конфигурации уже подключена популярная внешняя компонента FormEx, можно воспользоваться ее объектом Сервис:


Функция ПолучитьGUID_FormEx()
    Перем СервисОбъект, СтрGUID;
    
    Попытка
        СервисОбъект = СоздатьОбъект("Сервис");
        СтрGUID = СервисОбъект.ПолучитьGuid();
        // Убираем фигурные скобки по краям, если они присутствуют
        СтрGUID = СтрЗаменить(СтрGUID, "{", "");
        СтрGUID = СтрЗаменить(СтрGUID, "}", "");
        Возврат СтрGUID;
    Исключение
        Сообщить("Ошибка работы с FormEx: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

Способ 5. Генерация через SQL-запрос (для клиент-серверных версий 1С 7.7)

Если база данных работает под управлением MS SQL Server или в коде используется прямое подключение через ADODB.Connection, валидный GUID можно получить встроенными функциями СУБД:


Функция ПолучитьGUID_MSSQL(СоединениеADO)
    Перем НаборЗаписей, СтрGUID;
    
    Попытка
        НаборЗаписей = СоединениеADO.Execute("SELECT NEWID() AS NewGUID");
        СтрGUID = СокращП(НаборЗаписей.Fields("NewGUID").Value);
        Возврат СтрGUID;
    Исключение
        Сообщить("Ошибка получения GUID из SQL: " + ОписаниеОшибки(), "!");
        Возврат "";
    КонецПопытки;
КонецФункции

Сопоставление математических функций JavaScript и 1С 7.7

Выясним, как соотносятся операторы из примера JavaScript с языком 1С 7.7:

  1. Math.floor() — отбрасывание дробной части числа. В языке 1С 7.7 полным аналогом является функция Цел().
  2. substring(1) — взятие подстроки начиная с определенной позиции. В 1С используется функция Сред(Строка, 2) (учитывая, что в JS индексация начинается с 0, а в 1С — с 1).
  3. 0x10000 — шестнадцатеричная запись числа 65536 в десятичной системе счисления.
  4. toString(16) — конвертация десятичного числа в шестнадцатеричную строку (HEX). В 1С 7.7 нет штатной встроенной функции перевода систем счисления, поэтому при чистой реализации на встроенном языке требуется ручной алгоритм деления на 16.

Рекомендации по выбору решения

Проанализируем применимость описанных методов:

  1. Scriptlet.TypeLib — оптимальный вариант по умолчанию для любой конфигурации. Не требует регистрации DLL, работает быстро и генерирует стандартные валидные GUID.
  2. WSH / MSScriptControl — подходит, когда требуется стопроцентное совпадение алгоритма с предоставленным банком кодом на JavaScript.
  3. v7plus.dll / FormEx — удобны в случаях, когда эти компоненты уже активно используются в конфигурации для других задач.
← На главную