- 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
6.8 KiB
6.8 KiB
Исправление: Услуги превращались в товары при импорте в 1С
🔴 Проблема
При экспорте XML в формате EnterpriseData 1.20 все позиции документа попадали в секцию <Товары>, включая услуги. Это приводило к тому, что 1С импортировала услуги как товары.
Пример проблемного XML:
<Товары>
<Строка>
<ДанныеНоменклатуры>
<Номенклатура>
<Услуга>true</Услуга> <!-- ЭТО УСЛУГА -->
<ВидНоменклатуры>
<Наименование>Услуга</Наименование>
</ВидНоменклатуры>
</Номенклатура>
</ДанныеНоменклатуры>
<!-- ... НО ОНА В СЕКЦИИ <Товары>! -->
</Строка>
</Товары>
✅ Решение
Документ РеализацияТоваровУслуг в формате 1С должен иметь ДВЕ отдельные секции:
<Товары>- для товаров (сДанныеНоменклатуры,ТипЗапасови т.д.)<Услуги>- для услуг (сНоменклатура,Содержаниеи т.д.)
Структура исправленного XML:
<Документ.РеализацияТоваровУслуг>
<!-- ... общие данные ... -->
<!-- Секция для товаров -->
<Товары>
<Строка>
<ДанныеНоменклатуры>
<Номенклатура>
<ВидНоменклатуры>
<Наименование>Товар</Наименование>
</ВидНоменклатуры>
</Номенклатура>
</ДанныеНоменклатуры>
<ТипЗапасов>СобственныеТовары</ТипЗапасов>
<!-- ... -->
</Строка>
</Товары>
<!-- Секция для услуг -->
<Услуги>
<Строка>
<Номенклатура>
<Услуга>true</Услуга>
<ВидНоменклатуры>
<Наименование>Услуга</Наименование>
</ВидНоменклатуры>
</Номенклатура>
<Содержание>Индивидуальный дизайн</Содержание>
<!-- ... -->
</Строка>
</Услуги>
</Документ.РеализацияТоваровУслуг>
🔧 Изменения в коде
Файл: modules/xml_generator.py
Исправлено в двух методах:
generate_realization()- для генерации одиночных документов_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 |
НЕ используется |
🧪 Тестирование
После исправления проверьте:
- Создайте документ с товарами и услугами
- Экспортируйте в XML
- Убедитесь, что в XML есть две секции:
<Товары>и<Услуги> - Импортируйте в 1С
- Проверьте, что услуги импортировались как услуги, а не как товары
📚 Ссылки на спецификацию
- Схема XSD:
аывавы.xml(EnterpriseData 1.0) - Документация 1С по формату обмена EnterpriseData
- Справочник "Номенклатура" в конфигурациях УТ 11, ERP, КА 2.0
⚠️ Важно
Проблема была в двух местах:
- ✅ Метод
generate_realization()- исправлен ранее (для одиночных документов) - ✅ Метод
_generate_single_document_content()- исправлен сейчас (для пакетной генерации)
При склейке нескольких документов в один XML файл использовался отдельный метод _generate_single_document_content(), в котором не было логики разделения на товары и услуги. Теперь исправлено в обоих методах!
После этого исправления необходимо перегенерировать все существующие XML-файлы, если они будут использоваться для импорта в 1С.