# 1С-сторона: власний HTTP-сервіс `Cabinet` для особистого кабінету

Цей каталог містить код HTTP-сервісу, який ваш спеціаліст 1С додає у
конфігурацію (краще — **Розширенням конфігурації**, щоб не чіпати конфігурацію
вендора) і публікує на веб-сервері. Сервіс віддає бекенду кабінету дані у
форматі **JSON** і приймає показання лічильників. Він **самодостатній** і не
пов'язаний із порталом gkh.in.ua.

Файли (у форматі вивантаження конфігурації 1С у файли):

```
onec-1c/
  Cabinet.xml              опис об'єкта HTTP-сервіс (URL-шаблон, методи)
  Cabinet/Ext/Module.bsl   модуль сервісу (запити + обробники)
```

> Код призначено для рев'ю та компіляції у вашій конфігурації
> (перевірте у своїй версії перед публікацією).

## 1. Додавання об'єкта HTTP-сервіс

Рекомендовано — через **Розширення конфігурації** (щоб не знімати конфігурацію
вендора з підтримки):

1. *Конфігурація → Розширення конфігурації* → створити розширення
   (напр. ім'я `КабінетАбонента`, префікс на ваш розсуд).
2. Відкрити конфігурацію розширення. Додати HTTP-сервіс.

**Спосіб А (імпорт готового об'єкта).** Помістіть `Cabinet.xml` та
`Cabinet/Ext/Module.bsl` у структуру вивантаження й скористайтесь
*Конфігурація → Завантажити конфігурацію з файлів* (або порівняння/об'єднання),
щоб внести об'єкт `HTTPService.Cabinet`. UUID в `Cabinet.xml` вже проставлені.

**Спосіб Б (створити вручну)** — якщо імпорт незручний:
- **Ім'я:** `Cabinet`, **RootURL:** `cabinet`, **Шаблон URL:** `/{entity}`
  - Метод `get` → **GET**, обробник **`getData`**
  - Метод `post` → **POST**, обробник **`postData`**
- У модуль сервісу вставити вміст `Cabinet/Ext/Module.bsl`.

## 2. Публікація на веб-сервері

*Адміністрування → Публікація на веб-сервері* (Apache/IIS):
- увімкнути публікацію **HTTP-сервісів** (галочка), зокрема `Cabinet`;
- отримати базову адресу: `http(s)://<хост>/<база>/hs/cabinet`.

## 3. Безпека (обов'язково)

- Створити окремого **службового користувача** 1С з мінімальними правами
  (доступ до сервісу + читання потрібних об'єктів; право запису в регістр
  `ПоказанияПриборовУчетаССайта`). Логін/пароль передати бекенду кабінету
  (HTTP Basic).
- Публікацію зробити по **HTTPS**.
- На фаєрволі відкрити порт сервісу **лише для IP сервера кабінету** (або VPN).
  Не виставляти 1С у публічний інтернет.

## 4. Ендпоінти

Читання (**GET**, необов'язковий параметр `?CODE=<GUID лицевого счёта>`;
без `CODE` — по всіх ЛС, використовується для індексації телефонів):

| URL | Повертає |
|---|---|
| `GET /hs/cabinet/state` | `[{"STATE":"ready"}]` — перевірка доступності |
| `GET /hs/cabinet/accounts?CODE=` | особові рахунки (номер, адреса, ПІБ) |
| `GET /hs/cabinet/contacts?CODE=` | телефони по ЛС (для входу за номером) |
| `GET /hs/cabinet/balances?CODE=` | сальдо по місяцях (`CALC_FINISH`) |
| `GET /hs/cabinet/finances?CODE=` | нарахування по послугах/періодах |
| `GET /hs/cabinet/payments?CODE=` | історія платежів |
| `GET /hs/cabinet/meters?CODE=` | лічильники |
| `GET /hs/cabinet/indications?CODE=` | історія показань |

Запис (**POST**), тіло — JSON-масив:

```
POST /hs/cabinet/readings
[
  {"ACCOUNT_CODE":"<guid ЛС>","INDICATOR_CODE":"<guid приладу>",
   "INDICATION_PREV":152,"INDICATION_CURR":160,
   "INDICATOR_TYPE":"water.cold.consumption","PACKAGE_CODE":"202607"}
]
```
Показання пишуться у `РегистрСведений.ПоказанияПриборовУчетаССайта`
(окремий регістр «з сайту»), звідки оператор підтверджує їх у 1С.

## 5. Перевірка

```bash
curl -u service_user:pass "https://<хост>/<база>/hs/cabinet/state"
curl -u service_user:pass "https://<хост>/<база>/hs/cabinet/accounts"
```
Має повернутися JSON. Після цього у бекенді кабінету встановіть
`ONEC_MODE=http` і `ONEC_HTTP_BASE_URL=https://<хост>/<база>/hs/cabinet`.

## 6. Що перевірити у вашій конфігурації

Код спирається на такі об'єкти (є у вашій базі — перевірено за вивантаженням):
`Справочник.ЛицевыеСчета` (реквізити `МобТелефон`, `Телефон`, `КодКОАТУУ`),
`РегистрСведений.ЛицевыеСчета`, `РегистрСведений.ОтветственныйВладелецЛицевогоСчета`,
`РегистрНакопления.РасчетыПоЛицевымСчетам`, `Документ.ОплатаУслугМВК`,
`РегистрСведений.УстановленныеПриборыУчета`, `РегистрСведений.ПоказанияПриборовЗаМесяц`,
`РегистрСведений.ПоказанияПриборовУчетаССайта`, `Справочник.Услуги`.
Коди послуг у `putReadings` (`000000048` / `000000020`) — звірте зі своїми.
