BUH_bot/SERVICES_FIX.md
Игорь Надеин 4038ff9f92 Fix XML generator contract UUID generation and cleanup temporary files
- Update contract UUID to include currency and UE flag for correct 1C account selection
- Remove temporary export.xml and refactored files
- Add documentation for services fixes
2025-11-07 16:19:25 +03:00

6.8 KiB
Raw Permalink Blame History

Исправление: Услуги превращались в товары при импорте в 1С

🔴 Проблема

При экспорте XML в формате EnterpriseData 1.20 все позиции документа попадали в секцию <Товары>, включая услуги. Это приводило к тому, что 1С импортировала услуги как товары.

Пример проблемного XML:

<Товары>
  <Строка>
    <ДанныеНоменклатуры>
      <Номенклатура>
        <Услуга>true</Услуга>  <!-- ЭТО УСЛУГА -->
        <ВидНоменклатуры>
          <Наименование>Услуга</Наименование>
        </ВидНоменклатуры>
      </Номенклатура>
    </ДанныеНоменклатуры>
    <!-- ... НО ОНА В СЕКЦИИ <Товары>! -->
  </Строка>
</Товары>

✅ Решение

Документ РеализацияТоваровУслуг в формате 1С должен иметь ДВЕ отдельные секции:

  1. <Товары> - для товаров (с ДанныеНоменклатуры, ТипЗапасов и т.д.)
  2. <Услуги> - для услуг (с Номенклатура, Содержание и т.д.)

Структура исправленного XML:

<Документ.РеализацияТоваровУслуг>
  <!-- ... общие данные ... -->
  
  <!-- Секция для товаров -->
  <Товары>
    <Строка>
      <ДанныеНоменклатуры>
        <Номенклатура>
          <ВидНоменклатуры>
            <Наименование>Товар</Наименование>
          </ВидНоменклатуры>
        </Номенклатура>
      </ДанныеНоменклатуры>
      <ТипЗапасов>СобственныеТовары</ТипЗапасов>
      <!-- ... -->
    </Строка>
  </Товары>
  
  <!-- Секция для услуг -->
  <Услуги>
    <Строка>
      <Номенклатура>
        <Услуга>true</Услуга>
        <ВидНоменклатуры>
          <Наименование>Услуга</Наименование>
        </ВидНоменклатуры>
      </Номенклатура>
      <Содержание>Индивидуальный дизайн</Содержание>
      <!-- ... -->
    </Строка>
  </Услуги>
</Документ.РеализацияТоваровУслуг>

🔧 Изменения в коде

Файл: modules/xml_generator.py

Исправлено в двух методах:

  1. generate_realization() - для генерации одиночных документов
  2. _generate_single_document_content() - для пакетной генерации (склейка нескольких документов)

1. Разделение позиций на товары и услуги (строки 1108-1119 и 1819-1830):

# Разделяем позиции на товары и услуги
товары = []
услуги = []

for pos in positions:
    assortment = pos.get("assortment", {})
    if _is_service(assortment):
        услуги.append(pos)
    else:
        товары.append(pos)

2. Генерация секции <Товары> (строки 1121-1207):

  • Добавлен блок if товары: - секция создаётся только если есть товары
  • Для товаров используется <ДанныеНоменклатуры>
  • Добавляется <ТипЗапасов> (обязательно для товаров)
  • Счета учета: 43, 90.01.1, 90.02.1, 90.03

3. Генерация секции <Услуги> (строки 1209-1275):

  • Добавлен новый блок if услуги: - секция создаётся только если есть услуги
  • Для услуг используется <Номенклатура> напрямую (БЕЗ ДанныеНоменклатуры)
  • Обязательный флаг <Услуга>true</Услуга>
  • Добавлено поле <Содержание> с описанием услуги
  • Счета учета: 90.01.1, 90.02.1, 90.03 (БЕЗ счета 43)

📋 Ключевые различия между Товарами и Услугами

Параметр Товары Услуги
Обёртка номенклатуры <ДанныеНоменклатуры> Напрямую <Номенклатура>
Флаг услуги Не используется <Услуга>true</Услуга>
ТипЗапасов СобственныеТовары НЕ используется
Содержание НЕ используется Описание услуги
СчетУчета 43 (товары на складе) НЕ используется
ПрослеживаемыйТовар false НЕ используется

🧪 Тестирование

После исправления проверьте:

  1. Создайте документ с товарами и услугами
  2. Экспортируйте в XML
  3. Убедитесь, что в XML есть две секции: <Товары> и <Услуги>
  4. Импортируйте в 1С
  5. Проверьте, что услуги импортировались как услуги, а не как товары

📚 Ссылки на спецификацию

  • Схема XSD: аывавы.xml (EnterpriseData 1.0)
  • Документация 1С по формату обмена EnterpriseData
  • Справочник "Номенклатура" в конфигурациях УТ 11, ERP, КА 2.0

⚠️ Важно

Проблема была в двух местах:

  1. ✅ Метод generate_realization() - исправлен ранее (для одиночных документов)
  2. ✅ Метод _generate_single_document_content() - исправлен сейчас (для пакетной генерации)

При склейке нескольких документов в один XML файл использовался отдельный метод _generate_single_document_content(), в котором не было логики разделения на товары и услуги. Теперь исправлено в обоих методах!

После этого исправления необходимо перегенерировать все существующие XML-файлы, если они будут использоваться для импорта в 1С.