Записать свою учебную метку с сохранением маркера и перечитыванием

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

Пример настоящей записи, не имитация. До неё проверяются подтверждение, прочитанный маркер, поддержка записи и известная ёмкость; после — фактическое сообщение перечитывается.

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

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

Подготовка

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

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

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

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

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

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

  7. Для разрешённого прохода введите ровно ЗАПИСАТЬ МОЮ УЧЕБНУЮ МЕТКУ. Сначала испытайте отказ с пустым подтверждением. Предыдущая нагрузка будет заменена двумя учебными текстовыми записями.

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

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

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

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

  1. Пустое подтверждение останавливает пример до открытия NFC-интерфейса. Для упражнения самостоятельно вводится точная фраза ЗАПИСАТЬ МОЮ УЧЕБНУЮ МЕТКУ.

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

  3. Поддержка устройства и ПоддерживаетсяЗаписьНаМеткуАсинх конкретного носителя проверяются отдельно. Неизвестная ёмкость в этом уроке означает отказ от записи.

  4. Новое сообщение содержит прежний собственный маркер первой записью и Книга второй. В нём нет пустого СообщениеNDEF, которое очищало бы метку.

  5. После Ждать ЗаписатьСообщениеАсинх реальный носитель перечитывается. Сначала проверяются количество и типы, затем две строки.

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

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

  1. Пустая фраза, чужой маркер, запрет записи, неизвестная/недостаточная ёмкость — понятный отказ до записи.

  2. На своей подготовленной метке после успешной записи/перечитывания — две Истина: сохранённый маркер и Книга.

  3. Подтверждение после завершённого прохода очищается; для повторной операции потребуется ручной ввод.

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

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

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

  1. Старая полезная нагрузка заменяется новым сообщением: ценную метку этот урок использовать не должен.

  2. Достаточная ёмкость не защищает от потери контакта или аппаратной ошибки; обязательна проверка реального результата.

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

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

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

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

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