BUH_bot/docs/CONTRACT_UUID_FIX.md

147 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Исправление: GUID договора и выбор счетов 62 в 1С
## Проблема
### Симптомы
При импорте рублёвого документа (валюта RUB, код 643) в 1С:Бухгалтерия 8, система подставляла счета **62.21 (Расчёты в валюте)** / **62.22 (Авансы в валюте)** вместо ожидаемых **62.01 (Задолженность)** / **62.02 (Авансы)**.
### Причина
В генераторе ED-XML использовался детерминированный GUID договора, созданный **только на основе пары (контрагент, организация)**:
```python
# БЫЛО (неправильно):
contract_uuid = uuid.uuid5(uuid.NAMESPACE_DNS, f"contract-{cp_id}-{org_id}")
```
Это означало «один договор на пару контрагент-организация» **независимо от валюты расчётов**.
### Механизм в 1С
В типовой конфигурации «1С:Бухгалтерия 8» выбор счетов учёта расчётов с покупателями (62.xx) определяется регистром **«Счета расчетов с контрагентами»** на основании:
1. **Договора** (точнее - его валюты взаиморасчётов)
2. **Вида расчётов** (задолженность/аванс)
Логика подстановки счетов:
- **RUB + не в у.е.** → **62.01** (задолженность) / **62.02** (авансы)
- **Иностранная валюта** → **62.21** (валютные расчёты) / **62.22** (авансы в валюте)
- **Условные единицы** → **62.31** (расчёты в у.е.) / **62.32** (авансы в у.е.)
### Сценарий проблемы
1. Ранее в базу был импортирован документ **в валюте** (например, USD)
2. Для него создался договор с GUID `abc123...` (на основе пары контрагент-организация)
3. Этот договор записался в регистр с валютой USD → счета 62.21/62.22
4. Позже импортируется документ **в рублях** (RUB)
5. Генератор создаёт **тот же GUID** `abc123...` (та же пара контрагент-организация!)
6. 1С находит **существующий договор** с валютой USD
7. Регистр подставляет счета **62.21/62.22** (как для валютного договора)
8. ❌ Документ рублёвый, но счета валютные!
## Решение
### 1. Исправление генератора GUID договора
Включаем в seed для `uuid5` **валюту и признак условных единиц**:
```python
# СТАЛО (правильно):
currency_code = currency.get("isoCode", "643")
is_ue = "false" # В текущей реализации всегда false
seed = f"contract-{cp_id}-{org_id}-CUR-{currency_code}-UE-{is_ue}"
contract_uuid = str(uuid.uuid5(uuid.NAMESPACE_DNS, seed))
```
Теперь для каждой комбинации (контрагент, организация, **валюта**, **признак у.е.**) создаётся **отдельный договор** с уникальным GUID.
### 2. Добавление диагностического логирования
В конце метода `generate_realization()` добавлена проверка:
```python
if currency_code == "643" or currency_code == "RUB":
logger.info(
"✓ Документ в рублях (RUB, код 643), не в у.е. "
"→ ожидаются счета 62.01 / 62.02. "
"Если 1С подставляет 62.21/62.22 или 62.31/62.32, проверьте: "
"1) Регистр 'Счета расчетов с контрагентами'. "
"2) В карточке договора: Валюта = RUB, У.Е. = нет."
)
else:
logger.info(
f"⚠ Документ в иностранной валюте ({currency_code}) "
"→ ожидаются счета 62.21/62.22."
)
```
## Проверка после исправления
### 1. Проверьте регистр «Счета расчетов с контрагентами»
В 1С:
1. Откройте **«Контрагенты»** → список контрагентов
2. Найдите проблемного контрагента
3. Перейдите по гиперссылке **«Счета расчетов с контрагентами»**
4. Проверьте, нет ли индивидуальных правил с 62.21/62.22
5. Если есть - удалите или исправьте на 62.01/62.02
### 2. Проверьте карточку договора
После импорта нового документа (с обновлённым генератором):
1. Откройте **«Договоры контрагентов»**
2. Найдите договор (по имени контрагента + дата создания)
3. Проверьте:
- **Валюта взаиморасчётов** = `RUB` (Российский рубль)
- **Расчёты в условных единицах** = `нет` (галочка снята)
### 3. Проверьте подстановку счетов
Создайте новый документ реализации:
1. Импортируйте тестовый заказ в рублях
2. Откройте созданный документ в 1С
3. Перейдите на вкладку **«Счета учёта»**
4. Проверьте:
- Счёт учёта расчётов с покупателем = **62.01**
- Счёт учёта авансов = **62.02** (если есть)
## Дополнительные замечания
### Миграция существующих данных
Если в базе уже есть документы с неправильными счетами:
1. **Вариант 1: Пересоздать договоры**
- Удалите старые договоры (или переименуйте)
- Импортируйте документы заново
- Новый генератор создаст правильные договоры
2. **Вариант 2: Исправить вручную**
- Откройте карточку существующего договора
- Измените **«Валюта взаиморасчётов»** на RUB
- Убедитесь, что **«Расчёты в условных единицах»** = нет
- Проведите документы заново
### Поддержка условных единиц (будущее)
Если в будущем потребуется поддержка расчётов в у.е.:
1. Добавьте в API МойСклад передачу признака у.е.
2. Измените строку в генераторе:
```python
is_ue = "true" if order.get("useConventionalUnits") else "false"
```
3. В ED-XML добавьте:
```xml
<РасчетыВУсловныхЕдиницах>true</РасчетыВУсловныхЕдиницах>
```
## Ссылки
1. [Расчеты с контрагентами в 1С:Бухгалтерии 8](https://buh.ru/articles/raschety-s-kontragentami-v-1s-bukhgalterii-8.html)
2. [Взаиморасчёты в валюте, оплата в рублях (1С:ERP)](https://sitec-it.ru/blog/1c-erp/vzaimoraschety-v-valyute-oplata-v-rublyakh-oformlenie-realizatsii-v-1s-erp/)
3. [Формат обмена EnterpriseData 1.20](https://buh.ru/news/samoe-novoe-v-1s-bukhgalterii-8-format-obmena-enterprisedata-1-20-s-drugimi-programmami.html)
## История изменений
### 2025-11-06
- **Исправление**: Добавлена валюта и признак у.е. в seed для GUID договора
- **Улучшение**: Добавлено диагностическое логирование для RUB/валюта
- **Документация**: Создан файл CONTRACT_UUID_FIX.md