Возможные проблемы при интеграции с 1С 11.1.2.28

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9.5

Проблема

В некоторых случаях при интеграции с 1С 11.1.2.28 Вы можете столкнутся со следующими проблемами:

  • У загруженных свойств всегда проставляется тип "строка";
  • Не создаются справочники;
  • Справочники не заполняются значениями;
  • Не создает поле "Изготовитель";
  • Поле "Изготовитель" не заполняет значением.

Причина

Если Вы столкнулись с данными проблемами, то это говорит о том, что формат файла import.xml у Вас изменен, а именно:

Тип свойства задан как:

             <Свойства>
			<Свойство>
				<Ид>767faccf-dfcd-11e2-9a0c-8c89a5a63c34</Ид>
				<Наименование>Размер</Наименование>
				<ТипЗначений>Строка</ТипЗначений>
			</Свойство>
                        ...
             </Свойства>

Значение справочника задано как:

                      <Свойство>
				<Ид>767facd3-dfcd-11e2-9a0c-8c89a5a63c34</Ид>
				<Наименование>Обложка</Наименование>
				<ТипЗначений>Справочник</ТипЗначений>
				<ВариантыЗначений>
					<Справочник>
						<ИдЗначения>55d886b4-e27b-11e2-9a0c-8c89a5a63c34</ИдЗначения>
						<Значение>Твердая</Значение>
					</Справочник>
                                        ...
                                </ВариантыЗначений>
                      </Свойство>

Поле "Изготовитель" задано как:

                      <Товар>
                             <Ид>a948edb4-9cee-11e2-9f76-8c89a5a63c34</Ид>
			     <Штрихкод>9785919822097</Штрихкод>
                             ...
                             <Изготовитель>
					<Ид>55d886b9-e27b-11e2-9a0c-8c89a5a63c34</Ид>
					<Наименование>Клевер</Наименование>
					<ОфициальноеНаименование>Клевер</ОфициальноеНаименование>
			     </Изготовитель>
                             ...
                      </Товар>

Решение

Решить проблему можно ли настройкой формата отдаваемого файла в 1С, либо кастомизировать xsl шаблон импорта в UMI.CMS.

Для использования второго варианта замените содержимое файла /xsl/import/custom/commerceML2.xsl следующим кодом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:php="http://php.net/xsl"
	xmlns:udt="http://umi-cms.ru/2007/UData/templates"
	extension-element-prefixes="php"
	exclude-result-prefixes="xsl php udt">

	<xsl:template match="ЗначенияСвойств/ЗначенияСвойства">
		<xsl:param name="property" select="key('property', Ид)" />
		<xsl:param name="value-id">
			<xsl:choose>
				<xsl:when test="ИдЗначения"><xsl:value-of  select="string(ИдЗначения)"/></xsl:when>
				<xsl:when test="Значение"><xsl:value-of  select="string(Значение)"/></xsl:when>
				<xsl:otherwise>string</xsl:otherwise>
			</xsl:choose>
		</xsl:param>
		<xsl:param name="property_name">
			<xsl:choose>
				<xsl:when test="$property/Имя"><xsl:value-of select="$property/Имя"/></xsl:when>
				<xsl:otherwise><xsl:value-of select="$property/Наименование"/></xsl:otherwise>
			</xsl:choose>
		</xsl:param>
		<xsl:param name="data-type">
			<xsl:choose>
				<xsl:when test="$property/ТипыЗначений/ТипЗначений/Тип">
					<xsl:choose>
						<xsl:when test="$property/ТипыЗначений/ТипЗначений/Тип = 'Число'">float</xsl:when>
						<xsl:when test="$property/ТипыЗначений/ТипЗначений/Тип = 'Булево'">boolean</xsl:when>
						<xsl:when test="$property/ТипыЗначений/ТипЗначений/Тип = 'Дата'">date</xsl:when>
						<xsl:when test="$property/ТипыЗначений/ТипЗначений/Тип = 'Справочник'">relation</xsl:when>
						<xsl:otherwise>string</xsl:otherwise>
					</xsl:choose>
				</xsl:when>
				<xsl:otherwise>
					<xsl:choose>
						<xsl:when test="$property/ТипЗначений = 'Число'">float</xsl:when>
						<xsl:when test="$property/ТипЗначений = 'Булево'">boolean</xsl:when>
						<xsl:when test="$property/ТипЗначений = 'Дата'">date</xsl:when>
						<xsl:when test="$property/ТипЗначений = 'Справочник'">relation</xsl:when>
						<xsl:otherwise>string</xsl:otherwise>
					</xsl:choose>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:param>
		<xsl:if test="$property">
			<property name="{$property_name}" title="{$property/Наименование}" type="{$data-type}" is-public="1" visible="visible" allow-runtime-add="1">
				<type data-type="{$data-type}" />
				<title><xsl:value-of select="$property/Наименование"/></title>

				<value>
					<xsl:choose>
						<xsl:when test="$data-type = 'relation'">
							<xsl:choose>
								<xsl:when test="$property/ТипыЗначений/ТипЗначений/ВариантыЗначений/ВариантЗначения[Ид = $value-id]">
									<xsl:apply-templates select="$property/ТипыЗначений/ТипЗначений/ВариантыЗначений/ВариантЗначения[Ид = $value-id]" mode="relation-value" />
								</xsl:when>
								<xsl:otherwise>
									 <xsl:apply-templates select="$property/ВариантыЗначений/Справочник[ИдЗначения = $value-id]" mode="relation-value" />
								</xsl:otherwise>
							</xsl:choose>
						</xsl:when>
						<xsl:otherwise><xsl:value-of select="Значение" /></xsl:otherwise>
					</xsl:choose>
				</value>
			</property>
		</xsl:if>
	</xsl:template>
	
	<xsl:template match="ВариантыЗначений/Справочник" mode="relation-value">
		<item name="{Значение}" />
	</xsl:template>
	
	<xsl:template match="Группы/Группа" mode="types">
		<type id="{Ид}" title='1C: {Наименование}' parent-id="root-catalog-object-type">
			<xsl:if test="name(../../.) = 'Группа'">
				<xsl:attribute name="parent-id"><xsl:value-of select="../../Ид" /></xsl:attribute>
			</xsl:if>
			<base module="catalog" method="object">Объект каталога</base>

			<fieldgroups>
				<!-- product fields -->
				<group name="product" title="1C: Общие свойства" visible="visible">
					<field name="photo" title="Картинка" visible="visible">
						<type name="Изображение" data-type="img_file"/>
					</field>
					<field name="1c_catalog_id" title="Идентификатор каталога 1С" visible="visible">
						<type name="Строка" data-type="string"/>
					</field>
					<field name="1c_product_id" title="Идентификатор в 1С" visible="visible">
						<type name="Строка" data-type="string"/>
					</field>
					<field name="artikul" title="Артикул" visible="visible">
						<type name="Строка" data-type="string"/>
					</field>
					<field name="bar_code" title="Штрих-код" visible="visible">
						<type name="Строка" data-type="string"/>
					</field>
					<field name="weight" title="Вес" visible="visible">
						<type name="Число с точкой" data-type="float"/>
					</field>
					<field name="manufacturer" title="Изготовитель" visible="visible">
						<type name="Строка" data-type="string"/>
					</field>
				</group>
			</fieldgroups>
		</type>

		<xsl:apply-templates select="Группы" mode="types" />

	</xsl:template>
	
	<xsl:template match="Товары/Товар">
		<xsl:param name="group_id" select="string(Группы/Ид)" />
		<xsl:param name="name">
			<xsl:choose>
				<xsl:when test="string-length(ПолноеНаименование)">
					<xsl:value-of select="ПолноеНаименование" />
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="Наименование" />
				</xsl:otherwise>
			</xsl:choose>
		</xsl:param>

		<page id="{Ид}" parentId="{$group_id}" type-id="{$group_id}">
			<xsl:if test="Статус = 'Удален'">
				<xsl:attribute name="is-deleted">1</xsl:attribute>
			</xsl:if>
			<xsl:if test="not(Группы/Ид)">
				<xsl:attribute name="parentId"><xsl:value-of select="$catalog-id" /></xsl:attribute>
				<xsl:attribute name="type-id">root-catalog-object-type</xsl:attribute>
			</xsl:if>

			<default-active><xsl:value-of select="$catalog_item_activity" /></default-active>
			<default-visible><xsl:value-of select="$catalog_item_visible" /></default-visible>

			<basetype module="catalog" method="object">Объекты каталога</basetype>

			<name><xsl:value-of select="$name" /></name>

			<xsl:if test="string-length($catalog_item_template)">
				<default-template><xsl:value-of select="$catalog_item_template" /></default-template>
			</xsl:if>

			<properties>
				<group name="common">
					<title>Основные параметры</title>
					<property name="title" type="string">
						<title>Поле TITLE</title>
						<default-value><xsl:value-of select="$name" /></default-value>
					</property>
					<property name="h1" type="string">
						<title>Поле H1</title>
						<default-value><xsl:value-of select="$name" /></default-value>
					</property>
				</group>

				<group name="product">
					<title>1C: Общие свойства</title>
					<xsl:if test="string-length(Описание)">
						<property name="description" title="Описание" type="wysiwyg" allow-runtime-add="1">
							<type data-type="wysiwyg" />
							<title>Описание</title>
							<value>
								<xsl:choose>
									<xsl:when test="Описание/@ФорматHTML = 'true'">
										<xsl:value-of select="Описание"/>
									</xsl:when>
									<xsl:otherwise>
										<xsl:value-of select="php:function('nl2br', string(Описание))" disable-output-escaping="yes" />
									</xsl:otherwise>
								</xsl:choose>
							</value>
						</property>
					</xsl:if>
					<property name="1c_catalog_id" type="string">
						<title>Идентификатор каталога 1С</title>
						<value><xsl:value-of select="$catalog-id" /></value>
					</property>
					<property name="1c_product_id" type="string">
						<title>Идентификатор в 1С</title>
						<value><xsl:value-of select="Ид" /></value>
					</property>
					<property name="artikul" type="string">
						<title>Артикул</title>
						<value><xsl:value-of select="Артикул" /></value>
					</property>
					<property name="bar_code" type="string">
						<title>Штрих-код</title>
						<value><xsl:value-of select="Штрихкод" /></value>
					</property>
					<property name="weight" type="float">
						<title>Вес</title>
						<value><xsl:value-of select="ЗначенияРеквизитов/ЗначениеРеквизита[Наименование = 'Вес']/Значение"/></value>
					</property>
					<property name="manufacturer" type="string">
						<title>Изготовитель</title>
						<value><xsl:value-of select="Изготовитель/Наименование"/></value>
					</property>

					<xsl:apply-templates select="Картинка" />

				</group>

				<xsl:apply-templates select="ЗначенияСвойств" />

			</properties>
		</page>
	</xsl:template>
	
</xsl:stylesheet>