В процессе разработки в среде 1С:Предприятие часто возникает необходимость однозначно идентифицировать конкретную информационную базу. Это может потребоваться для решения самых разных задач: организации обмена данными, логирования, привязки лицензий программных продуктов, защиты обработок от несанкционированного копирования или разграничения работы регламентных заданий в тестовых и рабочих контурах.
Однако в самой платформе 1С:Предприятие нет единого универсального понятия «GUID базы данных», доступного одной простой функцией. В зависимости от архитектуры (файловая или клиент-серверная), а также от используемых библиотек (например, БСП), разработчики применяют разные подходы. В этой статье мы подробно разберем все надежные способы программного получения уникального идентификатора информационной базы.
Если ваша конфигурация разработана на базе БСП (а это практически все типовые решения от 1С: «Бухгалтерия предприятия», «Управление торговлей», «ERP Управление предприятием» и др.), то задача существенно упрощается. В составе библиотек уже предусмотрен готовый механизм идентификации.
Для определения уникального идентификатора мы можем обратиться к специальной константе ИдентификаторИнформационнойБазы. Разберем по шагам, как получить это значение:
// Получаем уникальный идентификатор из константы БСП
ЗначениеКонстанты = Константы.ИдентификаторИнформационнойБазы.Получить();
Если ЗначениеЗаполнено(ЗначениеКонстанты) Тогда
GUIDБазы = Строка(ЗначениеКонстанты);
Сообщить("GUID текущей базы данных (БСП): " + GUIDБазы);
Иначе
Сообщить("Идентификатор базы еще не инициализирован.");
КонецЕсли;
Важная особенность: этот идентификатор автоматически генерируется при первом запуске информационной базы. При копировании базы стандартными средствами (например, через резервную копию) при первом запуске система БСП обычно задает пользователю вопрос: «Информационная база была перемещена или восстановлена из резервной копии?». Если пользователь отвечает, что это копия, БСП автоматически перезаписывает значение константы ИдентификаторИнформационнойБазы новым GUID, чтобы избежать конфликтов обмена данными и заблокировать регламентные задания в копии.
Если в вашей конфигурации настроен план обмена с признаком «Распределенная информационная база» (РИБ), то уникальный идентификатор главного узла или текущего узла (ЭтотУзел) может выступать в роли надежного GUID базы.
Давайте посмотрим на пример кода, позволяющий получить идентификатор текущего узла обмена:
// Выбираем подходящий план обмена, поддерживающий РИБ
ПланОбменаИмя = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат;
// Получаем ссылку на текущий узел информационной базы
СсылкаЭтотУзел = ПланОбменаИмя.ЭтотУзел();
// Считываем уникальный идентификатор узла
GUIDУзла = Строка(СсылкаЭтотУзел.УникальныйИдентификатор());
Сообщить("GUID текущего узла распределенной базы: " + GUIDУзла);
Этот способ хорош тем, что идентификатор узла жестко зашит в таблицах базы данных и не зависит от сетевого окружения или настроек клиентского компьютера.
Что делать, если конфигурация написана «с нуля», в ней нет БСП и не используются планы обмена? В таком случае мы можем использовать стандартную функцию платформы ПолучитьНавигационнуюСсылкуИнформационнойБазы(). Данный метод возвращает уникальный URI текущей ИБ.
Рассмотрим, какие данные возвращает этот метод:
e1c://file/C/Bases/Trade (локальный или сетевой UNC-путь).e1c://server/ServerName/BaseName, где четко указаны имя сервера 1С и имя базы в кластере.Для получения условно постоянного уникального ключа (хеша) базы данных мы можем преобразовать полученную навигационную ссылку в MD5-хеш:
// Получаем навигационную ссылку текущей ИБ
НавигационнаяСсылка = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
// Хешируем полученную строку для создания аналога GUID
Хеширование = Новый ХешированиеДанных(ХешФункция.MD5);
Хеширование.Добавить(НавигационнаяСсылка);
ХешБазы = Строка(Хеширование.ХешСумма);
Сообщить("Уникальный хеш текущей базы: " + ХешБазы);
Полученный хеш гарантированно уникален для конкретного физического размещения базы данных и не изменится, пока базу не перенесут на другой сервер или в другой каталог.
В клиент-серверном варианте у каждой базы есть настоящий внутренний идентификатор (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-объектов.
Начиная с современных версий платформы 8.3, для файловых баз был внедрен скрытый механизм отслеживания копирования. При создании и первом запуске базы в её каталоге автоматически создается скрытый файл DoNotCopy.txt, содержащий уникальный сгенерированный платформой GUID.
Если вы копируете базу простым копированием файлов без этого служебного файла, платформа сгенерирует новый GUID и запишет его в новый файл DoNotCopy.txt, что позволит системе понять, что база была скопирована.
Многие начинающие разработчики пытаются прочитать уникальный идентификатор базы из файла списка баз ibases.v8i, который обычно располагается по пути %AppData%\Roaming\1c\1CEstart\ibases.v8i.
Важно понимать: идентификатор ID, содержащийся в файле ibases.v8i, создается локально на конкретном компьютере пользователя в момент добавления базы в список. Если эту же базу прописать на компьютерах десяти разных сотрудников, у каждого из них в файле ibases.v8i будет сгенерирован свой собственный случайный GUID. Поэтому использовать данный файл для точной идентификации ИБ внутри программного кода категорически не рекомендуется.
Если вы ищете способ получения GUID базы для защиты своей разработки от копирования, помните о следующих правилах:
.dt).