При интеграции устаревших систем на платформе 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 различными способами, проанализируем синтаксис популярных внешних компонент и рассмотрим альтернативные варианты без регистрации сторонних библиотек в операционной системе.
Популярная внешняя компонента 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!");
КонецЕсли;
Что делать, если использовать внешнюю компоненту 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: " + ОписаниеОшибки(), "!");
Возврат "";
КонецПопытки;
КонецФункции
Компонента v7plus.dll поставлялась фирмой «1С» в составе типовых конфигураций «семерки» и часто используется для обмена данными. В ней заложена утилита V7SysInfo, которая также умеет генерировать уникальные идентификаторы. Однако, аналогично системным библиотекам, она возвращает строку в формате Microsoft.
Для приведения результата работы v7plus.dll к стандартному виду без скобок мы можем объединить её вызов с алгоритмом строковой очистки. Рассмотрим этот пример кода:
//_____________________________________________________________________________
Функция ПолучитьГуидЧерезV7Plus() Экспорт
Попытка
// Пытаемся загрузить стандартную утилиту системной информации
СистемнаяИнфо = СоздатьОбъект("AddIn.V7SysInfo");
СыройГуид = СистемнаяИнфо.СоздатьGUID();
// Очищаем от фигурных скобок и переводим в нижний регистр
ЧистыйГуид = СтрЗаменить(СтрЗаменить(СыройГуид, "{", ""), "}", "");
Возврат НРег(ЧистыйГуид);
Исключение
Сообщить("Не удалось использовать v7plus.dll для генерации GUID!", "I");
Возврат "";
КонецПопытки;
КонецФункции
Если в вашей базе данных активно применяется мощная библиотека расширения 1С++, то вы можете задействовать специализированный класс GUID, разработанный специально для манипуляций с уникальными идентификаторами на низком уровне.
Посмотрим на пример генерации:
// Пример генерации GUID через ВК 1С++
Если ЗагрузитьВнешнююКомпоненту("1cpp.dll") = 1 Тогда
ОбъектГуид = СоздатьОбъект("GUID");
// Генерируем новый случайный идентификатор
ОбъектГуид.Новый();
// Получаем строковое представление
ГуидСтрокой = ОбъектГуид.ВСтроку(); // Возвращает представление без скобок
Сообщить("GUID через 1С++: " + НРег(ГуидСтрокой));
Иначе
Сообщить("Компонента 1С++ не найдена!");
КонецЕсли;
В многопользовательских серверных средах (например, при работе пользователей через службы удаленных рабочих столов 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: " + ОписаниеОшибки(), "!");
Возврат "";
КонецПопытки;
КонецФункции
При передаче уникальных идентификаторов во внешние информационные системы критически важно понимать разницу между используемыми форматами. Давайте наглядно проанализируем различия в представлении одного и того же идентификатора:
{A1B2C3D4-E5F6-7A8B-9C0D-1E2F3A4B5C6D}. Обязательны фигурные скобки, буквы только в верхнем регистре. Используется в системных библиотеках Windows и по умолчанию в старых версиях внешних компонент 1С 7.7.a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d. Строчные буквы, фигурные скобки отсутствуют. Применяется при обмене данными через формат XML/JSON в современных конфигурациях 1С 8.3 при сериализации объектов.Важная рекомендация: Перед отправкой любого сгенерированного в 1С 7.7 идентификатора во внешнюю систему всегда принудительно очищайте его от фигурных скобок с помощью строковых функций платформы и приводите его к нижнему регистру с помощью функции НРег(). Это гарантирует бесперебойную работу механизмов синхронизации и исключит ошибки сопоставления объектов (так как для многих баз данных значения в разном регистре могут считаться отличающимися).