8.3 KiB
Исправление: 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) определяется регистром «Счета расчетов с контрагентами» на основании:
- Договора (точнее - его валюты взаиморасчётов)
- Вида расчётов (задолженность/аванс)
Логика подстановки счетов:
- RUB + не в у.е. → 62.01 (задолженность) / 62.02 (авансы)
- Иностранная валюта → 62.21 (валютные расчёты) / 62.22 (авансы в валюте)
- Условные единицы → 62.31 (расчёты в у.е.) / 62.32 (авансы в у.е.)
Сценарий проблемы
- Ранее в базу был импортирован документ в валюте (например, USD)
- Для него создался договор с GUID
abc123...(на основе пары контрагент-организация) - Этот договор записался в регистр с валютой USD → счета 62.21/62.22
- Позже импортируется документ в рублях (RUB)
- Генератор создаёт тот же GUID
abc123...(та же пара контрагент-организация!) - 1С находит существующий договор с валютой USD
- Регистр подставляет счета 62.21/62.22 (как для валютного договора)
- ❌ Документ рублёвый, но счета валютные!
Решение
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С:
- Откройте «Контрагенты» → список контрагентов
- Найдите проблемного контрагента
- Перейдите по гиперссылке «Счета расчетов с контрагентами»
- Проверьте, нет ли индивидуальных правил с 62.21/62.22
- Если есть - удалите или исправьте на 62.01/62.02
2. Проверьте карточку договора
После импорта нового документа (с обновлённым генератором):
- Откройте «Договоры контрагентов»
- Найдите договор (по имени контрагента + дата создания)
- Проверьте:
- Валюта взаиморасчётов =
RUB(Российский рубль) - Расчёты в условных единицах =
нет(галочка снята)
- Валюта взаиморасчётов =
3. Проверьте подстановку счетов
Создайте новый документ реализации:
- Импортируйте тестовый заказ в рублях
- Откройте созданный документ в 1С
- Перейдите на вкладку «Счета учёта»
- Проверьте:
- Счёт учёта расчётов с покупателем = 62.01
- Счёт учёта авансов = 62.02 (если есть)
Дополнительные замечания
Миграция существующих данных
Если в базе уже есть документы с неправильными счетами:
-
Вариант 1: Пересоздать договоры
- Удалите старые договоры (или переименуйте)
- Импортируйте документы заново
- Новый генератор создаст правильные договоры
-
Вариант 2: Исправить вручную
- Откройте карточку существующего договора
- Измените «Валюта взаиморасчётов» на RUB
- Убедитесь, что «Расчёты в условных единицах» = нет
- Проведите документы заново
Поддержка условных единиц (будущее)
Если в будущем потребуется поддержка расчётов в у.е.:
- Добавьте в API МойСклад передачу признака у.е.
- Измените строку в генераторе:
is_ue = "true" if order.get("useConventionalUnits") else "false" - В ED-XML добавьте:
<РасчетыВУсловныхЕдиницах>true</РасчетыВУсловныхЕдиницах>
Ссылки
- Расчеты с контрагентами в 1С:Бухгалтерии 8
- Взаиморасчёты в валюте, оплата в рублях (1С:ERP)
- Формат обмена EnterpriseData 1.20
История изменений
2025-11-06
- Исправление: Добавлена валюта и признак у.е. в seed для GUID договора
- Улучшение: Добавлено диагностическое логирование для RUB/валюта
- Документация: Создан файл CONTRACT_UUID_FIX.md