Необратимо запретить запись только на своей одноразовой учебной метке

Учебные задачи

ОПАСНО: после метода физическая метка НЕОБРАТИМО становится неперезаписываемой. Это отдельный рецепт с явным подтверждением, не проверка возможностей и не рекомендуемый обычный учебный шаг.

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

Полный клиентский модуль мобильной учебной формы. Только вручную подтверждённая операция на своём одноразовом NFC-носителе; не выполнялась здесь.

Подготовка

  1. ОПЕРАЦИЯ МЕНЯЕТ ФИЗИЧЕСКУЮ МЕТКУ. Только собственная дешёвая одноразовая учебная NFC-метка без ценных данных. Не запускайте на пропуске, платёжной карте, рабочем носителе или чужой метке.

  2. В отдельной мобильной учебной форме создайте строковые реквизиты МаркерУчебнойМетки и ПодтверждениеОперации. Добавьте команды НачатьУчебнуюОперацию и ОстановитьУчебнуюОперацию; назначьте одноимённые обработчики из полного модуля.

  3. Заранее подготовьте своей контролируемой NFC-утилитой только эту одноразовую метку: первая текстовая NDEF-запись — ваш уникальный маркер, например GUIDE_NDEF_TEST: плюс самостоятельно созданный UUID. Не используйте общий маркер для нескольких меток.

  4. Тот же собственный маркер вручную внесите в МаркерУчебнойМетки. Изначально ПодтверждениеОперации оставьте пустым: первый запуск должен остановиться без сканирования и без изменения.

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

  6. Нужен поддерживающий NFC мобильный клиент/приложение. Физическая операция выполняется только если вы сами введёте точную фразу подтверждения и предъявите свою подготовленную метку; этот код здесь не запускался.

  7. САМОСТОЯТЕЛЬНОЕ РЕШЕНИЕ: упражнение необязательно для проверки устройства. Для разрешения введите ровно НЕОБРАТИМО ЗАБЛОКИРОВАТЬ МОЮ ОДНОРАЗОВУЮ МЕТКУ, только если готовы навсегда отказаться от её перезаписи.

&НаКлиенте
Процедура НачатьУчебнуюОперацию(Команда)
    Если ПустаяСтрока(МаркерУчебнойМетки) Тогда
        ВызватьИсключение "Сначала подготовьте собственную одноразовую метку с уникальным учебным маркером";
    КонецЕсли;
    Если ПодтверждениеОперации <> "НЕОБРАТИМО ЗАБЛОКИРОВАТЬ МОЮ ОДНОРАЗОВУЮ МЕТКУ" Тогда
        Сообщить("Подтверждения нет: сканирование и изменение метки не выполняются");
        Возврат;
    КонецЕсли;
    Менеджер = СредстваNFC.МеткиNDEF;
    Если НЕ Менеджер.ПоддерживаетсяАктивноеСканирование()
        ИЛИ НЕ Менеджер.ПоддерживаетсяЗаписьНаМетку() Тогда
        Сообщить("Нужные операции NFC не поддерживаются устройством");
        Возврат;
    КонецЕсли;
    Оповещение = Новый ОписаниеОповещения("СобственнаяУчебнаяМетка", ЭтотОбъект, МаркерУчебнойМетки);
    Менеджер.ВключитьАктивноеСканирование("Необратимая блокировка только своего одноразового носителя", Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ОстановитьУчебнуюОперацию(Команда)
    СредстваNFC.МеткиNDEF.ОтключитьАктивноеСканирование();
КонецПроцедуры

&НаКлиенте
Асинх Функция СобственнаяУчебнаяМетка(Метка, ОжидаемыйМаркер) Экспорт
    Если Метка = Неопределено Тогда
        Сообщить("Сканирование отменено; изменение не выполнялось");
        Возврат Неопределено;
    КонецЕсли;
    Если ПодтверждениеОперации <> "НЕОБРАТИМО ЗАБЛОКИРОВАТЬ МОЮ ОДНОРАЗОВУЮ МЕТКУ"
        ИЛИ ОжидаемыйМаркер <> МаркерУчебнойМетки Тогда
        Сообщить("Подтверждение или выбранный маркер изменились; операция остановлена");
        Возврат Неопределено;
    КонецЕсли;
    Попытка
        ДоОперации = Ждать Метка.ПолучитьСообщениеАсинх();
        Если ДоОперации.Записи.Количество() = 0 Тогда
            Сообщить("Нет собственного маркера; операция остановлена");
            Возврат Неопределено;
        КонецЕсли;
        Первая = ДоОперации.Записи[0];
        Если ТипЗнч(Первая) <> Тип("ТекстоваяЗаписьNDEF") Тогда
            Сообщить("Первая запись не является собственным текстовым маркером; операция остановлена");
            Возврат Неопределено;
        КонецЕсли;
        Если Первая.Текст <> ОжидаемыйМаркер Тогда
            Сообщить("Обнаружена другая метка; операция остановлена без изменения");
            Возврат Неопределено;
        КонецЕсли;
        Если НЕ (Ждать Метка.ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх()) Тогда
            Сообщить("Конкретная метка не поддерживает блокировку записи; метод не вызван");
            Возврат Неопределено;
        КонецЕсли;
        Если НЕ (Ждать Метка.ПоддерживаетсяЗаписьНаМеткуАсинх()) Тогда
            Сообщить("Запись уже недоступна; повторная блокировка не выполняется");
            Возврат Неопределено;
        КонецЕсли;
        Ждать Метка.ЗаблокироватьЗаписьНаМеткуАсинх();
        ДоступнаЗаписьПосле = Ждать Метка.ПоддерживаетсяЗаписьНаМеткуАсинх();
        Сообщить(ДоступнаЗаписьПосле = Ложь);
        Сообщить("Операция необратима: чтение остаётся доступным, возможность перезаписи не восстанавливается");
        Перечитано = Ждать Метка.ПолучитьСообщениеАсинх();
        Если Перечитано.Записи.Количество() > 0 Тогда
            Если ТипЗнч(Перечитано.Записи[0]) = Тип("ТекстоваяЗаписьNDEF") Тогда
                Сообщить(Перечитано.Записи[0].Текст = ОжидаемыйМаркер);
            КонецЕсли;
        КонецЕсли;
    Исключение
        Сообщить("Операция завершилась ошибкой: " + ОписаниеОшибки());
        Сообщить("После ошибки не объявляйте состояние носителя неизменным: перечитайте его отдельно");
        Возврат Неопределено;
    КонецПопытки;
    ПодтверждениеОперации = "";
    Возврат Неопределено;
КонецФункции

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

  1. Сначала ознакомьтесь с примером проверки ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх без блокировки. Для изучения API обычно достаточно той безопасной проверки.

  2. Этот рецепт применяется только если вы сознательно готовы навсегда потерять возможность перезаписи своей дешёвой одноразовой метки. Вводится полная фраза НЕОБРАТИМО ЗАБЛОКИРОВАТЬ МОЮ ОДНОРАЗОВУЮ МЕТКУ.

  3. В обработчике заново проверяются подтверждение и прочитанный собственный маркер. Отмена, другая метка, отсутствие поддержки или уже недоступная запись останавливают операцию.

  4. ЗаблокироватьЗаписьНаМеткуАсинх по справке не имеет обратного метода разблокировки. Код не обещает резервную копию или программный откат физического состояния.

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

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

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

  1. Без точного ручного подтверждения никакая блокировка не происходит.

  2. Для сознательно выбранного своего одноразового носителя после успешного прохода запись недоступна — Истина; собственный маркер читается.

  3. Повторный проход не рассматривается как способ восстановить метку.

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

Только сознательно выбранная собственная одноразовая метка переводится в необратимое состояние чтения без перезаписи.

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

  1. Последствие нельзя отменить средствами этого API. Не используйте как диагностический тест или на ценном носителе.

  2. Текстовый маркер — защита от случайного выбора, а не доказательство права собственности или защита от подделки.

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

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

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

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

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