From 7365242875c9e8ee5ebdb54d4c796324ac39df74 Mon Sep 17 00:00:00 2001 From: creator Date: Wed, 22 Apr 2026 07:02:53 +0000 Subject: [PATCH] =?UTF-8?q?fix(1c-analyst):=20=D0=BF=D0=BE=D0=BB=D0=B5=20D?= =?UTF-8?q?escription=20(=D0=BD=D0=B5=20Content)=20+=20=D0=BE=D0=B1=D1=8F?= =?UTF-8?q?=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?GET-=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Критичный баг-фикс по режиму «Пожелания из совещания». Проблема: сервер Devprom на POST /issue/items молча игнорирует поле Content, упомянутое в публичной документации /docs/8835.html. Запись создаётся с пустым телом, HTTP 200, UID возвращается — никакого сигнала об ошибке. Правильное имя поля для тела пожелания на эндпоинте /issue/items — Description. Выявлено при проверке U-6186 (Артур): поле Description пустое, хотя POST вернул валидный UID. Та же проблема обнаружилась на 6 пожеланиях Тепловин U-6189..U-6194 — все с пустым телом. Пересоздано как U-6198..U-6203 с полем Description, размер тела 1565–2172 символа, верификация пройдена. Правки скилла: - devprom-alm-api.md §0: новый блок «Критично: сервер молча отбрасывает незнакомые поля» + обязательная схема контрольного GET с ассертами. Список известных тихих ловушек (Content вместо Description, Type.Id='' в request/items, Requirement в POST). - devprom-alm-api.md §2: рецепт с Description + встроенные ассерты. - devprom-alm-api.md §3: справочник полей — Description с пояснением про Content и документацию, требование GET-проверки. - devprom-alm-api.md appendix: curl-примеры с Description. - meeting-wishes-extraction.md Шаг 6: Description в инструкции + ссылка на секцию «тихое отбрасывание». - meeting-wishes-extraction.md Шаг 7: жёсткая формулировка «Ответ POST — недостаточное подтверждение успеха», ассерты на префикс UID, содержимое Description, Priority, Function; визуальная проверка в UI. - meeting-wishes-extraction.md Python-шаблон: Description + ассерты на размер тела (>100 символов). --- 1c-analyst/references/devprom-alm-api.md | 55 ++++++++++++--- .../references/meeting-wishes-extraction.md | 69 +++++++++++++------ 2 files changed, 93 insertions(+), 31 deletions(-) diff --git a/1c-analyst/references/devprom-alm-api.md b/1c-analyst/references/devprom-alm-api.md index aaa4bda..420b258 100644 --- a/1c-analyst/references/devprom-alm-api.md +++ b/1c-analyst/references/devprom-alm-api.md @@ -36,6 +36,36 @@ - **PATCH не поддерживается** — HTTP 405. Обновление только через PUT. - **Успешный ответ на создание:** иногда возвращается как объект, иногда — как массив с одним элементом. Учитывать оба случая. +### ⚠ Критично: сервер молча отбрасывает незнакомые поля + +Devprom REST API **не возвращает ошибку**, если имя поля в теле POST +не соответствует схеме сущности. Поле просто игнорируется, запись +создаётся с остальными полями, HTTP 200, `UID` возвращается. + +**Следствие:** ответ POST нельзя считать подтверждением, что данные +сохранены. Успешный HTTP 200 + валидный JSON с `UID` означают только +что запись появилась, но часть полей может быть потеряна. + +**Правило:** после КАЖДОГО POST на `/issue/items` (и любой другой +сущности, где критично содержимое) делать контрольный GET и глазами +или ассертом проверять реально сохранённые значения. Минимум: + +```python +code, text = call("GET", f"issue/items/{new_id}") +g = json.loads(text) +assert g["UID"].startswith("U-"), "неверный префикс UID" +assert len(g.get("Description","")) > 100, "тело пожелания пустое" +# опционально: проверить Caption, Priority.Id, Function.Id, Company.Id +``` + +Известные «тихие ловушки»: +- `Content` вместо `Description` в теле POST на `/issue/items` → + поле игнорируется, запись создаётся с пустым телом. +- `Type: {"Id":""}` при POST на `/request/items` → игнорируется, + сервер ставит `Type=397` (Доработка). +- `Requirement` при POST на `/issue/items` → игнорируется + (привязку делать через PUT или в UI). + ## 1. Пожелания vs Заявки — КРИТИЧНО В официальной схеме Devprom это **две разные сущности** с разными @@ -74,14 +104,20 @@ _Проверено эмпирически:_ `/request/items` при POST **вс ```python post_body = { - "Caption": "<заголовок>", - "Content": "", # по документации; Description тоже принимается - "Priority": {"Id": "2"}, # 1=Критично, 2=Высокий, 3=Обычный - "Author": {"Id": ""}, - "Function": {"Id": ""}, # подсистема (группировка) - "Company": {"Id": ""}, # опционально: клиент-источник + "Caption": "<заголовок>", + "Description": "", # ← именно Description, НЕ Content + "Priority": {"Id": "2"}, # 1=Критично, 2=Высокий, 3=Обычный + "Author": {"Id": ""}, + "Function": {"Id": ""}, # подсистема (группировка) + "Company": {"Id": ""}, # опционально: клиент-источник } # POST {BASE}/issue/items → {UID: "U-xxxx", Id: "xxxx", ...} + +# ⚠ ОБЯЗАТЕЛЬНЫЙ контрольный GET — сервер может молча отбросить поля +code, text = call("GET", f"issue/items/{new_id}") +g = json.loads(text) +assert g["UID"].startswith("U-"), f"префикс не U-: {g['UID']}" +assert len(g.get("Description","")) > 100, "тело пожелания пустое" ``` Поля `Requirement` и `RequirementDocument` в теле **не передаются**: @@ -106,7 +142,7 @@ Egress-прокси периодически роняет запросы с HTTP | Поле | Тип / формат | Обязательность | Комментарий | |-----------------------|------------------------------|----------------|-------------| | `Caption` | string | обязательно | Заголовок пожелания | -| `Content` | HTML-string | обязательно | Описание. Разрешены: `