Files
cursor-1c/rfid-recomedations.md

208 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
** Запрос **
посмотри процедуры работы с rfid метками, что можно улучшить?
сформируй файл md с рекомендациями в папке work
** Рекомендации: **
# Рекомендации по доработке контура RFID (ves2020)
**Дата:** 07.10.2026
**Конфигурация:** ВесоваяАК
**Область:** префикс `лс_*`, HTTP-сервис `RFID2`, рабочий стол весовщика
Документ обобщает обзор исходников без внесения правок. Приоритет — от безопасности и стабильности UI к рефакторингу структуры.
---
## 1. Кратко об архитектуре
```text
Локальный 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:
```text
код метки → прочитать раскладку → разобрать → решить действие → 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`, HTTP `RFID2`
- MCP graph/code в сессии обзора не были доступны; разбор — по исходникам на диске
---
*Следующий шаг по запросу: детальный план правок по файлам или реализация одного пункта (например, только auth в `RFID2` или только асинхронный опрос весовщика).*