UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: denis_savin от 19 Декабря 2013, 15:03:11

Название: Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 19 Декабря 2013, 15:03:11
Здравствуйте. При интеграции с 1с возникла проблема. Юми товары и опциональные свойства принимает, а обратно при заказе не выдает.
Я начал только что изучать технологию xslt и возник у меня вопрос:
Возмож но ли привести выгрузку заказа в такой вид??
Фрагмент выгрузки который нужен:
<Товары>
<Товар>
<Ид>
08116c75-e231-11e2-9f17-80ee7338def1#08116c84-e231-11e2-9f17-80ee7338def1
</Ид>
<Артикул>МП 140 х 200 х20</Артикул>
<Наименование>Махровая простыня без упаковки 140 х 200 х20</Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE"/>
<ХарактеристикиТовара>
<ХарактеристикаТовара>
<Наименование>Размер</Наименование>
<Значение>МП 140 x200 x20</Значение>
</ХарактеристикаТовара>
[color=red]<ХарактеристикаТовара>
<Наименование>Цвет</Наименование>
<Значение>Коралл</Значение>
</ХарактеристикаТовара>
<ХарактеристикаТовара>
<Наименование>Цвет</Наименование>
<Значение>Коралл</Значение>
</ХарактеристикаТовара>[/color]
</ХарактеристикиТовара>
<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Запас</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
<ЦенаЗаЕдиницу>0</ЦенаЗаЕдиницу>
<Количество>1</Количество>
<Сумма>0</Сумма>
<Единица>шт</Единица>
<Коэффициент>1</Коэффициент>
</Товар>
Что бы опциональные свойства так же выводились в выгрузке.
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: admin от 20 Декабря 2013, 12:02:55
да, для этого существует файл /xsl/export/custom/ordersCommerceML.xsl

в нем можно перезаписать любой шаблон из файла /xsl/export/ordersCommerceML.xsl

берем из этого файла шаблон
<xsl:template match="object" mode="order-item">
<xsl:param name="good-id" select="properties/group/property[@name='item_link']/value/page/@id" />
<xsl:param name="good" select="document(concat('upage://', $good-id))/udata/page" />
<xsl:param name="item_price" select="properties/group/property[@name='item_price']/value" />
<xsl:param name="item_amount" select="properties/group/property[@name='item_amount']/value" />
<xsl:param name="item_total_price" select="properties/group/property[@name='item_total_price']/value" />
<Товар>
<xsl:choose>
<xsl:when test="not($good)">
<Ид><xsl:value-of select="@id" /></Ид>
</xsl:when>
<xsl:when test="$good//property[@name = '1c_product_id']/value">
<Ид><xsl:value-of select="$good//property[@name = '1c_product_id']/value" /></Ид>
</xsl:when>
<xsl:otherwise>
<Ид><xsl:value-of select="$good-id" /></Ид>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="$good//property[@name = '1c_catalog_id']/value">
<ИдКаталога><xsl:value-of select="$good//property[@name = '1c_catalog_id']/value" /></ИдКаталога>
</xsl:if>

<Наименование><xsl:value-of select="$good/name | @name" /></Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>

<ЦенаЗаЕдиницу><xsl:value-of select="$item_price" /></ЦенаЗаЕдиницу>
<Сумма><xsl:value-of select="$item_total_price" /></Сумма>
<Количество><xsl:value-of select="$item_amount" /></Количество>
<Единица>шт</Единица>
<Коэффициент>1</Коэффициент>

<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
</Товар>
</xsl:template>

переносим его в /xsl/export/custom/ordersCommerceML.xsl и добавляем в нужное место apply-templates, который выводит блок с характеристиками. Сами характеристики есть в объекте "наименование в корзине", то есть в товаре, который лежит в корзине. Доступ к нему можно получить в этом же шаблоне посредством uobject протокола.

P.S. если совсем непонятно куда идти и что писать, пишите, распишу подробнее
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 20 Декабря 2013, 15:20:24
а можно поподробней, а то я только недавно начал с xslt знакомиться  :( 
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: admin от 16 Января 2014, 03:07:24
Во-первых, читаем  Кастомизация сценария выгрузки заказов для 1С (http://wiki.umisoft.ru/%D0%9A%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D1%8F_%D0%B2%D1%8B%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%B7%D0%B0%D0%BA%D0%B0%D0%B7%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_1%D0%A1)

Во-вторых, в твоем случае, для вывода опционных свойств   заходим в файл /xsl/export/custom/ordersCommerceML.xsl и вставляем там следующие шаблоны
<xsl:template match="object" mode="order-item">
<xsl:param name="good-id" select="properties/group/property[@name='item_link']/value/page/@id" />
<xsl:param name="good" select="document(concat('upage://', $good-id))/udata/page" />
<xsl:param name="item_price" select="properties/group/property[@name='item_price']/value" />
<xsl:param name="item_amount" select="properties/group/property[@name='item_amount']/value" />
<xsl:param name="item_total_price" select="properties/group/property[@name='item_total_price']/value" />

<Товар>
<xsl:choose>
<xsl:when test="not($good)">
<Ид><xsl:value-of select="@id" /></Ид>
</xsl:when>
<xsl:when test="$good//property[@name = '1c_product_id']/value">
<Ид><xsl:value-of select="$good//property[@name = '1c_product_id']/value" /></Ид>
</xsl:when>
<xsl:otherwise>
<Ид><xsl:value-of select="$good-id" /></Ид>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="$good//property[@name = '1c_catalog_id']/value">
<ИдКаталога><xsl:value-of select="$good//property[@name = '1c_catalog_id']/value" /></ИдКаталога>
</xsl:if>

<Наименование><xsl:value-of select="$good/name | @name" /></Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>

<ЦенаЗаЕдиницу><xsl:value-of select="$item_price" /></ЦенаЗаЕдиницу>
<Сумма><xsl:value-of select="$item_total_price" /></Сумма>
<Количество><xsl:value-of select="$item_amount" /></Количество>
<Единица>шт</Единица>
<Коэффициент>1</Коэффициент>

<!-- делаем запрос на существование полей типа опционные -->
<xsl:apply-templates select="properties[.//property[@type='optioned']]" mode="order-item-optioned" >
<!-- передаем xml страницы товара, из неё мы будем вытаскивать название опций -->
<xsl:with-param name="good" select="$good" />
</xsl:apply-templates>


<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>ВидНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
<ЗначениеРеквизита>
<Наименование>ТипНоменклатуры</Наименование>
<Значение>Товар</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
</Товар>
</xsl:template>

<xsl:template match="properties" mode="order-item-optioned">
<xsl:param name="good" />

<ХарактеристикиТовара>
<!-- перебираем все опционные свойства товара в корзине -->
<xsl:apply-templates select=".//property[@type='optioned']/value/option" mode="order-item-optioned" >
<!-- прокидываем xml страницы товара, дальше в следующий вызов -->
<xsl:with-param name="good" select="$good" />
</xsl:apply-templates>
</ХарактеристикиТовара>
</xsl:template>
<xsl:template match="option" mode="order-item-optioned">
<xsl:param name="good" />
<xsl:variable name="option_name" select="@varchar"/>

<ХарактеристикаТовара>
<Наименование><xsl:value-of select="$good//property[@name=$option_name]/title"/></Наименование>
<Значение><xsl:value-of select="object/@name"/></Значение>
</ХарактеристикаТовара>
</xsl:template>

В-третьих, тестировать правильность вывода удобно настроив экспорт заказов в модуле "Обмен данными"
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 18 Января 2014, 01:20:33
Спасибо огромное, именно то что нужно  :) :D
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 22 Января 2014, 13:04:21
При тестировании нашел один нюанс, который не очень хорошо сказываеться на выгрузке.
Если пользователь допустил ошибку, и по нечаянности  добавил в корзину два раза один и тот же товар с одной и той же характеристикой(только количество разное). выгрузка почему то дублирует опциональное свойство при выгрузке.
Как от этого избавиться?

пример что получается:
<Товар>
<Ид>c72ffee9-d7d7-11e2-97aa-80ee7338def1</Ид>
<ИдКаталога>436951b5-46c2-4474-89ca-871c7d094326</ИдКаталога>
<Артикул>НС400-0в-13</Артикул>
<Наименование>Ночная сорочка "Габриэль" (Коралловая)</Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>
<ХарактеристикиТовара>
<ХарактеристикаТовара>
<Наименование>Размер</Наименование>
<Значение>р.52</Значение>
</ХарактеристикаТовара>
<ХарактеристикаТовара>
<Наименование>Цвет</Наименование>
<Значение>№ 13 (коралловый)</Значение>
</ХарактеристикаТовара>
<ХарактеристикаТовара>
<Наименование>Размер</Наименование>
<Значение>р.52</Значение>
</ХарактеристикаТовара>
<ХарактеристикаТовара>
<Наименование>Цвет</Наименование>
<Значение>№ 13 (коралловый)</Значение>
</ХарактеристикаТовара>
</ХарактеристикиТовара>
<ЦенаЗаЕдиницу>130</ЦенаЗаЕдиницу>
<Сумма>1690</Сумма>
<Количество>13</Количество>
<Единица>шт</Единица>
<Коэффициент>1</Коэффициент>
<ЗначенияРеквизитов>...</ЗначенияРеквизитов>
</Товар>
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: admin от 22 Января 2014, 14:05:09
а как выглядит xml заказа, в котором есть такие товары? вышлите xml информаци о заказе, можно посмотреть через uobject://[id_заказа] в адресной строке и приложите здесь.

P.S. система при добавлении одного и того же товара с одной и тойже опцией должна обхединять их в один товар нужного количества. Так что ваша ситуация
Цитировать
пользователь допустил ошибку, и по нечаянности  добавил в корзину два раза один и тот же товар с одной и той же характеристикой(только количество разное)
выглядит как некорректная работа системы... функцию emarket/basket не кастомизировали?
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 27 Января 2014, 12:46:52
а как выглядит xml заказа, в котором есть такие товары? вышлите xml информаци о заказе, можно посмотреть через uobject://[id_заказа] в адресной строке и приложите здесь.

P.S. система при добавлении одного и того же товара с одной и тойже опцией должна обхединять их в один товар нужного количества. Так что ваша ситуация
Цитировать
пользователь допустил ошибку, и по нечаянности  добавил в корзину два раза один и тот же товар с одной и той же характеристикой(только количество разное)
выглядит как некорректная работа системы... функцию emarket/basket не кастомизировали?

Сейчас специально сделал заказ с ошибкой пользователя. 1й товар добавил как надо(1 нажатием), 2й специально нажал 2 раза(типа забыл что добавил). Опциональные свойства были одинаковые.
Количество второго товара в корзине не изменилась(как была 1 так и осталась). я использую добавление с указанием количества.
ссылка: http://wiki.umisoft.ru/Добавление_товара_в_корзину_с_указанием_Количества
В uobject://5472 все выглядит нормально, а вот в выгрузке в 1с почему то дубляж.(файл тоже приложил)


Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 17 Февраля 2014, 20:55:36
Вопрос решился. Оказывается в ядре cms был косяк. Программисты из юми все исправили и в следующем обновлении все будет нормально.
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: admin от 14 Мая 2014, 13:59:15
в какой версии был косяк? и есть ли данные в какой их исправят?
Название: Re:Выгрузка заказа в 1с с опциональными свойствами товара
Отправлено: denis_savin от 14 Мая 2014, 15:35:27
в какой версии был косяк? и есть ли данные в какой их исправят?
Уже исправили. С приходом версии 2.9.6

Модуль Обмен данными:
19169   Устранена проблема дублирования опционных свойств товара при выгрузке в 1С.