[syncMoySklad] - синхронизация с "Мой Склад"

[syncMoySklad] — пакет для синхронизации с сервисом «Мой Склад».
В отличии от уже имеющихся дополнений работает с JSON API. Функционал работы по api существенно отличается от функционала протокола CommerceML, а инициатором синхронизации выступает сайт.
На данный момент реализована лишь следующая часть функционала…

Что уже реализовано…
  • Группа товаров — импорт/экспорт
  • Товары — импорт/экспорт
  • Услуги — импорт/экспорт
  • Модификации — импорт/экспорт
  • Остатки — импорт
  • Валюты — импорт
  • Метаданные (товара, модификации) — импорт
После установки пакета в админке появится кнопка синхронизации (на шаблонах указанных к настройке «Активные шаблоны»)


и вкладка синхронизации. Там ненужно ничего руками заполнять, эти данные заполняются автоматически. Их редактирование полезно/возможно для отладки и когда вы понимаете что делаете. Самостоятельно там ненужно ничего прописывать.
Если эти данные вас смущают можно отключить вкладку настройкой sync_show_sync_data.

Синхронизация — админка сайта
Для запуска синхронизации достаточно выбрать нужное действие, будет открыто окно с логированием процесса.
Можно остановить/запустить/перезапустить процесс синхронизации.



Синхронизация — крон
Для синхронизации под крон пример файла ("/cron/sync.php"). Необходимо указать
  • service — сервис синхронизации

  • action — процессор синхронизации
  • sync_step — начальный шаг синхронизации
Создаем подобный файл и ставим на крон.

$corePath = $modx->getOption('sync_core_path', null,
	$modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/sync/');
	/** @var Sync $Sync */
	$Sync = $modx->getService('sync');

	$params = array(
	'service'   => 'moysklad',
	'action'    => 'mgr/mscategory/sync',
	'sync_step' => 'sync_init',
	);

	$response = $Sync->curlExec($params);
Пользователь синхронизации (задается в настройках sync) должен существовать в админке сайта с необходимыми правами (обновление и создание ресурсов и т.п. ), иначе при запуске вы получите сообщение "Доступ запрещён!".

Класс синхронизации
Возможно самостоятельное добавление класса синхронизации. Достаточно создать настройку
имя_класса_actions, к примеру
moysklad_actions и перечислить доступные действия

Будет добавлен пункт синхронизации имя_класса и подменю в виде перечисленных действий. Под каждое действие должен сущестовать процессор в папке имя_класса компонента синхронизации.

{"mscategory":{"sync":"mscategory\/sync","import":"mscategory\/import","export":"mscategory\/export","stock":"mscategory\/stock"}}
Синхронизация — «Мой склад»
Базовый класс синхронизации с сервисом «Мой склад». На данный момент реализована синхронизация следующих сущностей.

  • Группа товаров — импорт/экспорт
  • Товары — импорт/экспорт
  • Модификации — импорт/экспорт
  • Остатки — импорт
  • Валюты — импорт
  • Метаданные (товара, модификации) — импорт
Можно выгрузить продукты сайта в сервис «Мой склад», можно загрузить продукты с сервиса «Мой склад» на сайт.
Инициатором синхронизации является сайт. Более подробно можно ознакомиться по ссылке МойСклад JSON API

Настройки синхронизация — «Мой склад»
Доступны в разделе «Системные настройки» -> «syncMoySklad» -> «Основные»


  • sync_moysklad_actions — Доступные действия синхронизации.
  • sync_moysklad_api_endpoint — Url для отправки запроса к МойСклад Api.
  • sync_moysklad_api_user — Логин пользователя МойСклад.
  • sync_moysklad_api_password — Пароль пользователя МойСклад.
  • sync_moysklad_api_limit — Лимит обработки данных.
  • sync_moysklad_sync_folder — Папка синхронизации. Название папки МойСклад.
  • sync_moysklad_sync_parent — Категория синхронизации. Id категории сайта.
  • sync_moysklad_currency — Валюта магазина.
  • sync_moysklad_currency_rate — Тарифная ставка магазина.
  • sync_moysklad_process_modification — Обрабатывать модификации.
  • sync_moysklad_process_stock — Обрабатывать остатки.
  • sync_moysklad_process_image — Обрабатывать изображения.
Доступны в разделе «Системные настройки» -> «syncMoySklad» -> «Категория»


  • sync_moysklad_category_class_key — Класс категории.
  • sync_moysklad_category_template — Шаблон категории.
  • sync_moysklad_category_published — Статус категории.
  • sync_moysklad_category_fields — Основные поля категории продукта, массив соответсвия полей.
  • sync_moysklad_category_skip_fields_on_upd — Поля категории продукта исключаемые при обновлении.
  • sync_moysklad_category_process_on_import_upd — Обрабатывать категории продукта при импорте и обновлении.
  • sync_moysklad_category_process_on_import_cre — Обрабатывать категории продукта при импорте и создании.
  • sync_moysklad_category_process_on_export_upd — Обрабатывать категории продукта при экспорте и обновлении.
  • sync_moysklad_category_process_on_export_cre — Обрабатывать категории продукта при экспорте и создании.

Доступны в разделе «Системные настройки» -> «syncMoySklad» -> «Продукт»


  • sync_moysklad_product_class_key — Класс продукта.
  • sync_moysklad_product_template — Шаблон продукта.
  • sync_moysklad_product_published — Статус продукта.
  • sync_moysklad_product_fields — Основные поля продукта, массив соответсвия полей.
  • sync_moysklad_product_skip_fields_on_upd — Поля продукта исключаемые при обновлении.
  • sync_moysklad_product_attributes — Атрибуты продукта, массив соответсвия полей.
  • sync_moysklad_product_price — Цены продукта, массив соответсвия полей.
  • sync_moysklad_product_stock — Остатки продукта, массив соответсвия полей.
  • sync_moysklad_product_process_on_import_upd — Обрабатывать продукты при импорте и обновлении.
  • sync_moysklad_product_process_on_import_cre — Обрабатывать продукты при импорте и создании.
  • sync_moysklad_product_process_on_export_upd — Обрабатывать продукты при экспорте и обновлении.
  • sync_moysklad_product_process_on_export_cre — Обрабатывать продукты при экспорте и создании.
  • sync_moysklad_product_process_attributes_on_import — Обрабатывать атрибуты продукты при импорте.
  • sync_moysklad_product_process_attributes_on_export — Обрабатывать атрибуты продукты при экспорте.
  • sync_moysklad_product_process_image_on_import_cre — Обрабатывать изображения при импорте и создании
    продукта.
  • sync_moysklad_product_process_image_on_import_upd — Обрабатывать изображения при импорте и обновлении
    продукта.
  • sync_moysklad_product_process_image_on_export_cre — Обрабатывать изображения при экспорте и создании
    продукта.
  • sync_moysklad_product_process_image_on_export_upd — Обрабатывать изображения при экспорте и обновлении
    продукта.
  • sync_moysklad_product_process_stock — Обрабатывать остатки продукта.

Доступны в разделе «Системные настройки» -> «syncMoySklad» -> «Модификация»



  • sync_moysklad_modification_fields — Основные поля модификации, массив соответсвия полей.
  • sync_moysklad_modification_characteristics — Характеристики модификации, массив соответсвия полей.
  • sync_moysklad_modification_price — Цены модификации, массив соответсвия полей.
  • sync_moysklad_modification_stock — Остатки модификации, массив соответсвия полей.
  • sync_moysklad_modification_process_on_import — Обрабатывать модификации продукта при импорте.
  • sync_moysklad_modification_process_on_export_upd — Обрабатывать модификации при экспорте и обновлении.
  • sync_moysklad_modification_process_on_export_cre — Обрабатывать модификации при экспорте и создании.
  • sync_moysklad_modification_process_char_on_export — Обрабатывать характеристики модификации при экспорте.
  • sync_moysklad_modification_process_price_on_export — Обрабатывать цену модификации при экспорте.
  • sync_moysklad_modification_process_stock — Обрабатывать остатки модификации при синхронизации.

Доступные действия
  • sync — Полная синхронизации.
  • import — Импорт.
  • export — Экспорт.
  • stock — Импорт остатков.
Полная синхронизации
Будет выполнена полная синхронизация с «Мой склад».

Импорт
Будет выполнен импорт с «Мой склад».

Экспорт
Будет выполнен экспорт в «Мой склад».

Импорт остатков
Будет выполнен импорт остатков с «Мой склад».

На данный момент api «Мой склад» не поддерживает выгрузку с указанием родителя. Поэтому при импорте всегда
будут выгружены полностью
все сущности импорта. Служба поддержки сообщила что работы по внедрению данного функционала ведутся. Как
только он будет доступен
— будет возможен выборочный импорт по родителю.
Экспорт же проходит с указанием текущей категории. Помните об этом при запуске синхронизации.

Первичная настройка
Необходимо задать логин и пароль пользователя «Мой склад»
moysklad_api_password
moysklad_api_user

Необходимо задать настройку moysklad_sync_folder — категорию синхронизации «Мой склад» и
moysklad_sync_parent — id категорию сайта.

К примеру мы хотим синхронизировать папку «Товары склада» в категорию сайта «Мой склад»




Поля категории
Настройка moysklad_category_fields — массив соответствия полей ресурса к полю сущности «Группа
товаров»

{"pagetitle":{"key":"name","type":"string"},"description":{"key":"description","type":"string"},"editedon":{"key":"updated","type":"datetime"}}
Поле «pagetitle» ресурса будет задано значение поля «name» сущности
Поле «description» ресурса будет задано значение поля «description» сущности

Поля продукта
Настройка moysklad_product_fields — массив соответствия полей продукта к полю сущности «Товар»

{"pagetitle":{"key":"name","type":"string"},"description":{"key":"description","type":"string"},"article":{"key":"article","type":"string"},"weight":{"key":"weight","type":"float"},"volume":{"key":"volume","type":"float"},"editedon":{"key":"updated","type":"datetime"}}
Поле «pagetitle» ресурса будет задано значение поля «name» сущности
Поле «description» ресурса будет задано значение поля «description» сущности
Поле «article» ресурса будет задано значение поля «article» сущности

Атрибуты продукта
Продукту или услуге можно добавить дополнительные поля, нажимаем на шестеренку и добавляем нужные поля


например добавим поле Размер


теперь нужно прописать соответствие поле МС к полю продукта на сайте. Пускай полю Размер будет соответствовать поле size продукта, тогда соответствие будет выглядеть так
"size":{"key":"Размер","type":"array"}

можно задать значение поля по умолчанию, для этого надо задать атрибут value
"size":{"key":"Размер","type":"array","value":"oneSize"}
Также можно задавать соответствия к опциям продукта, для этого ключ необходимо указать с префиксом
options-
Например ключ поля stock, в настройкам прописываем его как
options-stock

Также можно задавать соответствия к тв полям, для этого ключ необходимо указать в формате
tv3
Например нам нужна твшка с именем Остаток, смотрим идентификатор этого тв поля — 3 и в настройкам прописываем его как
tv3

Настройка moysklad_product_attributes — массив соответствия дополнительный полей продукта к полю
сущности «Атрибуты Товара»

{"introtext":{"key":"Описание товара","type":"string"},"color":{"key":"Цвет","type":"array"},"size":{"key":"Размер","type":"array"}}
Поле «introtext» ресурса будет задано значение поля «Описание товара» сущности
Поле «color» ресурса будет задано значение поля «Цвет» сущности. Дополнительно указываем тип поля
«array»
Поле «size» ресурса будет задано значение поля «Размер» сущности. Дополнительно указываем тип поля
«array»
Примечание: Возможна работа с дополнительными опциями продукта, необходимо добавить префикс
«options-имяОпции» (options-stock)
Возможна работа с ТВ полями, имя поля необходимо задать как «tvидентификаторТВ» (tv1)

Цена продукта
Настройка moysklad_product_price — массив соответствия цен продукта к полю
сущности «Цена товара»

{"price":{"key":"Цена продажи","type":"float","value":0},"old_price":{"key":"Цена старая","type":"float","value":0}}
Поле «price» ресурса будет задано значение поля «Цена продажи» сущности
Значение по умолчанию 0

Остатки продукта
Настройка moysklad_product_stock — массив соответствия остатков продукта к полю
сущности «Остаток»

{"options-stock":{"key":"stock","type":"float","value":0}}
Поле «options-stock» ресурса будет задано значение поля «stock» сущности
Значение по умолчанию 0.
Для minishop2 создаем опцию «stock», в нее и будет записываться остаток



Свои действия
Возможно добавление своих действий синхронизации. Для этого необходимо внести действие в настройку sync_moysklad_actions.
Рассмотрим добавление действия по импорту остатков продукта.

Настройка sync_moysklad_actions — sync,import,export,stock

Процессор stock. Указывает необходимые шаги синхронизации. Разрешаем опцию «process_stock» — обработки
остатков

require_once dirname(__FILE__) . '/sync.class.php';

	class modSyncMoySkladStockProcessor extends modSyncMoySkladSyncProcessor
	{
	/**
	* @var array
	*/
	protected $steps = array(
	"sync_init",

	"sync_read_stock",

	"sync_import_upd_stock",

	"sync_close",
	);

	public function initialize()
	{
	$initialize = parent::initialize();

	$this->setOption('process_stock', true);

	return $initialize;
	}

	}

	return 'modSyncMoySkladStockProcessor';

WebHook
Возможна обработка событий от «Мой склад». Необходимо задать соответсвующие webHook.
Расмотрим пример обработки события при удалении продукта.
Описаны базовые функции
Задаем WebHook

  • getWebHook — Получить список сущесвующих хуков.
  • setWebHook — Установить хук. Необходимо указать 'action' — действие и 'entityType' — сущность
  • updWebHook — Обновить хук.
  • delWebHook — Отключить хук.
Задаем WebHook

if (!$Sync->loadSyncTools("moysklad")) {
	die('loadSyncTools');
	}
	$Sync->SyncTools->setWebHook(array('action' => 'DELETE', 'entityType' => 'product'));
Создаем плагин в админке сайта на событие «syncOnSyncObjectProcess» и при получении события удаления
сущности продукта
будет помечать ресурс на удаление.

$syncService = 'moysklad';
	if (!$Sync->loadSyncTools($syncService)) {
	return;
	}

	/** @var xPDOObject $object */
	$object = $modx->getOption('object', $scriptProperties, null, true);
	if (
	!$object
	OR
	!$Sync->isSyncObject($object, $syncService)
	) {
	return;
	}

	$syncType = $object->get('sync_type');
	$syncAction = $object->get('sync_action');
	$classKey = $object->get('class_key');
	switch (true) {
	/* hook event */
	case $classKey == 'event' AND $syncType == 'product' AND $syncAction == 'update':
	break;
	case $classKey == 'event' AND $syncType == 'product' AND $syncAction == 'delete':
 	case $classKey == 'event' AND $syncType == 'service' AND $syncAction == 'delete':
	$Sync->SyncTools->processSyncResourceDeleted($object);
	break;
	case $classKey == 'event' AND $syncType == 'productfolder' AND $syncAction == 'delete':
	$Sync->SyncTools->processSyncResourceDeleted($object);
	break;
	}

Снять привязку
При синхронизации происходит связь объекта (ресурса) с сущностью синхронизации. Данные синхронизации доступны во вкладке синхронизации.
Возможно снять эту привязку, достаточно выполнить действие снять привязку — данные текущего объекта и всех вложенных будут очищены.
Полезно например когда вы выполнили синхронизацию, и сделали это допустим некорректно или еще что либо… и вам к примеру проще удалить сущность в сервисе Мой Склад и выполнить все заново, вот для этого и пригодится данное действие.

Снять блокировку
На время синхронизации происходит блокировка синхронизации. Действия синхронизации доступны только для пользователя запустившего процесс.
Данное действие снимает это ограничение. Не рекомендуется выполнять. Если у вас возникает предупреждение что процесс блокирован постарайтесь выяснить причины этого.

PS. Функционал описан кратко и возможностей конечно очень много. По мере возможностей постараюсь раскрыть тему шире.
Всем спасибо за внимание!


update (09.02.2017) .
— Пакет синхронизации разделен на [Sync] базовый пакет — основной функционал и [syncMoySklad] — класс и процессоры для работы с «Мой Склад»
— Добавлена работа с модификациями, адаптирован пакет [msOptionsPrice2]

update (04.03.2017).
— Добавлена работа с сущностью услуга — импорт/экспорт
— Добавлена работа различным кол-ом валют
— Добавлена работа со складами. Как следствие работа с остатками по складам.
Володя
20 января 2017, 10:30
modx.pro
3
12 829
+8
Поблагодарить автора Отправить деньги

Комментарии: 88

Дмитрий
20 января 2017, 15:02
0
Ну вот, только отказался от МойСклад, так как в mSync не очень хорошо все импортировалось, как вышло новое дополнение. А Класс365 уже оплачен.
    Володя
    20 января 2017, 16:10
    0
    Дополнение еще не вышло, это так сказать больше анонс.
    так как в mSync не очень хорошо все импортировалось
    можно узнать в чем была загвоздка?
      Дмитрий
      20 января 2017, 18:11
      0
      Точно не вспомню, но кажется, mSync некорректно выгружал остатки товара.
        Володя
        22 января 2017, 13:09
        0
        вы говорите о выгрузке остатков с «моего склада» на сайт? Или в обратную сторону?
          Дмитрий
          22 января 2017, 13:12
          0
          да, с моего склада на сайт.
            Володя
            22 января 2017, 13:42
            0
            по api можно запросить информацию об остатках.
            доступны:
            stock — Остаток
            inTransit — Ожидание
            reserve — Резерв
            quantity — Доступно

            все это отлично выгружается.
            Сложнее с обратной выгрузкой остатков в «Мой Склад», это реализуется только выгрузкой заказов, вот это еще не реализовано в моем компоненте.
    mekirile
    30 января 2017, 18:23
    0
    Вообще, конечно, очень интересно. По api, все же поправильнее интегрироваться, наверное) Я буду рад попробовать и приобрести. Интересует только пара вопросов:

    Чем будет лучше синхры по CommerceML, которая в mSync сейчас? Можно ли будет плавно перейти с одного компонента на другой (сохранив все url и картинки к товарам)?
      Володя
      30 января 2017, 19:03
      0
      Чем будет лучше синхры по CommerceML
      Насколько я знаю CommerceML позволяет выгружать категории, продукты и заказы с сервиса «Мой Склад» на сайт.
      По апи возможно как выгружать с сервиса «Мой Склад», так и загружать данные в «Мой Склад».
      Аналогично и с другими сущностями сервиса. Так же поддержка пагинации при запросах к апи позволяет корректировать размер выборки в зависимости от мощности сервера. Работа с json всяко приятнее разбора xml.
      Да много всего чего нет в CommerceML.
      Можно ли будет плавно перейти с одного компонента на другой (сохранив все url и картинки к товарам)?
      да, конечно. Нужно будет установить и настроить компонент…
      Evgeny Tarasov
      08 февраля 2017, 16:53
      0
      Подскажите когда ждать данный компонент?
        Володя
        08 февраля 2017, 17:17
        0
        К пятнице-субботе…
          Evgeny Tarasov
          08 февраля 2017, 17:18
          0
          Прям как специально готовите)
          А сколько стоить будет?
      Володя
      09 февраля 2017, 19:59
      0
      Обновил описание, отправил пакет в магазин.
      — Пакет синхронизации разделен на [Sync] базовый пакет — основной функционал и [syncMoySklad] — класс и процессоры для работы с «Мой Склад»
      — Добавлена работа с модификациями, адаптирован пакет [msOptionsPrice2]
        Айдар
        21 апреля 2017, 11:23
        0
        Модуль работает на modx revo с шопкипером или на минишоп?
          Володя
          21 апреля 2017, 11:53
          0
          Модуль работает на modx revo с шопкипером или на минишоп?
          С шопкипером не пробовал, теоретически должно работать, так как нет какой то привязки к конкретному магазину. Нужно проставить необходимые классы ресурсов в настройках пакета и прописать соответствия полей.
          Остается только вопрос по галерее продукта. Каким образом она у вас устроена? Скорее всего можно будет написать плагин на сохранение ресурса и там брать картинку синхронизации в поле sync_images и куда то ее сохранять. На первый взгляд особых сложностей быть не должно.
            Айдар
            23 апреля 2017, 13:13
            0
            Спасибо за ответ, с этим модулем можно сделать синхронизацию с класс 365? или только с программой «мой склад»
              Володя
              23 апреля 2017, 15:23
              0
              с этим модулем можно сделать синхронизацию с класс 365
              не думаю, модуль работает по api МС. Возможно они в чет то и похожи, незнаю, с класс 365 не имел дела.
          Алексей П
          23 мая 2017, 21:54
          0
          Добрый вечер. Как я понимаю у компонента нет возможности онлайн синхронизации остатков? Т.е., допустим, в нашем ИМ купили вещь, после оформления заказа (клиентом либо менеджером) в моем складе и ИМ остатки уменьшились на 1 ед.
          Или нужно будет запускать синхронизацию вручную (либо по крону)?
            Володя
            23 мая 2017, 22:37
            0
            Добрый вечер.
            Теоретически можно задать вебхук на изменение остатков и написать плагин на обновление.
            Практически не делал.
              Алексей П
              23 мая 2017, 22:45
              0
              Через CommerceML, как я понял, это реализовать нельзя?
            Сергей
            13 июля 2017, 10:17
            0
            Как импортировать размеры, если в «Моем складе» они представлены в виде модификаций товара, а уже в самой модификации указывается дополнительное поле «Размер». Есть — ли стандартное решение или нужно


              Володя
              13 июля 2017, 10:20
              0
              модификации МС синхронизируются с модификациями пакета msOptionsPrice2. В настройках syncMoySklad есть отдельный раздел связанный с модификациями.
                Володя
                13 июля 2017, 10:25
                0
                Как импортировать размеры, если в «Моем складе» они представлены в виде модификаций товара
                модификации МС синхронизируются с модификациями пакета msOptionsPrice2
                если же вы хотите чтото другое то вам в любом случае надо поставить выгрузку модификаций в пакете syncMoySklad и написав плагин например на сохранение ресурса брать модификации в поле sync_modifications и делать с ними что вам угодно
              Андрей
              17 июля 2017, 14:53
              0
              Спасибо, полезный плагин. Не могу понять, как синхронизировать неактивные товары? Пробовал в настройке «статус продукта» ставить «да/нет», но в МойСклад они никак не хотят выгружаться, как это сделать?
                Володя
                17 июля 2017, 15:22
                0
                Спасибо, полезный плагин.

                пожалуйста!
                Не могу понять, как синхронизировать неактивные товары?

                не предполагалось что либо делать с неопубликованными ресурсами.
                Потому в данный момент никак их не выгрузить.
                  Андрей
                  17 июля 2017, 15:50
                  0
                  Вот так подстава :) А что если необходимо чтобы товар в админке был, синхронизировался, но не показывался на сайте временно. Может быть можно хотя бы в «Архивные» в «Мойсклад» его выгружать? Зачем тогда нужна настройка «статус продукта»?
                    Володя
                    17 июля 2017, 18:11
                    0
                    Работать с неопубликованными ресурсами не считаю разумным. Архивные ресурсы моего склада это ресурсы к удалению.
                    Настройка статус для задания первоначального статуса продукта при импорте. Возможно ограничить вывод продуктов в каталог по какому либо признаку свойству…
                      Андрей
                      18 июля 2017, 09:59
                      0
                      В каталог да, ограничить вывод можно, но вот если товар опубликован, то ссылка прямая на него будет работать, что не всегда есть хорошо. Ладно, придется делать все товары активными и выгружать в МойСклад, потом опять делать неактивными, т.е. много ручной работы все равно :( Еще как на зло пропало куда-то ваше дополнение по массовому редактированию товаров.
                      Может хотябы можно какой-то Хук написать, который при синхронизации и наличии нулевых остатков (или по какому-то другому свойству) будет деактивировать/активировать товар на сайте?
                        Володя
                        18 июля 2017, 10:32
                        0
                        Может хотябы можно какой-то Хук написать, который при синхронизации и наличии нулевых остатков (или по какому-то другому свойству) будет деактивировать/активировать товар на сайте?
                        вы можете написать плагин на сохранение ресурса брать поле остатка и в зависимости от его значения
                        деактивировать/активировать товар на сайте
                          Андрей
                          20 июля 2017, 09:16
                          0
                          Еще момент, Владимир. Если товар был активирован и синхронизирован с МойСклад, то после его отключения(деактивации в магазине) и последующем импорте ИЗ МойСклад в Магазин товар становится активированным. Это баг или фича?
                            Володя
                            21 июля 2017, 09:45
                            0
                            Если продукт активен в МС, то конечно он при импорте будет снова включен.
                            Попробуйте воспользоваться настройкой
                            sync_moysklad_product_skip_fields_on_upd — Поля продукта исключаемые при обновлении.
                              Андрей
                              21 июля 2017, 11:57
                              0
                              А активность в МС определяется наличием в общей категории и в архиве? или есть какие-то другие опции?
                                Володя
                                21 июля 2017, 12:07
                                0
                                А активность в МС определяется наличием в общей категории и в архиве?
                                да, на одном магазине требовалось не выгружать некоторые товары. Было сделано следующее:
                                добавлена настройка sync_moysklad_filter_product_not_upload
                                значение — Не выгружать


                                в МС создано доп.поле — Не выгружать


                                у товаров которые не нужно выгружать в данное поле пишется что либо, соответственно эти товары не выгружаются c МС.
                Dmitry P.
                22 ноября 2017, 10:27
                0
                Здравствуйте. Возникла некоторая проблема с синхронизацией размеров из стандартного поля minishop2.
                Изначально выглядит вот так:

                В настройках компонента для поля прописана настройка из инструкции, а именно
                "size":{"key":"Размер","type":"array"}
                После экспорта в МойСклад там отображается информация вот так:

                Вроде бы все нормально, но вот после импорта значение поля приобретает следующий вид:

                в базу данных значение сохраняется не как [«10»,«11»,«12»], а [«10,11,12»]
                что с этим можно сделать или что я делаю не так?
                  Володя
                  22 ноября 2017, 10:53
                  0
                  Добрый день.
                  Обновите baseSync до версии 1.0.9-beta и попробуйте выполнить импорт. Должно быть все ок.
                  Если будут проблемы — пишите в ТП.
                  Спасибо!
                    Dmitry P.
                    22 ноября 2017, 12:10
                    0
                    Теперь всё правильно импортируется. Спасибо!
                  Дима
                  01 декабря 2017, 14:07
                  0
                  У меня есть каталог(1) и в нем ещё несколько каталогов(1.1;1.2;1.3) (а в них ещё подкаталоги).
                  Когда делаю экспорт с сайта на МС то синхронизация, как то коряво работает. То загрузит один 1.1, а другие нет. То загрузит 1.1 и несколько других подкаталогов (1.2.1; 1.2.3; 1.3.1 и тд, но не все). Пытаюсь снять привязку у 1, она снимается, но в 1.1;1.2;1.3 и подкаталогах привязка остается. В чем проблему? куда смотреть?
                    Володя
                    01 декабря 2017, 14:15
                    0
                    Добрый день.
                    Напишите в ТП, укажите доступы к админке сайта и каталог в котором наблюдается данная проблема.
                    Спасибо!
                    Василий Столейков
                    11 декабря 2017, 10:11
                    0
                    Дополнение требует miniShop2 или его можно настроить на сайтах, работающих на шопкипере?
                      Володя
                      11 декабря 2017, 10:40
                      0
                      miniShop2 не обязателен, но пакет содержит класс синхронизации только для miniShop2.
                      Для других магазинов теоретически можно написать обработчики аналогично имеющимся…
                    Александр
                    05 февраля 2018, 14:53
                    0
                    Доброго дня. Возникла проблема 29.01 и продолжается, на новые товары не выгружаются остатки и цена, при этом в МойСклад всё в порядке. В настройках видно что повторяется ошибка, вручную тоже не получается выгрузить.
                    file.modx.pro/files/8/7/1/87186a34e10ae24b8f44f7976d9b8619.jpg
                    file.modx.pro/files/5/2/0/520d361134d26ea189a27cf95d662740.jpg
                    На стороне сайта плагин mSklad не позволяет себя обновить:
                    file.modx.pro/files/3/4/2/342fa3105c0f84e81cc924c563a0157b.jpg
                    Версия 1.0.10-pl.
                      Володя
                      05 февраля 2018, 14:58
                      0
                      Добрый день.
                      Смотрим название пакета, смотрим название темы и видим что речь идёт о двух разных компонентах.
                      Пишем в ТП того компонента который используем.
                      Дмитрий Мансуров
                      20 февраля 2018, 23:47
                      0
                      Доброе время суток.
                      Подскажите в какое поле мне добавить
                      "popular":{"key":"Популярный","type":"boolean"},"new":{"key":"Новый","type":"boolean"},"favorite":{"key":"Распродажа","type":"boolean"}
                      В МС поля с именами Популярный, Новый, Распродажа (тип флажок) созданы.
                      Например
                      "tv6":{"key":"На главной","type":"boolean"}
                      Я добавил в moysklad_product_attributes и прекрасно работает
                        Антон
                        19 марта 2018, 23:29
                        0
                        Здравствуйте, не получается синхронизировать поле производитель. Прописываю {«key»:«Производитель»,«type»:«array»} в sync_moysklad_product_attributes. В minishop2 созданы производители соответствующим id. Но при импорте в поле производителя просто первый вендор в списке выходит и все. Что не так делаю?
                          Володя
                          20 марта 2018, 09:27
                          0
                          Доброе утро.
                          попробуйте как
                          "vendor.name": {"key":"Производитель","type":"string"}
                            Антон
                            20 марта 2018, 17:15
                            0
                            Благодарю! Работает.
                          Alex Zhuravlev
                          24 марта 2018, 15:53
                          0
                          Владимир добрый день
                          1. Можете подробнее описать про WebHook'и (может еще примеров)
                          2. Что указывать в sync_moysklad_web_hook_url?
                          3. Где задавать WebHook'и? (прочитал ваш пример и не понял)
                          4. Как я понял если задать webhook (пример на удаление) то при удалении товара из МС он автоматом и без дополнительных действий со стороны ИМ поставит продукт на удаление?

                          Написал не в ТП, может еще кому то пригодится.
                          Спасибо
                            Володя
                            24 марта 2018, 17:30
                            0
                            Добрый день.

                            1 — WebHook (wh) калбек на какое либо действие, обычно HTTP запрос по указанному адресу. Подробней в гугл…

                            2 — адрес по которому находится обработчик, можно получить как
                            $url_hook = $Sync->SyncTools->getHookUrl();

                            3 — для работы с wh есть несколько методов
                            — getWebHook — Получить список сущесвующих хуков.
                            — setWebHook — Установить хук.
                            — updWebHook — Обновить хук.
                            — delWebHook — Отключить хук.
                            проще всего поставить компонент console и выполнить нужный код в нем
                            например, посмотреть список существующих wh
                            <?php
                            echo "<pre>";
                            
                            /** @var array $scriptProperties */
                            /** @var Sync $Sync */
                            $corePath = $modx->getOption('sync_core_path', null,
                                $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/sync/');
                            if (!$Sync = $modx->getService('sync', 'Sync', $corePath . 'model/sync/',
                                array('core_path' => $corePath))
                            ) {
                                return;
                            }
                            $service = 'moysklad';
                            if (!$Sync->loadSyncTools($service)) {
                                return;
                            }
                            
                            $r = $Sync->SyncTools->getWebHook();
                            print_r($r);

                            4 — да. Пример плагина syncMoySkladSystem. Там есть рабочий код на удаление категории/продукта.
                              Alex Zhuravlev
                              24 марта 2018, 19:05
                              0
                              Владимир, что не так делаю.

                              1. В console выполняю код что бы посмотреть wh как вы написали. А почему ошибки?
                              [2018-03-24 15:48:25] (ERROR @ /home/admin/web/tirinipul.ru/public_shtml/core/model/modx/modx.class.php : 1612)
                              [syncOnInit]
                              [2018-03-24 15:48:25] (WARN @ /home/admin/web/tirinipul.ru/public_shtml/core/xpdo/xpdo.class.php : 543)
                              Could not load package metadata for package sync.
                              
                              
                              [2018-03-24 15:48:25] (INFO @ /home/admin/web/tirinipul.ru/public_shtml/core/model/modx/registry/moddbregister.class.php : 147)
                              Message was null or expired: stdClass Object
                              
                              (
                                  [topic] => 4
                                  [id] => moysklad
                                  [created] => 2018-03-24 15:47:23
                                  [valid] => 2018-03-24 15:47:23
                                  [accessed] => 2018-03-24 18:47:23
                                  [accesses] => 0
                                  [expires] => 1521906503
                                  [payload] => if (time() > 1521906503) return null;
                              return 'vqvsg75uatba9ho0k310e727s7';
                              
                                  [kill] => 0
                              )
                              
                              Array
                              (
                                  [0] => Array
                                      (
                                          [meta] => Array
                                              (
                                                  [href] => https://online.moysklad.ru/api/remap/1.1/entity/webhook/39710f10-2f78-11e8-9ff4-34e80003c18b
                                                  [metadataHref] => https://online.moysklad.ru/api/remap/1.1/entity/webhook/metadata
                                                  [type] => webhook
                                                  [mediaType] => application/json
                                              )
                              
                                          [id] => 39720f10-2f78-11e8-9ff4-34e80001c18b
                                          [accountId] => 47278ea8-2d2b-11e8-9109-f8fc000014f6
                                          [entityType] => product
                                          [url] => https://site.ru/assets/components/syncmoysklad/hook.php?auth=YWRtaW5AZnJ3MTpkMsRlNzFiNzI2
                                          [method] => POST
                                          [enabled] => 1
                                          [action] => DELETE
                                      )
                              
                              )

                              2. в sync_moysklad_web_hook_url нужно это прописывать?
                              https://site.ru/assets/components/syncmoysklad/hook.php?auth=YWRtaW5AZnJ3MTpkMsRlNzFiNzI2

                              3. Повесил ваш пример для удаления на syncOnSyncObjectProcess и сейчас при синхронизации, экспорте или импорте вылезает ошибка
                              Синхронизация…
                              Пустой ответ. Попробуйте еще раз
                              prntscr.com/ivs44y
                                Володя
                                25 марта 2018, 10:08
                                0
                                1 — все так. Массив с хуками вам же вывел. На все что выше можете не обращать внимания.
                                2 — выше написал как его получить. Он формируется с помощью getHookUrl. Прежде нужно указать верные sync_user_password и sync_user_username в настройках синхронизации
                                3 — скорее всего что то криво подвесили
                                Alex Zhuravlev
                                24 марта 2018, 19:17
                                0
                                В логах еще
                                [2018-03-24 16:14:50] (ERROR @ /home/admin/web/site.ru/public_shtml/core/components/sync/model/sync/sync.class.php: 386) Неправильное имя пользователя или пароль. Пожалуйста, проверьте введённые данные и попытайтесь снова.

                                а в sync_user_password и sync_user_username нужно указывать данные пользователя в ИМ или МС?
                                  Володя
                                  25 марта 2018, 10:08
                                  0
                                  нужно указывать данные пользователя в ИМ или МС?
                                  конечно ИМ
                              Владимир
                              12 апреля 2018, 19:03
                              0
                              Здравствуйте! Хотел бы уточнить: из описания modstore.pro/packages/import-and-export/syncmoysklad понял, что компонент принимает данные об остатках, но не передаёт их в систему учёта. Т.е. при покупке в ИМ нескольких штук товара, на стороне МойСклад данные об их количестве не обновятся, верно?
                                Володя
                                12 апреля 2018, 19:10
                                0
                                Добрый вечер.
                                Все верно, для работы с заказами в МС предусмотренно отдельное апи. В данном пакете оно не реализовано.
                                  Владимир
                                  13 апреля 2018, 16:58
                                  0
                                  Возможно ли заказать такую доработку?
                                Никита
                                16 июля 2018, 10:36
                                0
                                Здравствуйте, Володя.
                                Никак не получается снять блокировку с привязкой и запустить процесс синхронизации. Причем блокировка сразу при установке вылезла. Жму снять и ничего.
                                  Никита
                                  16 июля 2018, 10:53
                                  0
                                  Пробовал переустанавливать и все равно


                                  Нажимаю руками снять привязку и блокировку — безрезультатно
                                parabellum
                                25 октября 2018, 19:30
                                0
                                Добрый день,
                                Стоит ожидать доработку компонента на предмет работы с заказами или нет? Если да то когда?
                                Спасибо.
                                  Руслан Сафин
                                  19 ноября 2018, 18:18
                                  0
                                  Добрый вечер!

                                  1) Компонент загружает только одно изображение, это мой косяк в настройке или ограничение со стороны Апи МС?

                                  2) Очень не хватает дополнения для работы с заказами, вы не планируете в ближайшее время выпустить такое дополнение?
                                    Володя
                                    19 ноября 2018, 18:36
                                    0
                                    Добрый вечер.
                                    1 — ограничение апи, отдает только 1 картинку.
                                    2 — в ближайшее время не планирую.
                                    Максим
                                    08 февраля 2019, 12:05
                                    0
                                    подскажите, работает ли он с 1с?
                                      Михаил
                                      14 февраля 2019, 16:58
                                      0
                                      Владимир, добрый день!

                                      Название товаров и структура каталога в МС и Минишопе отличаются. Могу ли я обновлять остатки в Минишопе, находя нужный товар по полю Код из МС (поле будет содержать id товара на сайте) joxi.ru/l2ZRJK4FzEWxL2? При этом структуру каталога и товары на сайте не трогать, только обновлять остатки. Если это возможно, то как это лучше реализовать?
                                        Ника
                                        12 августа 2019, 09:08
                                        0
                                        Добрый день! Подскажите, тип tv migx можно импортировать?
                                          Максим
                                          07 ноября 2019, 14:41
                                          0
                                          удалено
                                            Сергей Самусев
                                            12 ноября 2019, 22:05
                                            0
                                            Может не нашел, есть ли в компоненте отправка заказов из minishop2 в Мой Склад и обновление статусов заказов из Мой Склад в Minishop2?
                                            Паша
                                            13 ноября 2019, 21:53
                                            0
                                            Привет Володя! Собираемся приобретать дополнение. Подскажи пожалуйта:

                                            Возможно ли сделать так чтобы на сайт попадали:
                                            — актуальные остатки
                                            — актуальные цены
                                            — измененные товары

                                            То есть не весь каталог каждый раз по крону загружать из «Мой склад», а лишь изменения?
                                              perfkirill
                                              28 января 2020, 10:10
                                              0
                                              Добрый день, подскажите, пожалуйста 2 вещи.

                                              Как получать «единицы измерения»

                                              yadi.sk/i/gUxBQJrySQoiBQ

                                              Как разносить остатки по складам. Я так понял, что это настройки в категории «фильтр», можете кто-нибудь написать пример как это вводить.
                                                perfkirill
                                                28 января 2020, 13:23
                                                0
                                                Смог получить единицы измерения через доп. запрос JSON при синхронизации с помощью плагина.

                                                Но с остатками по складам все еще вопрос, есть хоть какой-нибудь пример?
                                                mekirile
                                                08 апреля 2020, 11:00
                                                0
                                                Из МойСклад на сайт импортируются категории, но почему-то пустыми. Товаров внутри нет. Кто-то сталкивался с подобным? Как можно отследить где ошибка и исправить?
                                                  perfkirill
                                                  09 апреля 2020, 09:47
                                                  0
                                                  Володя, добрый день, можете скинуть полный пример с файлом, который работает по крону? По вашей инструкции не получилось настроить
                                                    perfkirill
                                                    13 апреля 2020, 07:43
                                                    0
                                                    Подскажите что сделано не правильно при настройке крона на импорт с мой склад

                                                    Создал PHP файл, с таким кодом, в качестве action указал «stock»

                                                    <?php
                                                    
                                                    // Подключаем
                                                    define('MODX_API_MODE', true);
                                                    require $_SERVER['DOCUMENT_ROOT'].'/index.php';
                                                     
                                                    // Включаем обработку ошибок
                                                    $modx->getService('error','error.modError');
                                                    $modx->setLogLevel(modX::LOG_LEVEL_INFO);
                                                    $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
                                                    
                                                    
                                                    
                                                    $corePath = $modx->getOption('sync_core_path', null,
                                                    $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/sync/');
                                                    /** @var Sync $Sync */
                                                    $Sync = $modx->getService('sync');
                                                    
                                                    $params = array(
                                                    'service'   => 'moysklad',
                                                    'action'    => 'mgr/mscategory/stock',
                                                    'sync_step' => 'sync_init',
                                                    );
                                                    
                                                    $response = $Sync->curlExec($params);

                                                    В настройках прописал пользователя
                                                    yadi.sk/i/klJ8mnJrJJkvPQ

                                                    В isp панели в планировщике создал задание

                                                    yadi.sk/i/CDhSrxkIO0pIyA
                                                    Но почему-то не срабатывает, в чем может быть причина?
                                                      Александр Мельник
                                                      13 апреля 2020, 08:07
                                                      0
                                                      Я бы посоветовал две вещи попробовать
                                                      — уберите $_SERVER['DOCUMENT_ROOT'] в подключении index.php Укажите абсолютный путь к index.php
                                                      — в строке крона добавить php а затем уже путь к скрипту. (php /var/www/....) Если файл не содержит так называемый шебанг то система не будет знать каким интерпретатором его открывать.
                                                        Дмитрий
                                                        10 июля 2023, 09:32
                                                        0
                                                        Вам удалось решить проблему?
                                                      mekirile
                                                      22 апреля 2020, 23:24
                                                      0
                                                      Написал плагин, который делает товары с нулевым остатком неопубликованными, но он не срабатывает непосредственно после импорта. Приходится заново сохранять — тогда срабатывает. Подскажите, может я не на то событие повесил или что не так?
                                                      <?php
                                                      if ($modx->event->name=="OnDocFormSave"  && $resource->get('template') == "17")  
                                                      {
                                                      $pub = 0;
                                                      $q = $resource->get('id'); // Получаем id ресурса
                                                      $product = $modx->getObject('msProduct', $q); //id Товара msProduct
                                                      $stock = $product->get('stock.value');
                                                      $m = null;
                                                      $q = ['rid' => $resource->get('id')];
                                                      $res = $modx->getCollection('msopModification', $q);
                                                          foreach ($res as $item) {
                                                                //формируем массив из остатков всех модификаций этого товара
                                                                $prod[] = ['count' => $item->get('count')];
                                                              }
                                                          //Проверяем есть ли у нас в наличии хоть одна из модификаций текущего товара
                                                          $res = false;
                                                          foreach ($prod as $a) {
                                                              if ($a['count'] != 0) {
                                                                $res = true;
                                                                break;
                                                              }
                                                          }
                                                      if (isset($stock) || $res) {
                                                         $pub = 1;
                                                      } 
                                                      $resource->set('published', $pub);
                                                      }
                                                        mekirile
                                                        23 апреля 2020, 16:35
                                                        0
                                                        Разобрался. Было указано лишнее системное событие в настройках.
                                                        Константин
                                                        20 марта 2021, 09:26
                                                        0
                                                        Не работает функционал синхронизации модификаций — ошибка в консоли:

                                                        [2021-03-20 09:22:37] (ERROR @ /home/h/hellogbj/groom1.ru/public_html/core/components/sync/model/sync/sync.class.php: 383) modification:export
                                                        [2021-03-20 09:22:37] (ERROR @ /home/h/hellogbj/groom1.ru/public_html/core/components/sync/model/sync/sync.class.php: 386) Array
                                                        (
                                                        [errors] => Array
                                                        (
                                                        [0] => Array
                                                        (
                                                        [error] => Ошибка сохранения модификации: должны быть заданы характеристики
                                                        [code] => 15001
                                                        [moreInfo] => dev.moysklad.ru/doc/api/remap/1.1/#обработка-ошибок-15001
                                                        [line] => 1
                                                        [column] => 2
                                                        [meta] => Array
                                                        (
                                                        [href] => online.moysklad.ru/api/remap/1.1/entity/variant/80799ea9-7825-11eb-0a80-0973000a2b0d
                                                        [metadataHref] => online.moysklad.ru/api/remap/1.1/entity/variant/metadata
                                                        [type] => variant
                                                        [mediaType] => application/json
                                                        [uuidHref] => online.moysklad.ru/app/#feature/edit?id=807999a5-7825-11eb-0a80-0973000a2b0b
                                                        )

                                                        )

                                                        )

                                                        )
                                                          Giant Dad
                                                          20 декабря 2021, 17:35
                                                          0
                                                          А как можно получать изображения модификаций товаров из МойСклад в модификацию msOptionsPrice2? Используется API 1.2. Это где-то в настройках syncMoySklad указывать? Я вижу параметр sync_moysklad_modification_fields, но не понимаю, что дописать в JSON, чтобы получить картинку модификации. Это вообще возможно?
                                                            mekirile
                                                            12 февраля 2022, 13:42
                                                            0
                                                            baseSync перестал авторизовываться. Друзья, кто может помочь разобраться?
                                                              mekirile
                                                              20 июня 2023, 20:01
                                                              0
                                                              Кто-нибудь выгружает Штрикоды к товарам?
                                                                Дмитрий
                                                                25 июля 2023, 09:24
                                                                0
                                                                У кого-нибудь работает обновление товаров по крону?
                                                                раньше были ошибки, прописал абсолютный путь к index.php, после этого пропали, но товары не экспортируются(
                                                                prnt.sc/nIKF9XajT9gJ
                                                                <?php
                                                                
                                                                define('MODX_API_MODE', true);
                                                                
                                                                $developmentConfig = dirname(dirname(dirname(dirname(dirname(dirname(__FILE__)))))) . '/core/config/config.inc.php';
                                                                $productionConfig = dirname(dirname(dirname(dirname(__FILE__)))) . '/config/config.inc.php';
                                                                
                                                                if (file_exists($developmentConfig)) {
                                                                    /** @noinspection PhpIncludeInspection */
                                                                    require_once $developmentConfig;
                                                                } else {
                                                                    /** @noinspection PhpIncludeInspection */
                                                                    //require_once $productionConfig;
                                                                }
                                                                /** @noinspection PhpIncludeInspection */
                                                                require_once '/home/ert/public_html/index.php';
                                                                
                                                                $modx->getService('error', 'error.modError');
                                                                $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
                                                                $modx->setLogTarget('FILE');
                                                                $modx->error->message = null;
                                                                
                                                                /** @var Sync $Sync */
                                                                $Sync = $modx->getService('sync', 'Sync',
                                                                    $modx->getOption('sync_core_path', null,
                                                                        $modx->getOption('core_path') . 'components/sync/') . 'model/sync/');
                                                                $corePath = $modx->getOption('sync_core_path', null, $modx->getOption('core_path') . 'components/sync/');
                                                                $modx->lexicon->load('sync:default');
                                                                
                                                                $params = array(
                                                                    'service'   => 'moysklad',
                                                                    'action'    => 'mgr/mscategory/export',
                                                                    'sync_step' => 'sync_init',
                                                                );
                                                                
                                                                $response = $Sync->curlExec($params);
                                                                
                                                                //var_dump($response);
                                                                  Алексей
                                                                  05 августа 2024, 22:42
                                                                  0
                                                                  Можете поделиться как завели крон? Ни в какую не пашет, ни через crontab, ни через пакет cronmanager
                                                                    Алексей
                                                                    06 августа 2024, 22:45
                                                                    0
                                                                    Все решил, не проследил что исполняющий файл создан от другого пользователя, у кого проблемы с cron, проверяйте права и пользователя.
                                                                    Файл cron:
                                                                    <?php
                                                                        define('MODX_API_MODE', true);
                                                                        require 'Полный пусть до файла index.php в корне';
                                                                        $modx->getService('error', 'error.modError');
                                                                        $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
                                                                        
                                                                        $corePath = $modx->getOption('sync_core_path', null,
                                                                    	$modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/sync/');
                                                                    	$Sync = $modx->getService('sync');
                                                                    
                                                                    	$params = array(
                                                                    	'service'   => 'moysklad',
                                                                    	'action'    => 'mgr/mscategory/sync',
                                                                    	'sync_step' => 'sync_init',
                                                                    	);
                                                                    
                                                                    	$response = $Sync->curlExec($params);
                                                                  Ivan Ramaniovich
                                                                  19 декабря 2023, 19:59
                                                                  0
                                                                  Добрый вечер. Обновил модуль для работы с api v1.2 Мой Склад. Но возникла проблема с дублями модификаций для товара. Кто сталкивался и может подсказать как решить?
                                                                    Володя
                                                                    19 декабря 2023, 20:21
                                                                    0
                                                                    Добрый вечер. Пишите в тп посмотрим в чем дело.
                                                                    Но более 5 магазинов после обновления и с модификациями чувствуют себя нормально. Так что вероятно какая то локальная пенка связанная с опциями модификаций.
                                                                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                                    88