Как программно получить GUID текущей базы данных в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Однако в самой платформе 1С:Предприятие нет единого универсального понятия «GUID базы данных», доступного одной простой функцией. В зависимости от архитектуры (файловая или клиент-серверная), а также от используемых библиотек (например, БСП), разработчики применяют разные подходы. В этой статье мы подробно разберем все надежные способы программного получения уникального идентификатора информационной базы.

Способ 1. Использование встроенной константы БСП (Библиотеки Стандартных Подсистем)

Если ваша конфигурация разработана на базе БСП (а это практически все типовые решения от 1С: «Бухгалтерия предприятия», «Управление торговлей», «ERP Управление предприятием» и др.), то задача существенно упрощается. В составе библиотек уже предусмотрен готовый механизм идентификации.

Для определения уникального идентификатора мы можем обратиться к специальной константе ИдентификаторИнформационнойБазы. Разберем по шагам, как получить это значение:


// Получаем уникальный идентификатор из константы БСП
ЗначениеКонстанты = Константы.ИдентификаторИнформационнойБазы.Получить();

Если ЗначениеЗаполнено(ЗначениеКонстанты) Тогда
    GUIDБазы = Строка(ЗначениеКонстанты);
    Сообщить("GUID текущей базы данных (БСП): " + GUIDБазы);
Иначе
    Сообщить("Идентификатор базы еще не инициализирован.");
КонецЕсли;

Важная особенность: этот идентификатор автоматически генерируется при первом запуске информационной базы. При копировании базы стандартными средствами (например, через резервную копию) при первом запуске система БСП обычно задает пользователю вопрос: «Информационная база была перемещена или восстановлена из резервной копии?». Если пользователь отвечает, что это копия, БСП автоматически перезаписывает значение константы ИдентификаторИнформационнойБазы новым GUID, чтобы избежать конфликтов обмена данными и заблокировать регламентные задания в копии.

Способ 2. Использование узла распределенной информационной базы (РИБ)

Если в вашей конфигурации настроен план обмена с признаком «Распределенная информационная база» (РИБ), то уникальный идентификатор главного узла или текущего узла (ЭтотУзел) может выступать в роли надежного GUID базы.

Давайте посмотрим на пример кода, позволяющий получить идентификатор текущего узла обмена:


// Выбираем подходящий план обмена, поддерживающий РИБ
ПланОбменаИмя = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат;

// Получаем ссылку на текущий узел информационной базы
СсылкаЭтотУзел = ПланОбменаИмя.ЭтотУзел();

// Считываем уникальный идентификатор узла
GUIDУзла = Строка(СсылкаЭтотУзел.УникальныйИдентификатор());
Сообщить("GUID текущего узла распределенной базы: " + GUIDУзла);

Этот способ хорош тем, что идентификатор узла жестко зашит в таблицах базы данных и не зависит от сетевого окружения или настроек клиентского компьютера.

Способ 3. Платформенный метод определения уникального пути

Что делать, если конфигурация написана «с нуля», в ней нет БСП и не используются планы обмена? В таком случае мы можем использовать стандартную функцию платформы ПолучитьНавигационнуюСсылкуИнформационнойБазы(). Данный метод возвращает уникальный URI текущей ИБ.

Рассмотрим, какие данные возвращает этот метод:

Для получения условно постоянного уникального ключа (хеша) базы данных мы можем преобразовать полученную навигационную ссылку в MD5-хеш:


// Получаем навигационную ссылку текущей ИБ
НавигационнаяСсылка = ПолучитьНавигационнуюСсылкуИнформационнойБазы();

// Хешируем полученную строку для создания аналога GUID
Хеширование = Новый ХешированиеДанных(ХешФункция.MD5);
Хеширование.Добавить(НавигационнаяСсылка);
ХешБазы = Строка(Хеширование.ХешСумма);

Сообщить("Уникальный хеш текущей базы: " + ХешБазы);

Полученный хеш гарантированно уникален для конкретного физического размещения базы данных и не изменится, пока базу не перенесут на другой сервер или в другой каталог.

Способ 4. Получение реального GUID базы на сервере 1С:Предприятие

В клиент-серверном варианте у каждой базы есть настоящий внутренний идентификатор (UUID), который хранится в настройках кластера серверов 1С. Прямого метода во встроенном языке для его чтения нет, но мы можем получить его программно через COM-соединение к администрированию сервера.

Проанализируем пример кода, реализующий этот подход:


// Пример получения GUID информационной базы из настроек кластера 1С
Connector = Новый COMОбъект("V83.COMConnector");
// Подключаемся к агенту сервера (укажите имя вашего сервера)
AgentConnection = Connector.ConnectAgent("ИмяСервера1С");
Clusters = AgentConnection.GetClusters();

// Работаем с первым активным кластером
ТекущийКластер = Clusters.GetValue(0);
AgentConnection.Authenticate(ТекущийКластер, "", "");

// Получаем список баз, зарегистрированных в кластере
СписокБаз = AgentConnection.GetInfoBases(ТекущийКластер);
ИмяТекущейБазы = "ИмяНашейБазыНаСервере"; // можно получить из СтрокаСоединенияИнформационнойБазы()

Для Каждого ИБ Из СписокБаз Цикл
    Если ВРег(ИБ.Name) = ВРег(ИмяТекущейБазы) Тогда
        ИстинныйGUIDБазы = ИБ.UUID;
        Сообщить("Реальный GUID базы в кластере серверов: " + ИстинныйGUIDБазы);
        Прервать;
    КонецЕсли;
КонецЦикла;

Обратите внимание, что для выполнения данного кода у пользователя должны быть права на администрирование кластера 1С, а на рабочем сервере должна быть разрешена работа COM-объектов.

Способ 5. Механизм защиты от копирования в файловых базах (DoNotCopy.txt)

Начиная с современных версий платформы 8.3, для файловых баз был внедрен скрытый механизм отслеживания копирования. При создании и первом запуске базы в её каталоге автоматически создается скрытый файл DoNotCopy.txt, содержащий уникальный сгенерированный платформой GUID.

Если вы копируете базу простым копированием файлов без этого служебного файла, платформа сгенерирует новый GUID и запишет его в новый файл DoNotCopy.txt, что позволит системе понять, что база была скопирована.

Распространенное заблуждение: файл списка баз ibases.v8i

Многие начинающие разработчики пытаются прочитать уникальный идентификатор базы из файла списка баз ibases.v8i, который обычно располагается по пути %AppData%\Roaming\1c\1CEstart\ibases.v8i.

Важно понимать: идентификатор ID, содержащийся в файле ibases.v8i, создается локально на конкретном компьютере пользователя в момент добавления базы в список. Если эту же базу прописать на компьютерах десяти разных сотрудников, у каждого из них в файле ibases.v8i будет сгенерирован свой собственный случайный GUID. Поэтому использовать данный файл для точной идентификации ИБ внутри программного кода категорически не рекомендуется.

Рекомендации по защите кода и лицензированию

Если вы ищете способ получения GUID базы для защиты своей разработки от копирования, помните о следующих правилах:

  1. Любой программный GUID внутри базы данных (включая константы БСП) может быть перезаписан или скопирован при загрузке резервной копии базы (файла .dt).
  2. Для надежной привязки коммерческого ПО лучше использовать комбинацию из проверки ИНН организации (из справочника организаций) и сверки с внешним сервером лицензирования по API.
  3. Для работы в закрытых сетях без интернета хорошим решением является генерация файла лицензии на основе уникального хэша оборудования (имени компьютера, серийного номера процессора, сетевых плат) и ИНН компании, подписанного вашим закрытым ключом.
← На главную