feat: добавлено различение товаров и услуг в XML 1С EnterpriseData

- Определяем тип номенклатуры по meta.href (/product/ или /service/)
- Добавлен флаг <Услуга> для конфигураций без справочника видов
- Добавлен элемент <ВидНоменклатуры> для УТ 11, ERP
- ТипЗапасов устанавливается только для товаров (не для услуг)
- Логика реализована в обоих методах: generate_realization и _generate_single_document_content
This commit is contained in:
admin i 2025-11-07 13:53:07 +03:00
parent 29dd08ab16
commit 6c8259d306

View File

@ -1099,6 +1099,11 @@ class XML1CGenerator:
product_id = product_href.split("/")[-1].split("?")[0] if product_href else ""
product_name = assortment.get("name", "")
# Определяем тип номенклатуры (товар или услуга)
is_service = False
if product_href and "/service/" in product_href:
is_service = True
# ДанныеНоменклатуры
nomenclature_data = etree.SubElement(row_elem, "ДанныеНоменклатуры")
nomenclature = etree.SubElement(nomenclature_data, "Номенклатура")
@ -1107,6 +1112,17 @@ class XML1CGenerator:
etree.SubElement(nomenclature, "КодВПрограмме").text = assortment.get("code", "")
etree.SubElement(nomenclature, "Наименование").text = product_name
# Флаг услуги (для конфигураций без справочника видов)
if is_service:
etree.SubElement(nomenclature, "Услуга").text = "true"
# ВидНоменклатуры (для конфигураций УТ 11, ERP)
kind_elem = etree.SubElement(nomenclature, "ВидНоменклатуры")
if is_service:
etree.SubElement(kind_elem, "Наименование").text = "Услуга"
else:
etree.SubElement(kind_elem, "Наименование").text = "Товар"
# ЕдиницаИзмерения
uom = assortment.get("uom", {})
uom_elem = etree.SubElement(row_elem, "ЕдиницаИзмерения")
@ -1159,10 +1175,14 @@ class XML1CGenerator:
vat_amount = total / (1 + vat_rate / 100) * (vat_rate / 100) if vat_rate else 0
etree.SubElement(row_elem, "СуммаНДС").text = self._format_money_with_decimals(vat_amount)
# ВНИМАНИЕ: Следующие поля могут отсутствовать в XSD некоторых версий 1С
# Если импорт падает - закомментируйте эти строки
# Дополнительные поля (опционально, зависит от конфигурации 1С)
etree.SubElement(row_elem, "ТипЗапасов").text = "СобственныеТовары"
# ТипЗапасов только для товаров (не для услуг)
if not is_service:
etree.SubElement(
row_elem, "ТипЗапасов"
).text = "СобственныеТовары"
# Счета учета (опционально)
if settings.include_accounting_accounts:
for tag, value in ACCOUNTING_ACCOUNT_TAGS:
etree.SubElement(row_elem, tag).text = value
@ -1717,6 +1737,11 @@ class XML1CGenerator:
)
product_name = assortment.get("name", "")
# Определяем тип номенклатуры (товар или услуга)
is_service = False
if product_href and "/service/" in product_href:
is_service = True
nomenclature_data = etree.SubElement(
row_elem, "ДанныеНоменклатуры"
)
@ -1734,6 +1759,17 @@ class XML1CGenerator:
nomenclature, "Наименование"
).text = product_name
# Флаг услуги (для конфигураций без справочника видов)
if is_service:
etree.SubElement(nomenclature, "Услуга").text = "true"
# ВидНоменклатуры (для конфигураций УТ 11, ERP)
kind_elem = etree.SubElement(nomenclature, "ВидНоменклатуры")
if is_service:
etree.SubElement(kind_elem, "Наименование").text = "Услуга"
else:
etree.SubElement(kind_elem, "Наименование").text = "Товар"
uom = assortment.get("uom", {})
uom_elem = etree.SubElement(row_elem, "ЕдиницаИзмерения")
uom_href = (
@ -1791,12 +1827,17 @@ class XML1CGenerator:
row_elem, "СуммаНДС"
).text = self._format_money_with_decimals(vat_amount)
etree.SubElement(
row_elem, "ТипЗапасов"
).text = "СобственныеТовары"
# ТипЗапасов только для товаров (не для услуг)
if not is_service:
etree.SubElement(
row_elem, "ТипЗапасов"
).text = "СобственныеТовары"
# Счета учета (опционально)
if settings.include_accounting_accounts:
for tag, value in ACCOUNTING_ACCOUNT_TAGS:
etree.SubElement(row_elem, tag).text = value
etree.SubElement(
row_elem, "ИдентификаторСтроки"
).text = str(uuid.uuid4())