commit 0fcf783cb814b3a34d5e735476619b534b77d72c Author: dtorov Date: Wed Oct 7 08:32:17 2026 +0000 Добавить rfid-recomedations.md diff --git a/rfid-recomedations.md b/rfid-recomedations.md new file mode 100644 index 0000000..2dd21a2 --- /dev/null +++ b/rfid-recomedations.md @@ -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` или только асинхронный опрос весовщика).*