[mSync] Новая версия синхронизации с 1С




После длительной разработки, хочу представить вам новую версию дополнения для синхронизации интернет-магазинов miniShop 2 с сервисами, поддерживающими обмен по протоколу CommerceML, в первую очередь с «1С. Управление торговлей» на базе «1С Предприятие» версии >= 8.0.

Дополнение mSklad было полностью переработано изнутри, поэтому mSync было решено выпустить отдельно — он не имеет обратной совместимости с предыдущими версиями. Но благодаря переработке появились большие возможности по развитию дополнения в будущем. При этом техподдержка старой версии mSklad, будет так же действовать 1 год с момента покупки.

Изменения относительно дополнения mSklad:

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

— Логирование всего процесса синхронизации в единственный текстовый файл для каждой выгрузки в двух режимах: полное — весь процесс синхронизации (для дебага), сокращенное — краткий отчет о проделанной выгрузке.

— Запуск синхронизации в ручном режиме: то, что раньше нужно было выполнять по методичке с сайта geek.pro (ныне закрытого), можно теперь сделать в пару кликов мыши.

— Добавлено автоматическое создание TV для типов цен при включении соответствующей настройки, как это было сделано для свойств товаров.

— Практически полностью переработан код дополнения.

— Убрана поддержка устаревшего протокола обмена с сервисом МойСклад. Если вы хотите синхронизироваться с этим сервисом по его собственному новому протоколу (не CommerceML), используйте дополнение SyncMoySklad. Синхронизация с сервисами Класс365 и МойСклад по-прежнему поддерживается через протокол CommerceML.

— Убрано ограничение по загрузке каталога в корень сайта.

— Написана документация на docs.modx.pro

— Другие мелкие фиксы ошибок и исправления логики.

Дополнение скоро будет доступно в магазине modstore.pro
Виталий Киреев
21 августа 2017, 13:51
modx.pro
1
8 595
+9

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

Дмитрий
22 августа 2017, 09:53
0
ох, счастье-то какое!
А если я купил mSync прошлой версии, на эту версию бесплатно я уже не обновлюсь, да?
    Виталий Киреев
    22 августа 2017, 10:23
    0
    Да
      mngatoff
      22 августа 2017, 16:20
      +3
      несколько грустно для тех, кто давно купил и ждал обещанных улучшений
Иван Чуваев
28 августа 2017, 12:24
+1
Добрый день!
Подскажите пожалуйста, а каким образом запускается непосредственно процесс синхронизации?
По крону на сайте?
Или настраивается в 1С в узле обмена с web сайтом?
Интересует насколько быстро можно передавать заказы с сайта в 1С, чтобы случайно не возникала «пересортица».
    Иван Чуваев
    28 августа 2017, 13:14
    0
    Модуль mSync купил, полез смотреть настройки. А есть какой-то более-менее подробный мануал, как осуществляется связь с 1С?
    Поскольку вопросов много:
    — какие реквизиты заказчика передаются в 1с?
    — что происходит, если заказчик заказывает первый раз, или наоборот заказывает повторно. Как не дублируются данные?
    — как происходит выгрузка картинок из 1С, сам механизм.
    — как настроить выгрузку «изменений в 1С», например продали товар офлайн и нужно сообщить сайту, что доступное количество товаров изменилось.
    и т.д. и т.п.
    Андрей Степаненко
    21 сентября 2017, 09:29
    0
    Добрый день
    Поменяйте на это:
    // core/components/msync/processors/mgr/extend/createmsproduct.class.php
    
    if ($this->modx->getOption('msync_alias_with_id', false)) {
    	$max_id = $this->object->id;
    	if (empty($max_id)) {
    		$sql = 'Select max(`id`) as `maxid` from '.$this->modx->getTableName('msProduct');
    		$statement = $this->modx->query($sql);
    		$produtcs = $statement->fetchAll(PDO::FETCH_ASSOC);
    		$max_id = $produtcs [0]['maxid'];
    		$max_id = $max_id + 1;
    	}
    	$alias .= '-' . $max_id;
    }
    А то так до конца жизнь пользователи мучатся будут с генерацией уникальных url
      Виталий Киреев
      21 сентября 2017, 16:48
      +1
      Спасибо за замечание. Я сделал немного по-другому, в afterSave, чтобы alias точно совпадал с id. В вашем варианте они могут разойтись.
        Андрей Степаненко
        22 сентября 2017, 06:28
        0
        Да этот вариант тоже хорошь. Но он требует повторного сохранение. Что сказывается очень сильно на производительности.
        Мой код сильно не скажется на производительности, но id будет всегда уникальным.

        Может лучше настройку сделать для переключения методов.
      Андрей Степаненко
      21 сентября 2017, 09:44
      0
      Еще вот здесь

      /**
           * Импортирование всех цен согласно связям
           * @param $xml
           * @param $product
           * @return string Первая цена
           */
          protected function importAllPrices($xml, $product)
          {
              $selectedPrice = 0;
              $c = 0;
      
              if (count($xml->Цены) != 0) {
      	}
      а то если цен нету то ошибки сыпятся о пустом массиве.
      Виталий Киреев
      21 сентября 2017, 19:29
      +1
      Версия 1.0.2-pl загружена в магазин:
      — Добавлено событие mSyncOnImportUnknownFile для обработки нестандартных файлов
      — Переработано добавление id к alias по настройке msync_alias_with_id
      — Добавлена проверка существования цен в offers.xml
      — Добавлены события mSyncOnBeforeImportCategory и mSyncOnBeforeImportProduct для кастомизации данных, полученных из XML каталога
        Андрей Степаненко
        26 сентября 2017, 14:28
        0
        Здравствуйте.
        В конце обработки (при выгрузке из админки.) не срабатывает событие mSyncAfterImport

          Андрей Степаненко
          26 сентября 2017, 15:12
          +1
          А нет все это я не правильно вызвал. Так как вызывается функция mSyncAfterImport только при импорте import.xml

          Можно вот так решить проблему вызова финиши или события в конце обработки файла offers.xml

          Добавьте событие «mSyncAfterOffers»
          $this->log("Вызвано событие mSyncAfterOffers(offers)", 1);
                  $this->modx->invokeEvent('mSyncAfterOffers', array(
                      'totalOffers' => $this_offer_num,
                  ));
          
                  $msg = 'Выгружено ценовых предложений: ' . $this_offer_num;
                  $this->log($msg);
                  unset($_SESSION['logFile']);
                  return 'success' . PHP_EOL . $msg . PHP_EOL;
            Виталий Киреев
            26 сентября 2017, 15:40
            0
            Хорошо, добавлю в следующей версии. А какой кейс решаете, для которого нужно это событие?
              Андрей Степаненко
              26 сентября 2017, 15:45
              0
              Предложения.
              С ними беда в minishop, нормально не ипортировать характиристики, цены, остатки.
                Виталий Киреев
                26 сентября 2017, 15:48
                0
                Для обработки одного предложения нужно использовать событие mSyncOnProductOffers
                  Андрей Степаненко
                  26 сентября 2017, 16:03
                  0
                  Да это то уже сделано.
                  Вопрос в том что в конце обработки всех предложений нужно запускать аналогично как и при обработки import.xml событие.

                  Иначе не понятно что обработка файла offes.xml завершилась
                    Андрей Степаненко
                    27 сентября 2017, 06:34
                    0
                    И еще с кодировкой файла msynccataloghandler.class.php
                    проблема. Он в window 1251
                    При скачивании при кодировке соединения utf-8 в файде кракозябры получаются.
                      Виталий Киреев
                      27 сентября 2017, 18:32
                      0
                      У меня показывает, что он utf-8
                        Андрей Степаненко
                        28 сентября 2017, 06:42
                        0
                        Это не ошибка
                        shot.qip.ru/00RwEz-3cMfvXkLQ/

                        Это 1с сообщает что предложение удалено.

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

                        1С еще долго может отсылать: Статус=«Удален»
                        так как там сначала идет пометка на удаление.
                        А уже администратор помеченые на удаление будет удалять.
                        И только после этого исчезнет это предложение.

                        Что то типо такого
                        protected function loadStock($xml)
                            {
                                $uuid_1c = (array)explode('#', (string)$xml->Ид);
                        
                                if (isset($xml->attributes()->Статус)) {
                                    $str = $this->stringXml($xml->attributes()->Статус);
                                    if ($str == 'Удален') {
                                        return;
                                    }
                                }
                        .......
                          Андрей Степаненко
                          29 сентября 2017, 08:32
                          0
                          Даже так
                          if (isset($xml->attributes()->Статус)) {
                                      $str = $this->stringXml($xml->attributes()->Статус);
                                      if ($str == 'Удален') {
                                          return;
                                      }
                                  }
                          
                                  if (isset($xml->Статус)) {
                                      $str = $this->stringXml($xml->Статус);
                                      if ($str == 'Удален') {
                                          return;
                                      }
                                  }
          Константин
          05 октября 2017, 16:31
          +1
          А как обстоят дела с автоматической выгрузкой и обновлением остатков, например через msProductRemains?
            Виталий Киреев
            06 октября 2017, 15:48
            0
            Остатки выгружаются в указанное поле. Можно настроить так, что, если остатки разбиты по характеристикам, то все эти остатки выгружаются в одно поле. Далее в плагине можно обработать это поле и записать значения в msProductRemains или любой другой компонент. Или даже отдельно обработать эти остатки в плагине на то же событие, без промежуточной записи в поле.
            Buslay
            07 октября 2017, 09:11
            0
            Добрый день! У меня такая ситуация, когда я добавляю к товару в 1С характеристику(например цвет), компонент все подгружает, но без цены. При этом в файлах import и offers ИД товара имеет вид «a3486.....#9cf88.....» Где часть до знака '#' постоянная, а 2я часть меняется с каждой характеристикой. В логах компонента появляется запись об ошибке. Привязка к товару для торгового предложения с uuid=a3486… (без 2й части после #) не найдена.
            «Решил» проблему таким образом
            /**
                 * Обработка одного торгового предложения
                 * @param $xml
                 */
                protected function loadStock($xml)
                {
                    $uuid_1c = (array)explode('#', (string)$xml->Ид);
                    
                    //!!Если у ИД есть 2я часть - то добавляем ее обратно)
                    if (array_key_exists(1, $uuid_1c)) {
                        $uuid_1c[0] .="#".$uuid_1c[1];
                    }
            
                    $prodData = $this->getProductData($uuid_1c[0]);
                    if (!$prodData) {
                        $this->log("Привязка к товару для торгового предложения с uuid={$uuid_1c[0]} не найдена.", 0, 1);
                        return;
                    }
            Так вот, собственно вопрос, для какой цели в компоненте при обработке предложения берется только 1я часть ИД? С 1с и минишопом я «на вы», может я в настройках компонента/1С что-то не так делаю?) Спасибо за внимание
              Виталий Киреев
              08 октября 2017, 05:32
              0
              То есть у вас в import.xml приходят идентификаторы с решеткой? А строка в этом идентификаторе до решетки и после одинаковая? Вообще после решетки должен идти идентификатор модификации.
                Buslay
                08 октября 2017, 06:53
                0
                Да, с решеткой. Строки разные. То есть, например 1 товар с 3мя характеристиками (разные цвета):
                <Ид>a3486772-8718-11e7-bfbc-1c6f65cec2ac#9cf887a5-aaa7-11e7-b2a5-001a4d521cd7</Ид>
                <Ид>a3486772-8718-11e7-bfbc-1c6f65cec2ac#9cf887ab-aaa7-11e7-b2a5-001a4d521cd7</Ид>
                <Ид>a3486772-8718-11e7-bfbc-1c6f65cec2ac#9cf887a7-aaa7-11e7-b2a5-001a4d521cd7</Ид>
                При их загрузке, выходит в логах ошибка, соответственно 3 раза
                "[mSync] Привязка к товару для торгового предложения с uuid=a3486772-8718-11e7-bfbc-1c6f65cec2ac не найдена." И в minishop2 не выгружаются цены, хотя в файле offers.xml она у всех 3х есть). Я понимаю, что вносить правки напрямую в компонент не хорошо, и прошу помочь разобраться, как по-правильному это сделать)
              Кирилл Киселев
              17 ноября 2017, 22:38
              0
              А есть возможность загрузить список товаров из 1С без импорта в базу?
              А то оттуда нужны только цены с остатками, а в дополнении подразумевается сразу импорт в базу.
                Станислав
                07 декабря 2017, 10:02
                0
                Вопрос такой: на сайте уже существует каталог товаров, в 1С тоже. При синхронизации он будет перезаписывать существующие товары полностью или только синхронизируемые параметры (название, остатки и т.п.)? А то на них навешана куча дополнительных полей и картинок, которые бы не хотелось потерять.
                Наумов Алексей
                05 февраля 2018, 11:28
                0
                Структура категорий в 1С и на сайте не совпадает.
                Может ли компонент игнорировать ее?
                Т.е. изначально все товары будут импортированы в 1 категорию, потом мы их руками раскидаем по категориям на сайте, а при обновлении будет только обновляться цена (ну и м.б. другие характеристики), а категория не меняется уже.
                  Наумов Алексей
                  23 марта 2018, 14:47
                  0
                  Мой вопрос остался без ответа… прошу обратить на него внимание.
                  И с версией 7.7 (1 С: Торговля и Склад 7.7 (редакция 9.2)) будет работать компонент? Нигде не вижу про совместимость…
                  Виталий Киреев
                  30 марта 2018, 10:26
                  0
                  Между 1С и ресурсом MODX создается привязка по идентификаторам. Соответственно, если идентификаторы ресурсов меняться не будут, то и обновляться они будут нормально.
                  Артем
                  17 марта 2018, 19:39
                  0
                  Повторю вопрос выше, так как тоже интересует именно этот момент:
                  Добрый день!
                  Подскажите пожалуйста, а каким образом запускается непосредственно процесс синхронизации?
                  По крону на сайте?
                  Или настраивается в 1С в узле обмена с web сайтом?
                  Интересует насколько быстро можно передавать заказы с сайта в 1С, чтобы случайно не возникала «пересортица».
                    Виталий Киреев
                    18 марта 2018, 13:02
                    +1
                    настраивается в 1С в узле обмена с web сайтом

                    Интересует насколько быстро можно передавать заказы с сайта в 1С, чтобы случайно не возникала «пересортица».
                    На тестах XML с товарами формируется достаточно быстро, порядка секунды, но все, конечно, зависит от кол-ва заказов и мощности хостинга. Есть настройка, которая определяет сколько отнимать времени для выборки заказов следующей выборки, чтобы точно не пропустить заказы, которые появились во время синхронизации.
                    Вовка
                    18 апреля 2018, 08:33
                    0
                    Добрый день!
                    Как можно получить подробный мануал по формировании выгрузки из 1С для ручного имопорта товаров (xml)? Тут наверное нужно сформировать вопрос так: ИНСТРУКЦИЯ ДЛЯ 1С ПРОГРАММИСТА ДЛЯ ФОРМИРОВАНИЯ ВЫГРУЗКИ В XML для ручного импорта в minishop2.

                    Или достаточно структуры файла import.xml, который идет, как пример с компонентом?
                    Заранее спасибо!
                      Stan Ezersky
                      18 апреля 2018, 13:01
                      0
                      Люди в этой ветке

                      есть у кого магазины на 100 тыс. товаров с кучей технических характеристик?

                      Отпишитесь по работоспособности пожалуйста
                        Андрей Степаненко
                        30 августа 2018, 04:37
                        0
                        Был такой, скажу так: все можно настроить и будет работать, либо железо по мощней!
                        Владимир
                        20 апреля 2018, 11:10
                        0
                        Здравствуйте! Планирую приобрести компонент modstore.pro/packages/import-and-export/msync для синхронизации каталога сайта с МойСклад, хотел бы уточнить: при покупке через сайт данные о количестве товаров автоматически обновятся в системе учёта, верно? И точно также при покупке в оффлайн-магазине количество товаров на сайте будет обновлено с учётом совершённой продажи?
                          r.koleman
                          29 августа 2018, 14:14
                          0
                          Добрый день!
                          Подскажите, есть ли возможность выгрузки уже созданных заказов в 1с на сайт?
                          Спасибо!
                            Владимир
                            28 января 2019, 15:00
                            0
                            Добрый день!
                            Такая проблема. Если загружаю товары из 1С, то прогружаются только группы и появляются на сайте. Товаров нет.
                            Но если зайти в админку и нажать на «Ручной импорт», ничего не подгружая дополнительно, то весь файл прогружается полностью.
                            в чем может быть проблема?
                            Спасибо!
                              Владимир
                              29 января 2019, 00:10
                              0
                              Сам разобрался.
                              В ответах progress неверная кодировка, 1С ее не понимает и падает
                                Михаил
                                18 июля 2019, 11:01
                                0
                                У меня такая же проблеме. Можете подсказать? Что вы сделали чтобы заработали товары???
                                  Владимир
                                  18 июля 2019, 13:51
                                  0
                                  Я правил код в 1с, можно найти кусок кода глобальным поиском по слову progress, и в том месте где идёт проверка на текущий статус изменить со сравнения статуса, на " содержит "
                              Артем
                              07 июня 2019, 10:22
                              0
                              Подскажите пожалуйста, вопрос такой. Сайт перестал справляться с выгрузкой, встает на половине выгрузки файла import, в 1с-ке есть возможность дробить выгрузку на части. Т.е. файлы выгружаются с нумерацией 0_1, 0_2, )_3 и.т.д Умеет ли дополнение с этим работать, то есть последовательно прогружать закинутые в папку файлы? Спасибо
                                Михаил
                                17 июля 2019, 15:07
                                0
                                Подскажите пожалуйста! В поддержке не отвечают. Может кто то здесь знает. Купил компонент mSync. Установил настроил. Начал делать выгрузку. Категории товаров выгрузились, а сами товары не выгружаются(((. В логах вот такие ошибки:
                                [mSync] Не удалось создать привязку для параметров 1
                                [mSync] Привязка к товару для торгового предложения с uuid=90a9c35b-5cc4-11e8-806c-002522592c90 не найдена.
                                Что делать? Как быть?
                                  Noll
                                  01 августа 2019, 16:13
                                  0
                                  у нас похожая проблема, вы свою решили?
                                    Dmitrii
                                    05 августа 2019, 18:48
                                    0
                                    Тоже самое, ищем решение, разработчик в поддержке не отвечает.
                                    Станислав
                                    20 августа 2019, 22:15
                                    0
                                    Кто нибудь нашел решение?
                                      Антон
                                      20 августа 2019, 22:58
                                      0
                                      Да. Это из-за того, что из 1с сначала выгружаются офферы. Или просто выгружаются только офферы. Надо чтоб была полная выгрузка — сначала import.xml и картиночки, потом offers.xml, тогда всё будет норм.
                                      Если у вас импорт.хмл выгружается, но всё-равно эта ошибка, то попробуйте с нуля настроить в 1с параметры выгрузки и чтоб у выгружаемого каталога был новый uuid, отличный от того, с которым сыпятся ошибки.
                                    Станислав
                                    22 августа 2019, 19:12
                                    0
                                    решением оказалось следующее, нужно очистить таблицы modx_msync_products_temp и modx_msync_products
                                    но если их очистить, сброситься еще и привязка на уже привязанные товары
                                    Андрей
                                    21 августа 2019, 16:53
                                    0
                                    Добрый день.
                                    У меня в выгрузке 2 типа цен: оптовая и розничная. Оптовая падает в поле цена. Можно ли Розницу заносить в поле Старой цены? Или только в TV?
                                      Валентина Павлова
                                      22 августа 2019, 19:43
                                      0
                                      Пробовали добавить в Настройках, вкладка — Настройка источника свойств:
                                      Источник — Старая розничная
                                      Поле — msProducts
                                      Цель — old_priсe?
                                        Андрей
                                        22 августа 2019, 19:49
                                        0
                                        У меня такая выгрузка, называть нужно именно Старая Розничная или иначе?
                                        prntscr.com/ow6vvs
                                          Валентина Павлова
                                          23 августа 2019, 09:09
                                          0
                                          Скорее, Розница. Но тут я мало помогу, я не спец по 1С.
                                          1 вариант. Оставить в настройках mSync создавать tv-поля, сделать выгрузку и смотреть, какое поле отгрузилось, потом его привязать.
                                          2 вариант. Смотреть Блок <Ид> / СписокЗначенийCML, но не точно.
                                      Максим
                                      22 ноября 2019, 14:34
                                      0
                                      А каким образом выбирается подгрузка цен?
                                      В 1С: предприятия есть множество цен, а в mSync подгружаются только оптовые цены.
                                      joxi.ru/D2PeMJ6tkjwDNA
                                      А нужна еще и розничная. В xml подгружаются только они, можно ли это как-то настроить?
                                        Алексей Шумаев
                                        22 ноября 2019, 15:25
                                        0
                                        По настройкам я не помню. Но точно можно события в плагине в этом случае использовать )
                                        Смотрите документацию: https://docs.modx.pro/komponentyi/msync/sobyitiya-i-plaginyi
                                          Максим
                                          25 ноября 2019, 03:50
                                          0
                                          Честно говоря не уверен, как мне плагины помогут.
                                          Я смотрел xml, и в нем есть только 3 цены, только оптовые, хотя в 1С есть и розничная.
                                          Мульти цены или типа того, не очень в этом разбираюсь.
                                          Я не могу понять почему она не выгружается в xml.
                                          joxi.ru/v29O5a7Izdk10r
                                            Валентина Павлова
                                            25 ноября 2019, 09:47
                                            0
                                            В настройках была опция — выгружать все цены. Может, в этом дело?
                                            prnt.sc/q1lkdv
                                              Максим
                                              19 декабря 2019, 03:04
                                              0
                                              По итогу, проблема была в том, что не все цены были подключены со стороны 1С.
                                              Надо было зайти во «Все функции» — из кучи разделов выбрать какой-то (какой не запомнил) с настройками цен. И отметить чекбокс «Выгружать на сайт» или типа того.

                                              Т.к. мне помогал 1С-прогер, я плохо запомнил куда он лазал.
                                        Olga
                                        19 декабря 2019, 05:22
                                        0
                                        Можно ли полностью удалить MODX и поставить заново? не могу войти в менеджер
                                        Олег
                                        31 августа 2020, 20:55
                                        0
                                        Добрый вечер!
                                        Подскажите пожалуйста, синхронизация остатков происходит «в реальном времени» после каждого заказа/оплаты или запускается по расписанию?
                                        Сколько по времени занимает обмен на 2-3тыс товаров?
                                          Иван
                                          08 сентября 2020, 08:06
                                          0
                                          Добрый день. На сайте работает mSync, но когда решили в 1С добавить новую категорию с товарами и выгрузить, то новый товар из 1С попадает в корень каталога на сайте. Не понятно почему, в чем может быть причина?
                                            Игорь Терентьев
                                            03 декабря 2020, 20:36
                                            0
                                            @Виталий Киреев Здравствуйте, подскажите как в плагине на событие mSyncOnProductOffers получить статус «Удален» у торгового предложения?

                                              Алексей
                                              11 декабря 2020, 18:14
                                              0
                                              Добрый день. Возможна ли продажа подарочных сертификатов из 1С через сайт? Например по промокоду: Человек вводит промокод и ему предоставляется скидка на сумму сертификата. Оплата по карте возможна? У нас система Net Pay.
                                              file.modx.pro/files/d/a/f/daf74097c8e5b49783d937c40115d8b3.jpg
                                                Николай Савин
                                                13 декабря 2020, 12:57
                                                0
                                                Это ж программирование. Все возможно. Но функционал явно не стандартный, его нужно отдельно как то дописывать.
                                                perfkirill
                                                09 февраля 2021, 06:49
                                                0
                                                Добрый день,

                                                У меня почему-то некоторые товары заливаются со статусом «не опубликовано». Что в 1с служит триггером, чтобы снимать с публикации товар? Не можем разобраться
                                                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                  72