МеткаNDEF.МаксимальныйРазмер

Свойства · MaxSize

Тип: Число, Неопределено. Максимальный размер сообщения, которое может быть записано на метку (в байтах), или Неопределено, если размер неизвестен.

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

МеткаNDEF.МаксимальныйРазмер (TagNDEF.MaxSize)

МеткаNDEF (TagNDEF)

МаксимальныйРазмер (MaxSize)

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

Использование:
Только чтение.
Описание:
Тип: Число, Неопределено.
Максимальный размер сообщения, которое может быть записано на метку (в байтах), или Неопределено, если размер неизвестен.
Доступность:

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

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

Доступен, начиная с версии 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") Тогда
            Сообщить("Первая запись не является собственным текстовым маркером; операция остановлена");
            Возврат Неопределено;
        КонецЕсли;
        Если Первая.Текст <> ОжидаемыйМаркер Тогда
            Сообщить("Обнаружена другая метка; операция остановлена без изменения");
            Возврат Неопределено;
        КонецЕсли;
        Если НЕ (Ждать Метка.ПоддерживаетсяЗаписьНаМеткуАсинх()) Тогда
            Сообщить("Конкретная метка не допускает запись");
            Возврат Неопределено;
        КонецЕсли;
        Записи = Новый Массив;
        Записи.Добавить(Новый ТекстоваяЗапись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. Достаточная ёмкость не защищает от потери контакта или аппаратной ошибки; обязательна проверка реального результата.

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

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

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

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

Полный клиентский модуль своей учебной мобильной формы. Сканирование/чтение собственной 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С» и не аффилирован с ней.