147 lines
8.3 KiB
Markdown
147 lines
8.3 KiB
Markdown
# Исправление: 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
|