** Запрос ** сформируй файл 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` или только асинхронный опрос весовщика).*