МенеджерПолученияЛицензий

Типы · LicenseAcquisitionManager

Менеджер получения программных лицензий на запуск платформы "1С:Предприятие" средствами конфигурации. Объект может быть получен только из свойства глобального контекста ПолучениеЛицензий.

Полное описание, параметры и ограничения

МенеджерПолученияЛицензий (LicenseAcquisitionManager)

МенеджерПолученияЛицензий (LicenseAcquisitionManager)

Доступен, начиная с версии 8.3.20.

Методы:
АдресЦентраЛицензирования (LicensingCenterAddress)
АдресЭлектроннойПочтыЦентраЛицензирования (LicensingCenterEmail)
ЗагрузитьЗапросНаПолучениеЛицензии (LoadLicenseAcquisitionRequest)
НомерТелефонаЦентраЛицензирования (LicensingCenterPhoneNumber)
ПолучитьДопустимыеСтраны (GetAvailableCountries)
ПолучитьДоступностьИспользованияЛицензийДляРазработчика (GetDeveloperLicenseUsageAvailability)
ПолучитьДоступностьПолученияЛицензии (GetLicenseAcquisitionAvailability)
ПолучитьДоступностьЦентраЛицензирования (GetLicensingCenterAvailability)
ПолучитьДоступныеКлючи (GetAvailableKeys)
ПолучитьЛицензионноеСоглашениеРазработчика (GetDeveloperLicenseAgreement)
ПолучитьЛицензиюАвтоматически (AcquireLicenseAutomatically)
ПолучитьЛицензиюНаНосителе (AcquireLicenseFromStorageDevice)
ПолучитьЛицензиюПоТелефону (AcquireLicenseByPhone)
ПолучитьПараметрыПривязкиККомпьютеру (GetComputerFingerprintParameters)
ПредставлениеЦентраЛицензирования (LicensingCenterPresentation)
СоздатьЗапросНаПолучениеЛицензииНаНосителе (CreateLicenseAcquisitionRequestOnStorageDevice)
СоздатьЗапросНаПолучениеЛицензииПоТелефону (CreateLicenseAcquisitionRequestByPhone)
СохранитьЗапросНаПолучениеЛицензии (SaveLicenseAcquisitionRequest)
СформироватьКонтрольнуюСуммуСтрокиКодаПолученияЛицензии (GenerateLicenseAcquisitionCodeStringChecksum)

Описание:

Менеджер получения программных лицензий на запуск платформы "1С:Предприятие" средствами конфигурации.
Объект может быть получен только из свойства глобального контекста ПолучениеЛицензий.

Доступность:

Тонкий клиент, сервер, внешнее соединение.

См. также:
Глобальный контекст, свойство ПолучениеЛицензий

Использование в версии:

Доступен, начиная с версии 8.3.20.

Описание изменено в версии 8.3.27.

Методическая информация

Практические примеры

Свой мастер лицензии: подготовка, сохранение, offline-коды и однократная явная установка

Полный модуль формы собственной новой CF. Свой комплект и свой OS-профиль, только текущий тонкий клиент; реальные активационные методы не подменяются тестовыми PIN. Во время подготовки этого справочника ничто не активировалось.

Где и как запускать

Полный модуль управляемой формы в собственной новой пустой CF. Операции лицензирования именно на клиенте ТонкийКлиент, server guard не активирует лицензии. Не вставляйте полный блок внутрь обработчика.

Подготовка

  1. Для изучения установочных ветвей нужна отдельная собственная Windows VM, новый OS-профиль без сохраненных заявок/лицензий, новая пустая CF УчебноеПолучениеЛицензии85 на платформе8.5.1.1343. Нельзя перенести установочные команды на рабочий ПК. Здесь VM/профиль/база не создавались, ни один метод лицензирования не выполнялся.

  2. Для реального будущего положительного опыта получите законный отдельный комплект/разрешенный PIN именно для этой собственной VM с действительными данными владельца. Чужая лицензия, reserve PIN рабочего комплекта, developer-account secret и вымышленные данные не используются. Если отдельного комплекта нет, изучайте код/контракты; не запускайте установочные команды «для пробы».

  3. В новой CF единственный пользователь Уч85Лицензия, свои учебные права; никаких справочников/документов/регистров/источников/расширений/регламентных заданий/подписок. Учебная внешняя обработка УчебнаяЛицензия85, управляемая форма: вставьте весь основной блок на уровень модуля и свяжите ПриСозданииНаСервере/ПриОткрытии с одноименными событиями.

  4. Создайте команды формы Сведения85,Подготовить85,Сохранить85,ПрочитатьСвое85,Сеть85,ЗапросТелефон85,ЗапросНоситель85,УстановитьАвто85,УстановитьТелефон85,УстановитьНоситель85,ОчиститьФорму85. Всем назначьте одно действие ВыполнитьОперацию85, добавьте явно подписанные кнопки. Ничего не вызывается автоматически при открытии/закрытии, нет команды удаления лицензии.

  5. Создайте реквизиты Строка: Подтверждение85,ПодтверждениеУстановки85,РегНомер85,Пин85,Фамилия85,Имя85,Отчество85,Предприятие85,Страна85,Регион85,Район85,Город85,Улица85,Дом85,Корпус85,Квартира85,Индекс85,АдресЭП85,Ответ85; Булево РазрешитьСеть85. КодЗапроса85,Статус85,Контакты85,ПодсказкиСтран85,Соглашение85 — Строка неограниченной длины, поля только просмотра. Пин85/Ответ85 — режим пароля; формы/значения/скриншоты не публиковать. Маска не шифрует данные в памяти.

  6. Введите точную строку подтверждения МОЯ ОТДЕЛЬНАЯ УЧЕБНАЯ ЛИЦЕНЗИЯ. Свой регистрационный номер/PIN и ФИО/контакты/адрес введите из своего комплекта, не из примера справочника. Страна — действительное значение владельца; подсказки API являются подсказками, а не запретом стран. Для запросов на носителе/по телефону требуется реальный собственный ответ центра именно на сформированный собственный запрос.

  7. Сначала Сведения85, затем Подготовить85. Сохранить85 по желанию записывает настоящие настройки только своего нового OS-профиля; ПрочитатьСвое85 сравнивает свой запрос с его временем/регномером/именем без публикации. PIN native API не сохраняет: после сохранения введите его заново для создания offline-запроса/установки. Существующий кеш в новом профиле вызывает отказ до изменения, не импортируется.

  8. Выберите только один способ: Авто, Телефон или Носитель. Телефон/Носитель сначала формирует приватный КодЗапроса85, который владелец вручную передает центру, затем вводит реальный Ответ85. Код не создает письмо/файл/звонок и не копирует код в системный буфер. Форма сохраняет соответствие способа/запроса внутри одного собственного опыта.

  9. Для проверки Сеть85/УстановитьАвто85 отдельно разрешите реальный интернет в своей VM и отметьте РазрешитьСеть85; никаких маршрутов к production, произвольных remoteagent или сохраненных proxy секретов. Эти методы действительно используют интернет. Для установки отдельно введите УСТАНОВИТЬ МОЮ ЛИЦЕНЗИЮ В ЭТУ VM. Это будущий ручной административный опыт, а не выполненная здесь проверка.

&НаКлиенте
Перем СвойЗапрос85;
&НаКлиенте
Перем Выполняется85;
&НаКлиенте
Перем УстановкаМоглаВыполниться85;
&НаКлиенте
Перем СохранениеМоглоВыполниться85;
&НаКлиенте
Перем СобственныйСпособ85;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойПустойСтенд();
    Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя <> "Уч85Лицензия" Тогда
        ВызватьИсключение "Используйте только собственную новую CF и отдельного пользователя Уч85Лицензия";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Выполняется85 = Ложь;
    УстановкаМоглаВыполниться85 = Ложь;
    СохранениеМоглоВыполниться85 = Ложь;
    СобственныйСпособ85 = "";
    КодЗапроса85 = "";
    Ответ85 = "";
    Пин85 = "";
    Статус85 = "Учебная форма ничего не активирует при открытии";
КонецПроцедуры

&НаСервере
Процедура ПроверитьСеанс85()
    ПроверитьСвойПустойСтенд();
    Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя <> "Уч85Лицензия" Тогда
        ВызватьИсключение "Нужен собственный учебный пользователь";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоюОтветственность85()
    Если Подтверждение85 <> "МОЯ ОТДЕЛЬНАЯ УЧЕБНАЯ ЛИЦЕНЗИЯ" Тогда
        ВызватьИсключение "Нужны собственная лицензия и явное подтверждение: это не имитация активации";
    КонецЕсли;
    #Если ТонкийКлиент Тогда
    #Иначе
        ВызватьИсключение "Урок ограничен локальным тонким клиентом собственной Windows VM";
    #КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ТолькоЦифры85(Текст)
    Если ТипЗнч(Текст) <> Тип("Строка") Или Текст = "" Тогда
        Возврат Ложь;
    КонецЕсли;
    Для Номер = 1 По СтрДлина(Текст) Цикл
        Если СтрНайти("0123456789", Сред(Текст, Номер, 1)) = 0 Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат Истина;
КонецФункции

&НаКлиенте
Процедура ПроверитьСвойЗапрос85()
    ПроверитьСвоюОтветственность85();
    Если СвойЗапрос85 = Неопределено Тогда
        ВызватьИсключение "Сначала подготовьте собственный запрос из своего комплекта";
    КонецЕсли;
    Если СвойЗапрос85.IPАдресАгента <> "" Или СвойЗапрос85.Порт <> 0 Или СвойЗапрос85.ДляВсехПользователей
        Или СвойЗапрос85.РегистрационныйНомер <> РегНомер85 Тогда
        ВызватьИсключение "Только текущий клиент и собственный комплект; параметры не подменяются после подготовки";
    КонецЕсли;
    Если УстановкаМоглаВыполниться85 Тогда
        ВызватьИсключение "Установка уже могла выполниться. Не повторяйте; проверьте итог вручную";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОперацию85(Команда)
    Если Выполняется85 Тогда
        ВызватьИсключение "Предыдущая операция еще выполняется";
    КонецЕсли;
    Если СтрРазделить("Сведения85,Подготовить85,Сохранить85,ПрочитатьСвое85,Сеть85,ЗапросТелефон85,ЗапросНоситель85,УстановитьАвто85,УстановитьТелефон85,УстановитьНоситель85,ОчиститьФорму85", ",").Найти(Команда.Имя) = Неопределено Тогда
        ВызватьИсключение "Неизвестная учебная команда";
    КонецЕсли;
    Выполняется85 = Истина;
    Попытка
        ПроверитьСеанс85();
        #Если ТонкийКлиент Тогда
            Если Команда.Имя = "ОчиститьФорму85" Тогда
                Пин85 = "";
                Ответ85 = "";
                КодЗапроса85 = "";
                Если СвойЗапрос85 <> Неопределено Тогда
                    СвойЗапрос85.Пинкод = "";
                КонецЕсли;
                Статус85 = "Поля формы очищены. Установленные лицензии и сохраненные настройки не удаляются";
            ИначеЕсли Команда.Имя = "Сведения85" Тогда
                ПроверитьСвоюОтветственность85();
                Менеджер = ПолучениеЛицензий;
                Контакты85 = Менеджер.ПредставлениеЦентраЛицензирования("ru") + Символы.ПС
                    + Менеджер.АдресЦентраЛицензирования() + Символы.ПС
                    + Менеджер.АдресЭлектроннойПочтыЦентраЛицензирования("ru") + Символы.ПС
                    + Менеджер.НомерТелефонаЦентраЛицензирования("ru");
                Страны = Менеджер.ПолучитьДопустимыеСтраны();
                ПодсказкиСтран85 = "";
                Для Каждого Страна Из Страны Цикл
                    Если Страна.Представление.Количество() > 0 Тогда
                        ПодсказкиСтран85 = ПодсказкиСтран85 + Страна.Код + " — " + Страна.Представление[0] + Символы.ПС;
                    КонецЕсли;
                КонецЦикла;
                Привязка = Менеджер.ПолучитьПараметрыПривязкиККомпьютеру("", 0);
                Если ТипЗнч(Привязка) <> Тип("ПараметрыПривязкиККомпьютеруПолученияЛицензий") Тогда
                    ВызватьИсключение "Native данные текущего клиента не получены";
                КонецЕсли;
                Если Привязка.ИмяКомпьютера = "" Или Привязка.ОС = "" Или Привязка.Процессор = "" Или Привязка.Представление = ""
                    Или Привязка.ОперативнаяПамять <= 0 Или ТипЗнч(Привязка.СписокОборудования) <> Тип("ФиксированныйМассив") Тогда
                    ВызватьИсключение "Не получен полный паспорт только своей VM; подробности не публикуются";
                КонецЕсли;
                Для Каждого Оборудование Из Привязка.СписокОборудования Цикл
                    Если ТипЗнч(Оборудование) <> Тип("Строка") Тогда
                        ВызватьИсключение "Native список оборудования должен содержать строки";
                    КонецЕсли;
                КонецЦикла;
                Ключи = Менеджер.ПолучитьДоступныеКлючи("", 0);
                Если ТипЗнч(Ключи) <> Тип("Массив") Тогда
                    ВызватьИсключение "Native список доступных ключей не получен";
                КонецЕсли;
                Соглашение85 = Менеджер.ПолучитьЛицензионноеСоглашениеРазработчика("developer.1c.ru");
                Если Менеджер.СформироватьКонтрольнуюСуммуСтрокиКодаПолученияЛицензии("") <> "000"
                    Или Менеджер.СформироватьКонтрольнуюСуммуСтрокиКодаПолученияЛицензии("ABC") <> "" Тогда
                    ВызватьИсключение "Граничные случаи checksum не совпали с native контрактом";
                КонецЕсли;
                Статус85 = "Получены контакты, подсказки стран и паспорт собственной VM. Доступных ключей: " + Строка(Ключи.Количество());
            ИначеЕсли Команда.Имя = "Подготовить85" Тогда
                ПроверитьСвоюОтветственность85();
                Если СвойЗапрос85 <> Неопределено Или УстановкаМоглаВыполниться85 Или СохранениеМоглоВыполниться85 Тогда
                    ВызватьИсключение "Для данного опыта запрос создается только один раз";
                КонецЕсли;
                Если ПустаяСтрока(РегНомер85) Или ПустаяСтрока(Пин85) Или ПустаяСтрока(Фамилия85) Или ПустаяСтрока(Имя85)
                    Или ПустаяСтрока(Страна85) Или ПустаяСтрока(АдресЭП85) Или ПустаяСтрока(Город85) Или ПустаяСтрока(Индекс85) Тогда
                    ВызватьИсключение "Требуются действительные данные собственного комплекта/владельца; вымышленные PIN не используются";
                КонецЕсли;
                Менеджер = ПолучениеЛицензий;
                Если Менеджер.ЗагрузитьЗапросНаПолучениеЛицензии() <> Неопределено Тогда
                    ВызватьИсключение "В собственном новом профиле уже есть сохраненные данные: не читаем/не заменяем чужой запрос";
                КонецЕсли;
                СвойЗапрос85 = Новый ЗапросНаПолучениеЛицензии;
                СвойЗапрос85.IPАдресАгента = "";
                СвойЗапрос85.Порт = 0;
                СвойЗапрос85.ДляВсехПользователей = Ложь;
                СвойЗапрос85.ВремяЗапроса = ТекущаяДата();
                СвойЗапрос85.РегистрационныйНомер = РегНомер85;
                СвойЗапрос85.Пинкод = Пин85;
                СвойЗапрос85.СтарыйПинкод = "";
                СвойЗапрос85.Фамилия = Фамилия85;
                СвойЗапрос85.Имя = Имя85;
                СвойЗапрос85.Отчество = Отчество85;
                СвойЗапрос85.Предприятие = Предприятие85;
                СвойЗапрос85.Страна = Страна85;
                СвойЗапрос85.Регион = Регион85;
                СвойЗапрос85.Район = Район85;
                СвойЗапрос85.Город = Город85;
                СвойЗапрос85.Улица = Улица85;
                СвойЗапрос85.Дом = Дом85;
                СвойЗапрос85.Корпус = Корпус85;
                СвойЗапрос85.Квартира = Квартира85;
                СвойЗапрос85.Индекс = Индекс85;
                СвойЗапрос85.АдресЭлектроннойПочты = АдресЭП85;
                СвойЗапрос85.ПараметрыПривязки = Менеджер.ПолучитьПараметрыПривязкиККомпьютеру("", 0);
                СвойЗапрос85.ИмяУчетнойЗаписи = "";
                Если СвойЗапрос85.ПорталРазработчиков <> "" Или СвойЗапрос85.ПарольУчетнойЗаписи <> "" Тогда
                    ВызватьИсключение "Новый запрос не соответствует обычному собственному комплекту; readonly developer поля не изменяем";
                КонецЕсли;
                Пин85 = "";
                Доступность = Менеджер.ПолучитьДоступностьПолученияЛицензии(СвойЗапрос85);
                Если Не Доступность.Доступно Тогда
                    Если Доступность.ОписаниеОшибки = "" Тогда
                        Статус85 = "Локальный каталог лицензий недоступен, native описание отсутствует";
                    Иначе
                        Статус85 = "Локальный каталог лицензий недоступен, native описание непустое; подробности приватны";
                    КонецЕсли;
                    СвойЗапрос85.Пинкод = "";
                    ВызватьИсключение "Нет подтверждения возможности записи в собственный профиль";
                КонецЕсли;
                Статус85 = "Подготовлен только собственный запрос. Проверка каталога не активировала лицензию";
            ИначеЕсли Команда.Имя = "Сохранить85" Тогда
                ПроверитьСвойЗапрос85();
                Если СохранениеМоглоВыполниться85 Тогда
                    ВызватьИсключение "Сохранение уже могло выполниться; не повторяем автоматически";
                КонецЕсли;
                СохранениеМоглоВыполниться85 = Истина;
                ПолучениеЛицензий.СохранитьЗапросНаПолучениеЛицензии(СвойЗапрос85);
                СвойЗапрос85.Пинкод = "";
                Статус85 = "В собственном новом профиле сохранены данные запроса. PIN не сохраняется native API";
            ИначеЕсли Команда.Имя = "ПрочитатьСвое85" Тогда
                ПроверитьСвойЗапрос85();
                Если Не СохранениеМоглоВыполниться85 Тогда
                    ВызватьИсключение "Нет собственного сохранения для проверки";
                КонецЕсли;
                Прочитанный = ПолучениеЛицензий.ЗагрузитьЗапросНаПолучениеЛицензии();
                Если Прочитанный = Неопределено Тогда
                    ВызватьИсключение "Свое сохранение не прочитано";
                КонецЕсли;
                Если Прочитанный.РегистрационныйНомер <> СвойЗапрос85.РегистрационныйНомер
                    Или Прочитанный.ВремяЗапроса <> СвойЗапрос85.ВремяЗапроса Или Прочитанный.Фамилия <> СвойЗапрос85.Фамилия
                    Или Прочитанный.Имя <> СвойЗапрос85.Имя Или Прочитанный.IPАдресАгента <> "" Или Прочитанный.ДляВсехПользователей
                    Или Прочитанный.Пинкод <> "" Тогда
                    ВызватьИсключение "Сохраненные данные не совпали с собственным опытом или содержат PIN; не используем их";
                КонецЕсли;
                Статус85 = "Свой запрос прочитан назад, PIN отсутствует. Восстановление из чужого кеша не выполнялось";
            ИначеЕсли Команда.Имя = "Сеть85" Тогда
                ПроверитьСвойЗапрос85();
                Если Не РазрешитьСеть85 Тогда
                    ВызватьИсключение "Проверка действительно обращается в интернет: требуется отдельное ручное разрешение своей VM";
                КонецЕсли;
                Центр = ПолучениеЛицензий.ПолучитьДоступностьЦентраЛицензирования();
                Если Центр.Доступен Тогда
                    Статус85 = "Центр доступен с текущего клиента; лицензию это не получило";
                ИначеЕсли Центр.ОписаниеОшибки <> "" Тогда
                    Статус85 = "Центр недоступен; подробное native описание не раскрывается";
                Иначе
                    Статус85 = "Центр недоступен, native описание отсутствует";
                КонецЕсли;
                ДляРазработчика = ПолучениеЛицензий.ПолучитьДоступностьИспользованияЛицензийДляРазработчика();
                Статус85 = Статус85 + "; предложение developer-лицензии в диалоге: " + Строка(ДляРазработчика);
            ИначеЕсли Команда.Имя = "ЗапросТелефон85" Или Команда.Имя = "ЗапросНоситель85" Тогда
                ПроверитьСвойЗапрос85();
                Если СобственныйСпособ85 <> "" Тогда
                    ВызватьИсключение "Выбранный способ нельзя менять в данном опыте";
                КонецЕсли;
                Если СвойЗапрос85.Пинкод = "" Тогда
                    Если ПустаяСтрока(Пин85) Тогда
                        ВызватьИсключение "Введите собственный PIN заново, сохранение его не восстанавливает";
                    КонецЕсли;
                    СвойЗапрос85.Пинкод = Пин85;
                    Пин85 = "";
                КонецЕсли;
                Если Команда.Имя = "ЗапросТелефон85" Тогда
                    КодЗапроса85 = ПолучениеЛицензий.СоздатьЗапросНаПолучениеЛицензииПоТелефону(СвойЗапрос85);
                    Если Не ТолькоЦифры85(КодЗапроса85) Тогда
                        ВызватьИсключение "Native телефонный запрос должен содержать только десятичные цифры";
                    КонецЕсли;
                    Контрольная = ПолучениеЛицензий.СформироватьКонтрольнуюСуммуСтрокиКодаПолученияЛицензии(КодЗапроса85);
                    Если СтрДлина(Контрольная) <> 3 Или Не ТолькоЦифры85(Контрольная) Тогда
                        ВызватьИсключение "Контрольная сумма native телефонного запроса неверна";
                    КонецЕсли;
                    Статус85 = "Свой запрос для приватной ручной передачи; checksum: " + Контрольная;
                    СобственныйСпособ85 = "Телефон";
                Иначе
                    КодЗапроса85 = ПолучениеЛицензий.СоздатьЗапросНаПолучениеЛицензииНаНосителе(СвойЗапрос85);
                    Если КодЗапроса85 = "" Тогда
                        ВызватьИсключение "Native запрос на носителе пуст";
                    КонецЕсли;
                    Для Индекс = 1 По СтрДлина(КодЗапроса85) Цикл
                        Если КодСимвола(КодЗапроса85, Индекс) > 127 Тогда
                            ВызватьИсключение "Native запрос на носителе должен состоять из ASCII символов";
                        КонецЕсли;
                    КонецЦикла;
                    Статус85 = "Свой запрос для приватной ручной передачи в центр; файл/email автоматически не создаются";
                    СобственныйСпособ85 = "Носитель";
                КонецЕсли;
            Иначе
                ПроверитьСвойЗапрос85();
                Если ПодтверждениеУстановки85 <> "УСТАНОВИТЬ МОЮ ЛИЦЕНЗИЮ В ЭТУ VM" Тогда
                    ВызватьИсключение "Это настоящая установка файла лицензии, а не тренировка на фиктивном PIN";
                КонецЕсли;
                Если СвойЗапрос85.Пинкод = "" Тогда
                    Если ПустаяСтрока(Пин85) Тогда
                        ВызватьИсключение "Нужен действительный собственный PIN";
                    КонецЕсли;
                    СвойЗапрос85.Пинкод = Пин85;
                    Пин85 = "";
                КонецЕсли;
                Доступность = ПолучениеЛицензий.ПолучитьДоступностьПолученияЛицензии(СвойЗапрос85);
                Если Не Доступность.Доступно Тогда
                    ВызватьИсключение "Локальная установка недоступна; чужие каталоги и remoteagent не используются";
                КонецЕсли;
                Если Команда.Имя = "УстановитьАвто85" Тогда
                    Если СобственныйСпособ85 <> "" Или Не РазрешитьСеть85 Тогда
                        ВызватьИсключение "Авто-установка требует отдельного разрешения сети и отсутствия выбранного offline способа";
                    КонецЕсли;
                    СобственныйСпособ85 = "Авто";
                    УстановкаМоглаВыполниться85 = Истина;
                    ПолучениеЛицензий.ПолучитьЛицензиюАвтоматически(СвойЗапрос85);
                ИначеЕсли Команда.Имя = "УстановитьТелефон85" Тогда
                    Если СобственныйСпособ85 <> "Телефон" Или Не ТолькоЦифры85(Ответ85) Тогда
                        ВызватьИсключение "Требуется действительный телефонный ответ именно на свой ранее созданный запрос";
                    КонецЕсли;
                    УстановкаМоглаВыполниться85 = Истина;
                    ПолучениеЛицензий.ПолучитьЛицензиюПоТелефону(СвойЗапрос85, Ответ85);
                ИначеЕсли Команда.Имя = "УстановитьНоситель85" Тогда
                    Если СобственныйСпособ85 <> "Носитель" Или Ответ85 = "" Тогда
                        ВызватьИсключение "Требуется действительный ответ на носителе именно для своего запроса";
                    КонецЕсли;
                    Для Индекс = 1 По СтрДлина(Ответ85) Цикл
                        Если КодСимвола(Ответ85, Индекс) > 127 Тогда
                            ВызватьИсключение "Ответ на носителе должен состоять из ASCII символов";
                        КонецЕсли;
                    КонецЦикла;
                    УстановкаМоглаВыполниться85 = Истина;
                    ПолучениеЛицензий.ПолучитьЛицензиюНаНосителе(СвойЗапрос85, Ответ85);
                КонецЕсли;
                СвойЗапрос85.Пинкод = "";
                Пин85 = "";
                Ответ85 = "";
                КодЗапроса85 = "";
                Статус85 = "Native метод установки вернулся без исключения. Применение лицензии проверьте вручную в О программе; повторный вызов в этой форме запрещен";
            КонецЕсли;
        #Иначе
            ВызватьИсключение "Урок выполняется только в собственном локальном тонком клиенте";
        #КонецЕсли;
    Исключение
        Пин85 = "";
        Ответ85 = "";
        Если СвойЗапрос85 <> Неопределено Тогда
            СвойЗапрос85.Пинкод = "";
        КонецЕсли;
        Статус85 = "Операция не подтверждена. PIN/ответ очищены; native секреты и подробности ошибки не публикуются. Повторной установки нет";
        Сообщить(Статус85);
    КонецПопытки;
    Выполняется85 = Ложь;
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Guard проверяет новую пустую CF/отдельного пользователя/отсутствие расширений. Основные операции клиентские и ограничены ТонкийКлиент; server API не применяются к неизвестному удаленному агенту. IPАдресАгента пуст, Порт0, ДляВсехПользователей=Ложь.

  2. Сведения85 получает сам МенеджерПолученияЛицензий из readonly ПолучениеЛицензий. Контакты отображаются владельцу, URL не открывается. Допустимые страны содержат Код Строка и Представление ФиксированныйМассив, поэтому основной вариант берется [0] только после проверки количества.

  3. Native паспорт именно текущей своей VM проверяется по шести настоящим readonly свойствам: имя/ОС/процессор/представление непустые, RAM в байтах положительная, список оборудования фиксированный и содержит строки. Ни raw fingerprint, ни серийные номера/устройства не выводятся. Список доступных ключей используется только как список/количество: неоднозначный native тип его элементов не подменяется другим типом.

  4. Текст developer-соглашения показывается перед любым потенциальным developer-процессом, но здесь авторизация developer/активация developer не реализованы: собственный обычный комплект не заменяется developer-account. ПорталРазработчиков и ПарольУчетнойЗаписи по справке8.5.1.1343 только читаются; неожиданно непустые значения нового запроса вызывают отказ, а не присваивание. Доступность developer-предложения позже остается отдельным Булево, не доказательством выданной лицензии.

  5. Подготовить85 создает настоящий Новый ЗапросНаПолучениеЛицензии из собственных полей формы и native привязки. Неизвестный исходный объект не нужен. ПолучитьДоступностьПолученияЛицензии проверяет права записи локального профиля, а не выдает файл; ошибка не раскрывает native пути/секреты.

  6. Сохранить85 ставит флаг возможного сохранения до вызова, сохраняет реальные настройки, очищает PIN в памяти. ПрочитатьСвое85 проверяет отсутствие Неопределено, точные собственные поля/время/область и отсутствие PIN. Чужой кеш, а также отсутствие своего сохранения, не дают положительного результата.

  7. Сеть85 требует отдельного разрешения: availability центра содержит Доступен и ОписаниеОшибки; описание рассматривается только как пустое/непустое. Developer-availability — отдельный запрос с требованиями локали/ресурсов, не entitlement и не факт наличия файла.

  8. Телефонный запрос реально создается manager методом, должен содержать цифры. Checksum возвращает три цифры; пустая строка дает000, нецифроваяABC дает пустую строку. Успешная checksum не валидирует лицензию и не фабрикует ответ центра.

  9. Носитель реально формирует строку ASCII, данные остаются в приватном поле формы. Установочные ответы вводятся человеком только для соответствующего своего способа; телефон — десятичные цифры, носитель — непустой ASCII. Код не придумывает response, PIN или адрес лицензирующего сервера.

  10. Перед настоящим вызовом установки ставится УстановкаМоглаВыполниться85. Возвращаемого Булево у этих native methods нет: отсутствие исключения не подменяется проверкой готовой лицензии в сеансе. Повторный вызов/автоматический retry в этой форме запрещен; применения файла проверьте отдельно вручную в О программе.

  11. Любое исключение очищает PIN/ответ, оставляет флаги неизвестного исхода и не публикует ОписаниеОшибки() с персональными данными. ОчиститьФорму85 удаляет лишь свои текстовые поля из памяти, не установленный файл и не сохраненный native запрос. При закрытии также нет записи/удаления/повторной активации.

Как проверить результат

  1. Без точного подтверждения, неправильной версии/пользователя/бизнес-метадаты форма должна отказать до вызовов активации. При открытии отсутствуют получение/сохранение/восстановление лицензии.

  2. Страны: Представление является массивом, [0] основное название, Код двухбуквенная строка. Fingerprint остается приватным; сообщение содержит только число доступных ключей, не HW идентификаторы.

  3. При отсутствии действительного своего PIN/регномера/данных Подготовить85 отказывается. Нового физического файла лицензии после одной проверки доступности быть не должно.

  4. Сохранить85→ПрочитатьСвое85 должен прочитать собственные сведения с тем же временем и пустым PIN. Повторное Сохранить85 запрещено флагом; отсутствие исходного сохранения/несовпадение собственных полей никогда не сообщает успех.

  5. При неотмеченном РазрешитьСеть85 Сеть85/авто-активация не обращаются в интернет. Ложь developer-availability не означает, что обычная лицензия невалидна; Истина не означает ее получения.

  6. Проверка checksum пустого и ABC имеет точные native результаты000 и пустая строка. Телефонный запрос собственной лицензии дает3цифры checksum, но сам response должен получить владелец через настоящий центр, не генератор учебного кода.

  7. Положительный install проверять только на отдельно разрешенном own комплекте: native method вернулся без исключения, затем вручную проверить сведения о собственной лицензии в О программе. Не проверялось здесь; сообщением формы нельзя доказывать работоспособность/лимиты лицензии.

  8. После неизвестного исхода установки повторный установочный вызов всегда отказан. PIN/ответ не остаются в полях. Не снимайте флаг ради повторения и не удаляйте чужие .lic файлы; результаты выясняются отдельно владельцем.

Ожидаемый результат

Форма различает локальные сведения, право записи, сохранение own запроса без PIN, реальные offline-коды, интернет-доступность и однократную явно подтвержденную установку своей лицензии. Фиктивные PIN/ответы, автоматическое получение при открытии, чужие данные и повтор неизвестного исхода исключены.

На что обратить внимание

  1. Все методы приведены для будущего ручного опыта и не исполнялись. Никаких actual activation/license file writes/network/OS hardware reads в этой работе нет; runtimeVerifiedScenarios=0. Статические проверки не доказали запуск лицензии в1С.

  2. Установочные методы действительно обращаются к центру или создают .lic файл. Запуск на рабочем ПК/с reserve PIN рабочего комплекта может затронуть право использования. Нужен отдельный собственный допустимый комплект; искусственные значения не превращают вызов в безопасную симуляцию.

  3. СохранитьЗапросНаПолучениеЛицензии записывает данные профиля, но не PIN. НаНосителе/ПоТелефону по native не используют часть свойств destination/IP/имяфайла; положительный путь все равно ограничен текущим клиентом собственной VM и реальным ответом на ее запрос.

  4. Native ПолучитьДоступныеКлючи описывает элементы как параметры компьютера, тогда как отдельный тип параметров ключа существует. В этом уроке нельзя трактовать каждый элемент как ПараметрыПривязкиККлючу и навешивать его свойства без доказательства; ключевые поля в PRIMARY не включены.

  5. Маска пароля и очистка строк не являются криптографическим удалением памяти, шифрованием profile-кеша или полным удалением предыдущих снимков UI. Не записывайте экран/логи, не публикуйте форму и не экспортируйте запрос/ответ. Пример не вызывает clipboard, email, arbitrary remoteagent или диагностические дампы.

  6. В тонком клиенте native developer соглашение доступно; серверный контекст этого метода запрещен в installed help. Предложение developer-лицензии и интернет availability не подтверждают наличие активированной лицензии или права конкретного пользователя.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.