---
name: xbsl-pattern-register
description: >
  Паттерны XBSL для работы с регистрами в 1С:Элемент — синтаксис существенно
  отличается от классической 1С, используй до написания кода.

  Вызывай когда: документ делает движения по регистру; нужен приход/расход/списание/
  поступление на склад; проведение документа меняет остатки или обороты; нужна
  отмена проведения; документ записывает данные в регистр сведений при проведении.

  РегистрНакопления (паттерны A1–A5, B): приход, расход или проводки при проведении
  документа (ПослеЗаписи, НаборЗаписей); замена старых движений при повторном
  проведении; отмена проведения (очистка движений); контроль / запрет отрицательных
  остатков.

  РегистрСведений (паттерны C1–C4): запись/обновление данных по измерениям
  (Замещать = Истина); добавление без перезаписи (Замещать = Ложь); удаление
  записей по фильтру; срез последних для периодических регистров (СрезПоследних).

  НЕ для: отчётов по регистрам, создания объектов РН/РС, форм, справочников.
---

# Движения по регистру накопления (XBSL)

## Шаг 1: Извлеки метаданные через скрипт

Запусти скрипт для регистра **и** для документа — это даст все нужные имена полей:

```bash
python3 .claude/skills/xbsl-pattern-register/scripts/extract_meta.py <путь-к-регистру.yaml>
python3 .claude/skills/xbsl-pattern-register/scripts/extract_meta.py <путь-к-документу.yaml>
```

Скрипт выводит JSON. Для регистра:
- `register_kind` — нужен ли `ВидЗаписи` (`needs_record_type: true` → нужен, только для Остатки)
- `dimensions` — измерения (в `ДобавитьЗапись` и `ГДЕ` — без суффикса)
- `resources` — ресурсы (в `ДобавитьЗапись` — без суффикса; в запросе к `.Остатки` — добавь суффикс `Остаток`)

Для документа:
- `header_fields` — реквизиты шапки
- `tables` — табличные части и их реквизиты
- `handler_file` — имя файла `.xbsl` для обработчика

Если `.xbsl` документа уже существует — прочитай его, чтобы не затереть код.

## Шаг 2: Выбери паттерн

### РегистрНакопления

| Задача | Паттерн |
|---|---|
| Приход в регистр Остатки | A1 |
| Расход из регистра Остатки | A2 |
| Движение в регистр Обороты | A3 |
| Как работает очистка при повторном проведении / удалении | A4 |
| Два регистра одновременно | A5 |
| Запрет уйти в минус / контроль остатков | B |

### РегистрСведений

| Задача | Паттерн |
|---|---|
| Записать / обновить данные по ключу (Замещать = Истина) | C1 |
| Добавить данные без перезаписи существующих (Замещать = Ложь) | C2 |
| Удалить записи по фильтру | C3 |
| Получить актуальное значение (СрезПоследних, периодический РС) | C4 |

Шаблоны кода:
- РегистрНакопления: `references/движения-рн.md`
- РегистрСведений: `references/движения-рс.md`

## Шаг 3: Напиши или дополни файл модуля

**РегистрНакопления:** файл `<ИмяДокумента>.Объект.xbsl` рядом с `<ИмяДокумента>.yaml`.
Если файл уже существует — **дополни**, не перезаписывай.

**РегистрСведений:** код пишется туда, откуда вызывается запись — это может быть `.xbsl` документа, общего модуля или самого РС (обработчики `ПередЗаписью`/`ПослеЗаписи` на НаборЗаписей). Уточни у пользователя, где должен находиться код.

---

## Проверь перед финалом

- `@Обработчик` стоит над методом `ПослеЗаписи`
- `ВидЗаписи` указан **только** если `ВидРегистра: Остатки` (для Обороты — не нужен)
- **РН:** `НаборЗаписей.Фильтр.Установить(Регистратор = Ссылка)` вызван **до** `Записать()`
- **РС:** встроенного Регистратора нет — фильтр только по измерениям; привязки записей к документу на уровне платформы не существует
- В запросе к `.Остатки`: Измерения — **без суффикса**, Ресурсы — **с суффиксом `Остаток`**
- Контроль остатков (паттерн B) идёт **после** `НаборЗаписей.Записать()`

---

Объяснения "почему" и детали платформы: `references/теория.md`
