При интеграции 1С 7.7 с внешними сервисами, банками (например, шлюзами эквайринга Сбербанка) и веб-службами разработчики сталкиваются с необходимостью формирования уникальных идентификаторов транзакций и пакетов — GUID (UUID). В отличие от платформы 1С:Предприятие 8, где доступен встроенный метод Новый УникальныйИдентификатор(), в версии 7.7 отсутствуют встроенные функции для прямой генерации стандартных UUID. Разберем по шагам несколько надежных способов решения этой задачи.
Проанализируем самый универсальный и надежный способ получения системного 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), который корректно проходит валидацию на строгих серверных шлюзах и не требует регистрации сторонних библиотек.
Рассмотрим вариант с использованием библиотеки 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), иначе при интенсивном вызове компоненты возможны сбои.
Если контрагент предоставил готовый алгоритм генерации на языке 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: " + ОписаниеОшибки(), "!");
Возврат "";
КонецПопытки;
КонецФункции
Если в вашей конфигурации уже подключена популярная внешняя компонента FormEx, можно воспользоваться ее объектом Сервис:
Функция ПолучитьGUID_FormEx()
Перем СервисОбъект, СтрGUID;
Попытка
СервисОбъект = СоздатьОбъект("Сервис");
СтрGUID = СервисОбъект.ПолучитьGuid();
// Убираем фигурные скобки по краям, если они присутствуют
СтрGUID = СтрЗаменить(СтрGUID, "{", "");
СтрGUID = СтрЗаменить(СтрGUID, "}", "");
Возврат СтрGUID;
Исключение
Сообщить("Ошибка работы с FormEx: " + ОписаниеОшибки(), "!");
Возврат "";
КонецПопытки;
КонецФункции
Если база данных работает под управлением 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:
Math.floor() — отбрасывание дробной части числа. В языке 1С 7.7 полным аналогом является функция Цел().substring(1) — взятие подстроки начиная с определенной позиции. В 1С используется функция Сред(Строка, 2) (учитывая, что в JS индексация начинается с 0, а в 1С — с 1).0x10000 — шестнадцатеричная запись числа 65536 в десятичной системе счисления.toString(16) — конвертация десятичного числа в шестнадцатеричную строку (HEX). В 1С 7.7 нет штатной встроенной функции перевода систем счисления, поэтому при чистой реализации на встроенном языке требуется ручной алгоритм деления на 16.Проанализируем применимость описанных методов: