BUH_bot/docs/CONTRACT_UUID_FIX.md

8.3 KiB
Raw Blame History

Исправление: GUID договора и выбор счетов 62 в 1С

Проблема

Симптомы

При импорте рублёвого документа (валюта RUB, код 643) в 1С:Бухгалтерия 8, система подставляла счета 62.21 (Расчёты в валюте) / 62.22 (Авансы в валюте) вместо ожидаемых 62.01 (Задолженность) / 62.02 (Авансы).

Причина

В генераторе ED-XML использовался детерминированный GUID договора, созданный только на основе пары (контрагент, организация):

# БЫЛО (неправильно):
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 валюту и признак условных единиц:

# СТАЛО (правильно):
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() добавлена проверка:

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. Измените строку в генераторе:
    is_ue = "true" if order.get("useConventionalUnits") else "false"
    
  3. В ED-XML добавьте:
    <РасчетыВУсловныхЕдиницах>true</РасчетыВУсловныхЕдиницах>
    

Ссылки

  1. Расчеты с контрагентами в 1С:Бухгалтерии 8
  2. Взаиморасчёты в валюте, оплата в рублях (1С:ERP)
  3. Формат обмена EnterpriseData 1.20

История изменений

2025-11-06

  • Исправление: Добавлена валюта и признак у.е. в seed для GUID договора
  • Улучшение: Добавлено диагностическое логирование для RUB/валюта
  • Документация: Создан файл CONTRACT_UUID_FIX.md