14 KiB
** Запрос **
посмотри процедуры работы с rfid метками, что можно улучшить? сформируй файл md с рекомендациями в папке work
** Рекомендации: **
Рекомендации по доработке контура RFID (ves2020)
Дата: 07.10.2026
Конфигурация: ВесоваяАК
Область: префикс лс_*, HTTP-сервис RFID2, рабочий стол весовщика
Документ обобщает обзор исходников без внесения правок. Приоритет — от безопасности и стабильности UI к рефакторингу структуры.
1. Кратко об архитектуре
Локальный HTTP-считыватель (/reader inventory|read|write)
↓
лс_RFID (клиент: опрос, чтение/запись)
↓
лс_НастройкиRFIDОбмена + лс_RFIDСервер (раскладка, бизнес)
↓
Регистры меток / идентификаторов → документы с лс_Метка
↓
HTTP RFID2 (мобильные устройства, ВТ, БЭКЗ)
| Объект | Назначение | Объём (ориентир) |
|---|---|---|
CommonModules/лс_RFID |
Клиентский опрос считывателя, сценарии весовой/ТТН | ~1,6k строк |
CommonModules/лс_RFIDСервер |
Раскладка метки, ТТН, ВТ, БЭКЗ, идентификаторы | ~3,9k строк |
HTTPServices/RFID2 |
API мобильного приложения (RootURL = rfid) |
~2,2k строк |
РС лс_RFIDМетки, лс_АктивныеМетки, лс_ПрочитанныеДанныеСМетки, лс_ИдентификаторыRFID* |
Хранение меток и GUID обмена | — |
Справочник лс_НастройкиRFIDОбмена |
Карта полей на метке (offset/size/тип) | — |
Константа лс_URLСчитывателя |
URL локального reader (по умолчанию http://127.0.0.1:8888) |
— |
Отдельного объекта БПО «оборудование RFID» нет: доступ к считывателю — HTTP. Параллельно существует контур ак_Глонасс* / ак_Виалон* (внешние таблицы RFID) — не смешивать с лс_* без отдельного решения.
2. Приоритет 1 — критично
2.1. Хардкод UUID устройства вместо проверки регистрации
Где: HTTPServices/RFID2/Ext/Module.bsl — сравнение ИдентификаторУстройства с литералом 901ff453-4d26-44ff-ab31-3dd8457b8c8b (несколько методов).
Проблема: обход модели лс_МобильныеУстройства / ПроверитьИдентификаторУстройства. Знание UUID даёт доступ к API.
Рекомендация:
- единая функция авторизации устройства (регистр + роль);
- убрать все литеральные UUID;
- при необходимости «сервисного» устройства — константа или предопределённая запись регистра, не строка в коде.
2.2. Модальный UI при опросе считывателя
Где: лс_RFID.ОпросСчитывателяРабочийСтолВесовщика и родственные ОпросСчитывателя* — Вопрос(), ОткрытьМодально().
Проблема: блокировка клиента, конфликты с таймером опроса, плохая совместимость с веб-/тонким клиентом.
Рекомендация:
- везде асинхронные
ПоказатьВопрос/ОткрытьФорму+ОписаниеОповещения; - опрос на время диалога явно останавливать и возобновлять в колбэках (часть сценариев уже близка к этому — унифицировать).
2.3. Обработка ошибок: пустые исключения и Сообщить()
Где: лс_RFID (клиентский HTTP к считывателю), фрагменты лс_RFIDСервер, обработчики RFID2.
Проблема: ошибки глотаются или выводятся через Сообщить с номером строки; на весовой теряются, в журнале регистрации — пусто.
Рекомендация:
- запись в журнал регистрации (категория вроде
лс.RFID); - пользователю —
ПоказатьОповещениеПользователя/ предупреждение с понятным текстом; - не оставлять пустой
Исключениебез фиксации факта сбоя.
3. Приоритет 2 — архитектура и сопровождение
3.1. Разрезать крупные модули
Текущие модули совмещают транспорт, раскладку, UI-сценарии и интеграции.
Предлагаемое разбиение (имена условные):
| Модуль / область | Ответственность |
|---|---|
| Транспорт считывателя | inventory / read / write, таймауты, веб-мост |
| Раскладка метки | НайтиПараметрыОбмена, буфер ДД, команды записи/стирания |
| Сценарии весовой | опрос → параметры → создание документов |
| ТТН / БЭКЗ / ВТ | существующие ОбработатьЗапрос*, списки команд метки |
| HTTP RFID2 | тонкий слой: разбор запроса → вызов серверного API |
Клиентский лс_RFID не должен дублировать серверную логику тонкими обёртками «пробросить на сервер» без необходимости.
3.2. Директивы &НаКлиенте / &НаСервере в общих модулях
В общих модулях это неканонично (директивы форм). Предпочтительны свойства модуля (Клиент / Сервер / Вызов сервера) и явные клиентские/серверные модули без смешения контекстов.
3.3. Унификация сценариев опроса
Дублируются почти одинаковые процедуры:
ОпросСчитывателяРабочийСтолВесовщикаОпросСчитывателяРабочийСтолВесовщикаПриходПоСкладуОпросСчитывателяРасходнаяТТНОпросСчитывателяПриходТТН
и пары обработчиков вроде ОбработатьЗапросВТ_СоздатьПриходПоСкладу / …2.
Рекомендация: один pipeline:
код метки → прочитать раскладку → разобрать → решить действие → UI / запись
Точка учёта и вид документа — параметры снаружи, а не копипаста веток.
4. Приоритет 3 — надёжность и эксплуатация
4.1. Синхронный polling HTTP (таймаут 5 с)
Каждый тик таймера создаёт HTTPСоединение к локальному reader. При недоступности считывателя UI «подвешивается».
Рекомендация:
- короткий таймаут и backoff после серии ошибок;
- отключение опроса при N подряд неудачах с явным статусом на форме;
- по возможности — push/событие от reader-сервиса вместо частого
inventory.
4.2. Разный URL считывателя: толстый vs веб
- Толстый клиент: константа
лс_URLСчитывателя. - Веб-клиент: захардкоженный
https://127.0.0.1:9999+ макетКостыльНаJSулс_RFIDМетки.
Рекомендация: один конфигурируемый endpoint (включая HTTPS-мост), без литералов в коде.
4.3. Автосоздание «пустых» элементов справочников
Функции ПолучитьИлиСоздатьПустого* (контрагенты, ТС, физлица, номенклатура) при обмене плодят заглушки.
Рекомендация:
- создавать элементы только при полном пакете данных;
- либо статус «не сопоставлено» / отдельный контур внешних идентификаторов без мусора в основных справочниках;
- запрет проведения документов с незаполненными обязательными реквизитами заглушек.
4.4. Отладочная задержка в HTTP-сервисе
ЗадержкаДляОтладки в RFID2 — цикл по ТекущаяДата() по параметру debug (занятость CPU).
Рекомендация: удалить из продакшена или ограничить константой/ролью администратора.
4.5. Мелкая правка
Опечатка КонеЦесли в RFID2/Ext/Module.bsl (процедура ЗадержкаДляОтладки) — исправить при касании модуля.
5. Что не трогать в первую очередь
- Раскладка полей
лс_ТипНастройкиRFIDОбмена/ версии обмена на карте — менять только синхронно с прошивкой/мобильным клиентом. - Контур
ак_ГлонассРегистрацияМеток/ак_ВиалонРегистрацияМеток— отдельная модель; унификация слс_*— отдельный проект. - Косметический рефакторинг без тестов на весовой и мобильном обмене.
6. Предлагаемый порядок работ
| № | Задача | Риск | Эффект |
|---|---|---|---|
| 1 | Убрать хардкод UUID, единая проверка устройства в RFID2 |
Средний (мобильные клиенты) | Безопасность |
| 2 | Асинхронные диалоги на рабочем столе весовщика | Средний (регресс UI) | Стабильность весовой |
| 3 | Журнал ошибок + отказ от пустых Исключение / Сообщить |
Низкий | Диагностика |
| 4 | Единый URL/транспорт считывателя (вкл. веб-мост) | Средний | Сопровождение |
| 5 | Общий pipeline опроса вместо 4 копий | Высокий | Сопровождение |
| 6 | Разрезка лс_RFID / лс_RFIDСервер / слой HTTP |
Высокий | Долгий срок |
| 7 | Политика автосоздания справочников | Средний (данные) | Качество НСИ |
Перед п. 5–6 желателен короткий чек-лист ручной проверки: опрос метки на весовой, запись/стирание полей, создание прихода, мобильный /dict и /rfid, сценарии ВТ/БЭКЗ.
7. Ключевые процедуры (ориентир для правок)
Клиент (лс_RFID):
ПолучитьКодМеткиHF, ПрочитатьДанныеСМетки, ЗаписатьДанныеНаМетку, ПрочитатьСтруктуруДанныхСМетки, ПрочитатьВсюМетку, ОпросСчитывателя*, ПолучитьПараметрыПриходПоВесовой / …ПриходПоСкладу.
Сервер (лс_RFIDСервер):
НайтиПараметрыОбмена, СоздатьКомандуДляЗаписиДанных, РазобратьПрочитанныеДанныеСМетки, СоздатьОбновитьТТН, ОбработатьЗапросВТ_*, ОбработатьЗапросБЭКЗ_*, НельзяПровестиБезМетки, КонтрагентРазрешенДляRFID.
HTTP (RFID2):
REGISTER_DEVICE_GET, GET_DICTIONARIES, RFID_GET, RFIDList_GET, TTNUpdate_POST, vtPOST, bekzPOST.
8. Источники обзора
- Выгрузка конфигурации:
d:\dev\1C\ves2020 - Поиск по терминам:
RFID,лс_RFID, HTTPRFID2 - MCP graph/code в сессии обзора не были доступны; разбор — по исходникам на диске
Следующий шаг по запросу: детальный план правок по файлам или реализация одного пункта (например, только auth в RFID2 или только асинхронный опрос весовщика).