Как уникально идентифицировать мобильное устройство в приложении 1С без использования IMEI

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

При разработке мобильных приложений на платформе 1С:Предприятие часто возникает задача надежной идентификации мобильного устройства. Это необходимо для организации программного лицензирования, привязки рабочих мест к конкретным терминалам сбора данных (ТСД), планшетам или смартфонам, а также для обеспечения безопасности обмена данными. Исторически первым решением, которое приходит на ум разработчикам, является получение аппаратного кода IMEI. Однако в современных реалиях этот способ не просто устарел, а стал технически невозможным. Рассмотрим, почему так произошло, и разберем по шагам современные надежные альтернативы.

Почему получить IMEI в современном мобильном приложении больше невозможно

В старых версиях операционной системы Android (до версии 9 включительно) разработчики могли относительно легко получить доступ к IMEI (International Mobile Equipment Identity), используя стандартные системные вызовы и запрашивая у пользователя разрешение READ_PHONE_STATE. Однако со временем политика конфиденциальности Google претерпела кардинальные изменения.

Начиная с Android 10, Google полностью заблокировал доступ обычных приложений к неизменяемым аппаратным идентификаторам устройства (так называемым non-resettable hardware identifiers), к которым относятся IMEI, серийный номер процессора/платы (Build.getSerial()) и MAC-адрес сетевой карты. Проанализируем ключевые ограничения, с которыми сталкивается разработчик мобильного приложения 1С сегодня:

  1. Жесткие требования к безопасности: Доступ к разрешению READ_PHONE_STATE теперь зарезервирован исключительно за системными приложениями (которые предустановлены производителем в прошивку устройства) или специальными приложениями операторов сотовой связи.
  2. Ограничения в Google Play: Даже если вы попытаетесь обойти ограничения на старых версиях SDK, ваше приложение гарантированно не пройдет модерацию в официальных магазинах приложений при попытке запросить подобные конфиденциальные данные без веских на то оснований.
  3. Проблема отсутствия SIM-модулей: На многих планшетах и специализированных ТСД, используемых на складах и в торговле, физически отсутствует SIM-модуль, а значит, у них в принципе нет кода IMEI.

Именно поэтому нам необходимо отказаться от идеи использования IMEI и рассмотреть другие, более современные и безопасные способы идентификации устройств.

Альтернатива 1: Использование Android ID (новые правила игры)

В качестве первой и наиболее близкой альтернативы разработчики часто используют системный идентификатор Android ID (также известный как SSAID). Это 64-битное число, которое операционная система генерирует при первой настройке устройства.

Однако здесь важно учитывать технические нюансы безопасности, появившиеся начиная с Android 8.0 (Oreo):

Поскольку во встроенном языке 1С нет прямого метода для чтения Android ID, нам придется использовать внешнюю компоненту (написанную на Java/Kotlin) или вызывать нативный код Android через механизм интеграции. Посмотрим на пример концептуальной схемы работы с внешней компонентой для получения системного идентификатора:


// Пример вызова метода внешней компоненты для получения Android ID
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаИдентификации", "DeviceIDLib", ТипВнешнейКомпоненты.Native) Тогда
    Компонента = Новый("AddIn.DeviceIDLib.AndroidHelper");
    СистемныйID = Компонента.ПолучитьAndroidID();
    ЗаписатьЛогИдентификации(СистемныйID);
КонецЕсли;

Альтернатива 2: Использование штатного свойства 1С «ИдентификаторКлиента»

Платформа 1С предлагает встроенный инструмент для получения уникального идентификатора без необходимости писать внешние компоненты и запрашивать у пользователя специальные системные разрешения. Речь идет о свойстве ИдентификаторКлиента объекта СистемнаяИнформация.

Рассмотрим пример кода, с помощью которого мы можем быстро считать этот идентификатор на мобильном устройстве:


СисИнфо = Новый СистемнаяИнформация;
УникальныйIDУстройства = СисИнфо.ИдентификаторКлиента;
Сообщить("Идентификатор устройства: " + УникальныйIDУстройства);

Важные особенности поведения этого метода, о которых должен знать каждый разработчик:

  1. На платформе Android: Идентификатор генерируется платформой при первой установке приложения 1С. Он достаточно стабилен, однако гарантированно изменится, если пользователь зайдет в настройки смартфона и нажмет кнопку «Очистить данные приложения», либо полностью удалит мобильное приложение и установит его заново.
  2. На платформе iOS: В силу жесткой политики Apple в отношении конфиденциальности пользователей, идентификатор клиента сбрасывается и генерируется заново при каждой переустановке приложения. Отслеживать устройство по нему в долгосрочной перспективе на iOS невозможно.

Альтернатива 3: Лучшая практика — генерация собственного UUID при первом запуске

Для создания максимально стабильной, кроссплатформенной и независимой от капризов операционных систем архитектуры авторизации устройств рекомендуется использовать метод генерации собственного уникального идентификатора (UUID) с его последующим долгосрочным сохранением.

Проанализируем этот алгоритм по шагам:

Шаг 1. Генерация и сохранение идентификатора при первом запуске

При первом старте мобильного приложения мы проверяем, сохранен ли уже наш собственный идентификатор в локальных настройках (например, в константах мобильного приложения или файловой системе устройства). Если идентификатор отсутствует, мы генерируем его программно:


// Проверяем наличие ранее сгенерированного UUID
НашИдентификатор = ВосстановитьДанныеВыбора("УникальныйИдентификаторУстройства");

Если НашИдентификатор = Неопределено Тогда
    // Генерируем новый UUID стандартными средствами 1С
    НовыйUUID = Новый УникальныйИдентификатор;
    НашИдентификатор = Строка(НовыйUUID);
    
    // Сохраняем сгенерированный идентификатор в локальное хранилище настроек
    СохранитьДанныеВыбора("УникальныйИдентификаторУстройства", НашИдентификатор);
КонецЕсли;

// Теперь переменная НашИдентификатор содержит надежный UUID устройства

Шаг 2. Авторизация устройства в центральной базе

Чтобы связать сгенерированный UUID с конкретным физическим пользователем или рабочим местом в центральной базе 1С, используются следующие безопасные сценарии:

Шаг 3. Вспомогательное использование Push-токенов

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


ИдентификаторPush = МенеджерДоставляемыхУведомлений.ПолучитьИдентификаторПодписчикаУведомлений();

Этот токен уникален для конкретного устройства и приложения, однако он также имеет свойство изменяться при обновлении сервисов Google Play или Apple Push Notification Service (APNs). Поэтому используйте его только в качестве вспомогательного канала связи, но не как единственный ключ для лицензирования или строгой идентификации.

Используя комбинацию из генерации собственного UUID и привязки через QR-коды, мы получаем надежную, безопасную систему идентификации, которая не зависит от версий Android, наличия SIM-карт или ограничений безопасности операционных систем.

← На главную