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