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