1c синхронизация с разной структурой групп/каталогов

#
1c синхронизация с разной структурой групп/каталогов
По сути, вопрос к разработчикам, но если кто решил эту проблему подскажите  
ИМ, все товары в свое время загружали на сайт через CSV, а в 1с импортировались только заказы. Причины: не знаю как сейчас, но год назад в 1с загрузить товары из CSV и т.д. с несколькими картинками это было на гране фантастики)). На днях обновил 1с и hostCMS до последних версий, и обнаружил что механизм синхронизации стал более гибким, и решил настроить выгрузку из 1с на сайт цен и остатков.
Пока, не выходит...

Для примера, стрктура каталогов в 1С:
1с_Товары
            1с_Вилки
            1с_Ложки


Структура групп в HostCMS:
HC_Товары (XML_ID=1)
            HC_Приборы (XML_ID=2)
                        HC_Вилки (XML_ID=3)
                        HC_Ложки (XML_ID=4)

            
Задача для примера: выгрузить остатки и цены по товарам из 1с на сайт  -  из "1с_Товары -> 1с_Ложки" в "HC_Товары -> HC_Приборы ->   HC_Ложки"
В 1с в настройках выгрузки указываю:
Группа номенклатуры = '1с_Ложки' (выбираю из каталога номенклатуры 1с)
Наименование каталога = 'HC_Ложки' (в hostCMS - $sCatalogName)
Идентификатор каталога товаров XML ID = '2' (в hostCMS - $sCatalogId)


В итоге получаю на сайте вот такое:
HC_Товары (XML_ID=1)
      HC_Приборы (XML_ID=2)
            HC_Вилки (XML_ID=3)
            HC_Ложки (XML_ID=4)
            1с_Ложки (XML_ID=bffba4b2-f515-11e5-880c-685d43720307) - суда загрузились все товары из 1с


Выяснил, что параметр $sCatalogName HostCMS получает, но по сути игнорирует его, помещая товары не в него ($sCatalogName="HC_Ложки" а создает новую группу с названием из ("Группа номенклатуры", т.е. "1с_Ложки" и с ID этого каталога из 1с !!! Не вникал в CML 2,0 но другого объяснения не нашел, т.к. можно сколько угодно переименовывать/переносить этот каталог в 1С, а в CMS и по удалять все. При полной выгрузке на сайте в HC_Приборы (XML_ID=2) всегда создается группа с одним и тем же ID (в моем случаи ID=bffba4b2-f515-11e5-880c-685d43720307), и с именем как называется каталог в 1с, хотя повторюсь нужно-то с именем $sCatalogName которое я указал в настройках выгрузки в 1с, да и ID из 1с брать тоже нет необходимости. Ведь поиск на существования группы ведется по ID. А указывать это ID группы 1c не дает, только имя группы. т.е. даже если имена каталога в 1с и группы в CMS будут одинаковые (ну id у них естественно будут разные раз я создавал структуры ручками в CMS), например "1с_Товары -> Ложки", а на сайте "HC_Товары -> HC_Приборы -> Ложки" все равно получается так же - HostCMS создаст 2-ую группу с таким же именем "Ложки" и с ID каталога из 1с (который как я полагаю берется из import.xml) и загрузит/обновит товары в ней.
В общем в логике 1с синхронизации есть не точность, данные обновляются не в группе с именем $sCatalogName(в 1с - "Наименование каталога", а в группе с ID каталога из 1с.
Вопрос это поправят? Может есть костыль - как настроить выгрузку/обновление товаров из 1с, с учетом того что в 1с и на сайте разная структура каталогов и в hostCMS эта структура уже существует с загруженными в неё товарами?
#
Re: 1c синхронизация с разной структурой групп/каталогов
Попробуйте убрать галочку в 1С "Выгружать каталог". тогда обмен будет только по GUID конкретных товаров. А выгруженный каталог на сайте отредактируйте как вам нужно.
https://www.beregusha.com https://www.coffemol.ru
#
Re: 1c синхронизация с разной структурой групп/каталогов
В 1с бесчисленное множество конфигураций, как типовых так и не типовых конкретно в моей нет галки "не выгружать каталоги", более того возможно и в Вашей в следующем обновлении парни из 1с ее уберут. Но все это множество 1с поддерживает протокол CML, и передает все необходимые данные в HostCMS. А вот как это все это распределить по группам определяет HostCMS, по этому если эти галочки/константы (искать группы по GUID или по имени и по какому имени) и нужны то они должны быть в CMS. Хотя на мой взгляд можно обойтись и без них, немного доработав логику контролера импорта. Barbaros, но все равно спасибо
Модератор
#
Re: 1c синхронизация с разной структурой групп/каталогов
У нас взаимодействие с 1С строится на основе протокола обмена CML версии 2.08.
Группы и товары ищутся исключительно по уникальным CML_ID, указанных для групп и товаров соответственно.
Никто никогда не обещал, что соответствие ваших товаров в каталоге и в 1С будет производиться по названию, это в корне не верно, т.к. часто в одной и той же группе есть товары с идентичными наименованиями.
Если у вас возникает при обмене с 1С проблема создания корневой группы, то см. документацию, раздел "Группы номенклатуры".
#
Re: 1c синхронизация с разной структурой групп/каталогов
Да рано я обрадовался, веселого мало. в 1с (из коробки), нет возможности загрузить из файла доп.фотки к товарам. В HostCMS есть такая возможность например через CSV. При загрузке товаров из файла CSV в 1с и на сайт, естественно 1с создаст свои ID, а CMS свои ID. А синхронизация потом происходит по ID и на сайте все дублируется. По логике что бы ID были одинаковыми можно выгрузить товары из CMS и загрузить их в 1с (например через CSV), но 1с не дает там явно уназывать колонку с ID, а CML 2.x при загрузке номенклатуры она не поддерживает (только xlsx, mxl, csv).
Как вариант хотелось бы увидеть в конфиге импорта, настройку для первой синхронизации - FirstImportFindByName(FALSE|TRUE). При TRUE, при обмене товары и группы на сайте ищутся по имени, и у них меняется ID с тех что создала СMS на те ID которые из 1c (import.xml).
Цитата:
Никто никогда не обещал, что соответствие ваших товаров в каталоге и в 1С будет производиться по названию
Я и не прошу ни чего обещать . Просто описал проблему с которой столкнулся, и ищу варианты ее решения.
p.s. судя по форому многие импортируют товары в HostCMS через CSV, появится 1с столкнутся с такой же проблемой синхронизации.
#
Re: 1c синхронизация с разной структурой групп/каталогов
я  все-таки копнул поглубже...
В контролер импорта (синхронизации) с 1с, есть один не дочетик. В 1с есть 2-а типа выгрузки:
1-й: Выгрузка цен и остатков (offers.xml)
2-й: Выгрузка товаров, цен и остатков (import.xml + offers.xml)
Но при первом варианте обмена, на сайте не обновляется цена. Причина в том, что 1с формирует разные offers.xml для этих двух вариантов и для первого варианта в offers отсутствует блок с глобальной валютой всего предложения, как следствие sShopDefaultPriceGUID остается пустой строкой, и в месте
elseif ($this->sShopDefaultPriceGUID == strval($oPrice->ИдТипаЦены))
получается FALSE,  и не выполняется
$oShopItem->price = Shop_Controller::instance()->convertPrice(strval($oPrice->ЦенаЗаЕдиницу));
И цена на сайте не обновляется ((.
И очень хотелось бы всетаки увидеть настройку в confige для поиска товаров/каталогов по имени при выгрузке/обновлении, а так же для замены этим найденным товарам ID_CMS на ID_1C (TRUE|TRUE_REPLASE_ID|FALSE). В Битриксе такие есть (см. скрин) https://yadi.sk/i/WRSQ2ooU3RT53C
Еще, обратил внимание, что в контролере импорта в блоке где импортируется offers.xml не учитывается массив-настройка updateFields()., т.е. не используется функция _checkUpdateField() для обновления полей. На мой взгляд, это не корректно.
p.s. я конечно сделал костыль для всего этого  - 5 строчек кода, и 8 часов!! вникания((. но все же допилите этот контролер Пжлста;
Модератор
#
Re: 1c синхронизация с разной структурой групп/каталогов
glen писал(а):
В контролер импорта (синхронизации) с 1с, есть один не дочетик

Опять же, этот с позволения сказать "недочетик" в 1С, а не в контроллере импорта.

CML ID (GUID) цены, которая будет импортироваться в обычную (розничную) цену товара определяется по ТипыЦен/ТипЦены из ПакетПредложений (или ИзмененияПакетаПредложений), если ваша конфигурация не выгружает этот блок, то в блоке Предложение/Цены/Цена нет возможности определить что же именно это за цена. Вероятно это особенности именно вашей конфигурации 1С, множество других пользователей таких проблем не имеют.

glen писал(а):
Еще, обратил внимание, что в контролере импорта в блоке где импортируется offers.xml не учитывается массив-настройка updateFields()., т.е. не используется функция _checkUpdateField() для обновления полей. На мой взгляд, это не корректно.

Вы про название и артикул у модификации?
#
Re: 1c синхронизация с разной структурой групп/каталогов
Версия 1С свежая - 8.3 (8.3.11.2867), Конфигурация УНФ - 1.6 (1.6.12.12) из коробки, без изменений.
Отсутствие цены в ИзмененияПакетаПредложений, мне тоже показалось странной, но факт остается фактом.
Цитата:
Вы про название и артикул у модификации?

Меня конечно больше всего интересовало price и count. Я не пользуюсь модификациями, но если их название и артикул обновляется из offers.xml, то и это тоже.
p.s. в документации к updateFields() написано только про эти поля array('marking', 'name', 'shop_group_id', 'text', 'description', 'images', 'taxes', 'shop_producer_id');  может быть это и не закладывалось, но ведь _checkUpdateField() проверяет наличие в массиве updateFields() названия поля из БД и если оно там есть, то обновляет значение этого поля в БД. Соответственно почему бы не проверить и price и count. Если я не хочу обновлять например количество или только цену товара. т.е. на мой взгляд _checkUpdateField() должна присутствовать везде.
#
Re: 1c синхронизация с разной структурой групп/каталогов
Цитата:
Отсутствие цены в ИзмененияПакетаПредложений

Я тут подумал, а может логика в таком поведении 1С и есть. Ведь это Выгрузка только цен и остатков (offers.xml). Подразумевается что товары, каталоги, склады и типы цен уже выгружены на сайт. И тут передается только ID – товара, ID цены, цена, ID склада, количество. То есть именно предложение! Как это и написано в 1С, "Выгрузка только цен и остатков" и точка. Типы цен, склады, инфо о товарах здесь и не должно быть.
Вот offers.xml  который генерирует 1С при типе выгрузке – «Выгрузка только цен и остатков»
<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация xmlns="urn:1C.ru:commerceml_208" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ВерсияСхемы="2.08" ДатаФормирования="2018-01-14T03:00:28">
   <ИзмененияПакетаПредложений СодержитТолькоИзменения="false">
      <Ид>2ec4dd78-47b1-4275-b904-9f986e82c3ee#</Ид>
      <Наименование>Изменения пакета предложений</Наименование>
      <ИдКаталога>2ec4dd78-47b1-4275-b904-9f986e82c3ee</ИдКаталога>
      <Предложения>
         <Предложение>
            <Ид>719cb7c9-207a-11e7-99bd-685d43720307</Ид>
            <Наименование>Товар_1</Наименование>
            <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE"/>
            <Цены>
               <Цена>
                  <Представление>450 руб. за шт</Представление>
                  <ИдТипаЦены>35f0ad67-f8d3-11e5-880c-685d43720307</ИдТипаЦены>
                  <ЦенаЗаЕдиницу>450</ЦенаЗаЕдиницу>
                  <Валюта>руб</Валюта>
                  <Единица>шт</Единица>
                  <Коэффициент>1</Коэффициент>
               </Цена>
            </Цены>
            <Количество>1</Количество>
            <Склад ИдСклада="2aec6256-f511-11e5-880c-685d43720307" КоличествоНаСкладе="1"/>
         </Предложение>
         <Предложение>
            <Ид>7734d357-955d-11e6-b17e-685d43720307</Ид>
            <Наименование>Товар_2</Наименование>
            <БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE"/>
            <Цены>
               <Цена>
                  <Представление>200 руб. за шт</Представление>
                  <ИдТипаЦены>35f0ad67-f8d3-11e5-880c-685d43720307</ИдТипаЦены>
                  <ЦенаЗаЕдиницу>200</ЦенаЗаЕдиницу>
                  <Валюта>руб</Валюта>
                  <Единица>шт</Единица>
                  <Коэффициент>1</Коэффициент>
               </Цена>
            </Цены>
            <Количество>4</Количество>
            <Склад ИдСклада="2aec6256-f511-11e5-880c-685d43720307" КоличествоНаСкладе="4"/>
         </Предложение>
      </Предложения>
   </ИзмененияПакетаПредложений>
</КоммерческаяИнформация>

Модератор
#
Re: 1c синхронизация с разной структурой групп/каталогов
1. В обновлении 6.7.8 добавлено:
При обмене с 1С добавлена обработка ограничения на импорт данных по ценам и остаткам на складе из offers.xml. Если вы используете ограничение через опцию updateFields(), то добавьте в массив еще 2 опции: 'prices', 'warehouses'. Более подробно см. http://www.hostcms.ru/documentation/modules/shop/exchange/1c/trade/
Также добавлена проверка на name и marking у модификации.

2. Цены для групп пользователей импортируются и в случае, если ТипыЦен/ТипЦены отсутствуют, а вот основная цена не может быть проимпортирована, т.к. GUID цены не говорит о том, розничная она или нет! Нет блока ТипыЦен/ТипЦены и нельзя определить что это за цена по GUID.
Авторизация