208 lines
14 KiB
Markdown
208 lines
14 KiB
Markdown
** Запрос **
|
||
|
||
посмотри процедуры работы с 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` или только асинхронный опрос весовщика).*
|