Добавить rfid-recomedations.md

This commit is contained in:
2026-10-07 08:32:17 +00:00
commit 0fcf783cb8
+206
View File
@@ -0,0 +1,206 @@
** Запрос **
сформируй файл 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` или только асинхронный опрос весовщика).*