МеткаNDEF.ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх

Методы · TagWriteLockSupportedAsync

Проверяет, что физическая метка NFC поддерживает блокировку на запись. После блокировки запись на метку будет недоступна. Если произошла ошибка, будет сгенерировано исключение категории ОшибкаСредствМультимедиа.

Синтаксис

ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх()
Полное описание, параметры и ограничения

МеткаNDEF.ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх (TagNDEF.TagWriteLockSupportedAsync)

МеткаNDEF (TagNDEF)

ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх (TagWriteLockSupportedAsync)

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

Синтаксис:
ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх()
Возвращаемое значение:
Тип: Булево.
Истина - если физическая метка перезаписываемая и может быть заблокирована на запись,
Ложь - в противном случае.
Описание:

Проверяет, что физическая метка NFC поддерживает блокировку на запись.
После блокировки запись на метку будет недоступна.
Если произошла ошибка, будет сгенерировано исключение категории ОшибкаСредствМультимедиа.

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

Мобильный клиент, мобильное приложение (клиент).

См. также:
МеткаNDEF, метод ЗаблокироватьЗаписьНаМеткуАсинх

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

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

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

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

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

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

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

Полный клиентский модуль мобильной учебной формы. Только вручную подтверждённая операция на своём одноразовом 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. Текстовый маркер — защита от случайного выбора, а не доказательство права собственности или защита от подделки.

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

Проверить возможность и ёмкость метки, не записывая её

Сканируем только собственную учебную метку и сравниваем её ёмкость с подготовленным сообщением. Поддержка необратимой блокировки лишь читается — блокировка не выполняется.

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

Полный клиентский модуль своей учебной мобильной формы. Сканирование/чтение собственной NFC-метки; без записи и необратимой блокировки.

Подготовка

  1. Только отдельное учебное мобильное приложение/клиент, поддерживающее NFC, на платформе с этими API (начиная с 8.3.23). В проекте мобильного приложения должна быть предусмотрена функциональность NFC; используйте собственный телефон и собственную учебную метку.

  2. В своей управляемой форме создайте команды НачатьУчебноеЧтение и ОстановитьУчебноеЧтение, назначьте одноимённые клиентские обработчики. Полный модуль урока вставьте в модуль этой формы; обработчик оповещения должен быть экспортной асинхронной функцией.

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

  4. Этот модуль только сканирует/читает и проверяет поддержку операций. ЗаписатьСообщениеАсинх и ЗаблокироватьЗаписьНаМеткуАсинх не вызываются; данные физической метки и возможность её перезаписи не изменяются.

  5. Сканирование создаёт один интерактивный сеанс. Отмена пользователем передаёт Неопределено. После выполнения обработчика сеанс автоматически заканчивается по справке.

&НаКлиенте
Процедура НачатьУчебноеЧтение(Команда)
    Менеджер = СредстваNFC.МеткиNDEF;
    Если НЕ Менеджер.ПоддерживаетсяАктивноеСканирование() Тогда
        Сообщить("Активное NDEF-сканирование здесь не поддерживается");
        Возврат;
    КонецЕсли;
    Оповещение = Новый ОписаниеОповещения("УчебнаяМеткаОбнаружена", ЭтотОбъект);
    Менеджер.ВключитьАктивноеСканирование("Только чтение собственной учебной NFC-метки", Оповещение);
КонецПроцедуры

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

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

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

  1. ПоддерживаетсяЗаписьНаМеткуАсинх относится к конкретной обнаруженной метке. Метод менеджера о поддержке устройства не заменяет эту проверку.

  2. ПоддерживаетсяБлокировкаЗаписиНаМеткуАсинх только сообщает возможность. Настоящая ЗаблокироватьЗаписьНаМеткуАсинх необратимо делает носитель неперезаписываемым и здесь не вызывается.

  3. МаксимальныйРазмер может быть Неопределено. В этой ветке не пытаемся сравнивать число с неизвестной ёмкостью и не заявляем успех.

  4. Для известной ёмкости сравниваем полный размер СообщениеNDEF, не число букв Книга и не число записей.

  5. Даже достаточный размер и поддержка записи не являются гарантией успешной будущей записи: контакт с меткой может быть потерян.

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

  1. Реальные признаки записи/блокировки и либо неизвестная ёмкость, либо сравнение размеров.

  2. Ни одна ветка не вызывает запись или блокировку. После запуска метка остаётся в прежнем состоянии.

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

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

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

  1. Не выполняйте необратимую блокировку как тест поддержки функции.

  2. Неизвестная ёмкость не равна нулю и не означает автоматически неограниченную ёмкость.

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

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

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

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

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