Forum Replies Created

Viewing 15 replies - 1 through 15 (of 34 total)
  • <font style=”vertical-align: inherit;”><font style=”vertical-align: inherit;”>Попробуй увеличить время выполнения hph запросов на сайт и увеличь время ожидания ответа http запроса в 1С. Возможно, сервер медленный и ваш файл он просто не успевает обработать и по таймауту отваливается. </font></font>
    <font style=”vertical-align: inherit;”><font style=”vertical-align: inherit;”>А вообще брось ты этот плагин. Делай все через стандартный API. работает надежней и быстрее. Обновление остатков на сайте загружай напрямую в mysql. Тогда за 10 минут обновишь 200 тыс товаров. А с этим плагином будешь грузить сутками остатки, товары, фотографии.</font></font>

    • This reply was modified 1 year, 5 months ago by rovak.
    • This reply was modified 1 year, 5 months ago by rovak.
    Thread Starter rovak

    (@rovak)

    То есть, если у нас будет 15 транспортных компаний, то у нас будет 15 городов в заказе? А нельзя переделать в следующей версии плагина всю математику на dadata.ru или ему подобный сайт? dadata позволяет выбрать город и дает по нему коды. А уж эти коды городов и населенных пунктов будут использоваться для расчета цены по транспортным компаниям.

    • This reply was modified 3 years, 8 months ago by rovak.

    Проблема не в дроблении файла на части, а в использовании для обмена Commerce ML.
    То есть каждый раз на сайт передается одна и та же информация: категории товаров, атрибуты, значения атрибутов, фотографии, товары. Каждый обмен с сайтом тянет за собой всю эту информацию. В рамках стандарта Commerce ML спастись от этого невозможно. Каждый обмен с сайтом перезаписывает одну и ту же информацию на сайт. Это значит, что в схеме сайта все данные объекты будут указаны как измененные. Поисковые системы как заведенные будут обновлять у себя одну и ту же информацию. Поскольку бюджет их ресурсов ограничен на сайт, то они просто не успевают что-то другое загрузить в поисковую выдачу. Они постоянно обновляют одну и ту же информацию. То есть сайт будет не до конца проиндексирован. Поскольку поисковые роботы будут постоянно обновлять одну и ту же информацию, то сайт будет все время занят повышенной нагрузкой. Он будет медленно у вас работать. Другой стороной медали этого стандарта является то, что в этой схеме обмена не обновляется поле title. Поисковые роботы анализируют его. Раз его нет, то и нет анализа. Сайт никогда не будет в TOP-10. Где-то на 50 месте будет, но на первой странице выдачи нет.
    Единственным решением обмена видится переход на стандарты 1С в обмене данными. Использование Плана обмена. Для тех, кто не в курсе, это специальный объект базы данных 1С. В нем регистрируются все новые и измененные объекты. Обмен данными делается только по ним. Все дерево информации не переносится, только измененные объекты. И уход на обмен с WOO через REST API. Возни с переходом много. Но оно того стоит. Если у вас 100-500 товаров, то можете не грузиться этой темой. Товаров мало. Поисковые роботы с таким объемом спокойно справятся. Если товаров больше 100 тысяч, то обмен через Commerce ML большая проблема для сайта. Он будет сутками обновлять одно и тоже.

    Работает

    В 1С найдите по своему сообщению “Выгрузка на сайт завершилась с ошибками.
    Выгрузка на сайт не выполнена.
    Не удалось прочитать ответ сервера” место в программе. Поставьте точку останова и отладчиком 1С посмотрите что именно вам пишет сайт. То есть посмотрите, что именно не нравится сайту.

    В 1С посмотрите настройки в плане обмена.
    Выгрузка товаров, иерархия по группам или по видам.

    Да просто так звезды светили и вам не повезло )))
    Я использую плагин для переноса товаров, фотографий и заказов. Это очень крутой плагин. Но все остальное записываю напрямую в базу магазина из 1С.
    Если я прав, что у вас две карточки товаров, по числу языков в магазине, то я бы средствами 1С во второй карточке товара просто записал Гуид товара сразу в базе магазина и оставил бы все как есть. Должно работать.
    Например вот так:
    АутентификацияСтандартная = Истина;

    ИмяПользователя = “Пользователь”;
    Пароль = “Пароль”;

    СтрокаПодключения = “DRIVER={MySQL ODBC 3.51 Driver};
    |SERVER=МойСайт.ru;
    |Language=русский;
    |STMT=SET CHARACTER SET cp1251;
    |STMT=SET NAMES cp1251;
    |DATABASE=ТалицаМагазина;
    |uid=”+ИмяПользователя+”;
    |pwd=”+Пароль+”;
    |”;

    Connection = Новый COMОбъект(“ADODB.Connection”);

    Connection.Open(СтрокаПодключения);
    Connection.DefaultDatabase = “ТалицаМагазина”;
    Recordset = Новый COMОбъект(“ADODB.Recordset”);

    // цикл по номерклатуре Стр

    meta_id = УбратьПробелы(Стр.meta_id);
    post_id = УбратьПробелы(Стр.post_id);
    meta_key = “_wc1c_guid”;
    meta_value = ГУИД;

    ТекстЗапроса = “INSERT INTO wp_postmeta (meta_id, post_id, meta_key, meta_value) VALUES(‘”+ meta_id +”‘,'”+ post_id +”‘,'”+ meta_key +”‘,'”+ meta_value +”‘)
    |ON DUPLICATE KEY UPDATE meta_id= VALUES(meta_id), post_id= VALUES(post_id), meta_key= VALUES(meta_key), meta_value= VALUES(meta_value)”;

    Table = Connection.Execute(ТекстЗапроса);
    Connection.Close();
    У вас не должно быть дублей записей. Поэтому сначала надо считывать из базы данные. Если они есть, то только обновлять с новыми значениями. А если нет такой записи, то можно новую запись создавать.

    Значит Гуид номенклатуры не передается.
    В 1С в общем модуле ОбменССайтом в модуле ЗагрузитьЗаказыССайта посмотрите что там идет с сайта в ОтветСервера в обоих заказах. Посмотрите отладчиком в чем разница.
    Скорее всего во втором случае с сайта не передается Гуид товара. Поэтому он создается как новый.
    Товар хранится на сайте в таблице POST, его Гуид в таблице Postmeta записывается при meta_key “_wc1c_guid”. Если у вас два языка в магазине, то скорее всего две карточки товара. Я предполагаю это. Ну и гуид не переносится во вторую карточку по умолчанию.
    Если я прав, то во второй карточке создайте такую же запись с Гуидом и попробуйте перенести заказ в 1С.

    Попробуйте Hyper Cache Extended
    Strip query string 0
    URL with parameters 1
    URI to reject
    _wp_session_
    _wc_session_
    /cart/
    /checkout/
    /order_tracking/
    /my_account/
    /pay/
    Я еще добавил все эти же страницы в явном виде
    https://МойСайт.ru/cart/ и т.д.
    Agents to reject
    _wp_session_
    _wc_session_
    Cookies matching
    wc1c-auth
    В этом плагине можно отключить кэширование по кукам. Это то, что вам нужно.
    Остальные параметры на ваше усмотрение. Я делаю кэш длительностью Неделя. Сбрасываю весь кэш после обновления цен и остатков.

    То что сертификат удалили – в нынешние времена это не правильно. Но в целом у вас понятно, что в файле .htaccess надо правильно прописать директивы. А вообще поиск причины сломанного обмена 1С и сайта надо начинать с отладчика 1С. Находите в 1С общий модуль ОбменССайтом в нем функции ПолучитьДанныеССервера, ОтправитьФайлНаСервер. Находите в каждой функции строки
    “Если HTTPОтветСервера = Неопределено Тогда ”
    и становитесь на них отладчиком.
    В отладке надо посмотреть что вам возвращает сайт.
    Для этого в отладчике надо посмотреть
    “HTTPОтветСервера.ПолучитьТелоКакСтроку()”
    В журнал регистрации 1С сообщения с сайта переносятся не информативно, поэтому причина сломанного обмена часто не видна. Может быть битая фотография, ошибка в каком-то модуле или лишние невидимые символы подставляются в данные. Смотреть надо текст ошибки с самого сайта, а не его интерпретацию в 1С.
    Еще может быть ситуация, что ваш сайт просто не успевает отработать ваши пакеты с данными и он сам отваливается по таймауту выполнения запроса. У автора написано какие параметры надо увеличить. Можно уменьшить объем данных в переносе на сайт. Не выгружать по 1000 товаров за раз, а попробовать по 10. Это сильно зависит от темы. Если простенькая, то можно много грузить, а если посложнее, то бывает по сотне за раз и не выходит.
    По умолчанию 1С ждет ответ с сайта 180 секунд. Потом отваливается по ошибке.
    В функции СоединениеССервером поменяйте 180 на 1800 секунд.
    Например вот так
    Соединение = Новый HTTPСоединение(
    ПараметрыПодключения.Сервер,
    ПараметрыПодключения.Порт,
    ПараметрыПодключения.Пользователь,
    ПараметрыПодключения.Пароль,
    ПараметрыПодключения.Прокси,
    ///*** 180,
    1800,
    ///***
    ЗащищенноеСоединение);
    Это сильно помогает получить стабильный обмен данными с сайтом.

    Чтобы повторно послать заказ в 1С надо зайти в админке в нужный заказ и удалить одну произвольную запись. wc1c_queried. В админке нажимаете кнопку удалить эту запись в Произвольных полях. После этого обмен делаете из 1С. Можно в самой базе удалить эту запись у нужного заказа в таблице _postmeta. В post_id указываете номер заказа, а в meta_key надо указать wc1c_queried. И удаляете найденную строку в таблице.

    Подключи базу данных к 1С как внешний источник данных и скачай все с сайта. Сохрани где-нибудь в Номенклатуре id товара с сайта. А потом в обратную сторону загрузи гуид номеклатуры на сайт.

    Подключи базу сайта к 1С как внешний источник данных. И спокойно все скачивай средствами 1С.

    Номенклатуру и ее Гуид можно вот так получить:

    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    | МояБаза_posts.ID,
    | МояБаза_posts.post_title,
    | ПОДСТРОКА(МояБаза_postmeta.meta_value, 0, 36) КАК НоменклатураГуид
    |ИЗ
    | ВнешнийИсточникДанных.Сайт.Таблица.МояБаза_posts КАК МояБаза_posts
    | ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.Сайт.Таблица.МояБаза_postmeta КАК МояБаза_postmeta
    | ПО МояБаза_posts.ID = МояБаза_postmeta.post_id
    |ГДЕ
    | МояБаза_posts.post_type = &post_type
    | И МояБаза_postmeta.meta_key = &_wc1c_guid
    | И МояБаза_posts.post_status = &post_status”;

    Запрос.УстановитьПараметр(“post_status”,”publish”);
    Запрос.УстановитьПараметр(“post_type”,”product”);
    Запрос.УстановитьПараметр(“_wc1c_guid”,”_wc1c_guid”);

    ТЗДанные = Запрос.Выполнить().Выгрузить();

    Характеристику, Гуид НоменклатурыВладельца и Гуид Характеристики можно вот так получить:

    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    | МояБаза_posts.ID,
    | МояБаза_posts.post_title,
    | ПОДСТРОКА(МояБаза_postmeta.meta_value, 38, 36) КАК ХарактеристикаГуид,
    | ПОДСТРОКА(МояБаза_postmeta.meta_value, 0, 36) КАК НоменклатураГуид,
    | МояБаза_postmeta.meta_value КАК _wc1c_guid
    |ИЗ
    | ВнешнийИсточникДанных.Сайт.Таблица.МояБаза_posts КАК МояБаза_posts
    | ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.Сайт.Таблица.МояБаза_postmeta КАК МояБаза_postmeta
    | ПО МояБаза_posts.ID = МояБаза_postmeta.post_id
    |ГДЕ
    | МояБаза_posts.post_type = &post_type
    | И МояБаза_postmeta.meta_key = &meta_key
    | И МояБаза_posts.post_status = &post_status”;

    Запрос.УстановитьПараметр(“post_status”,”publish”);
    Запрос.УстановитьПараметр(“post_type”,”product_variation”);
    Запрос.УстановитьПараметр(“meta_key”,”_wc1c_guid”);

    ТЗДанные = Запрос.Выполнить().Выгрузить();

    Сохранить на сайте данные из 1С можно так:
    Пример кода по переносу сортировки товара из 1С на сайт.
    Таким же образом можно переносить цены, описания, свойства, характеристики…
    Все можно так переносить. Можно блоками переносить, сразу по несколько тысяч строк. Но сайт от нагрузки упадет.
    Тут только подбирать опытным путем количество строк в запросе.
    Проще подождать пару минут и построчно переносить все данные.
    Тогда и сайт не упадет и все данные гарантированно перенесутся.
    Еще можно переносить только измененные данные. Будет еще быстрее.
    Драйвер MySQL ODBC 5.2 ANSI Driver должен быть установлен на машину.

    АутентификацияСтандартная = Истина;
    ИмяПользователя = “ИмяПользователяMySQL”;
    Пароль = “ПарольВБазеMYSQL”;

    СтрокаПодключения = “DRIVER={MySQL ODBC 5.2 ANSI Driver};
    |SERVER=МойСайт.ru;
    |Language=русский;
    |STMT=SET CHARACTER SET cp1251;
    |DATABASE=БазаДанныхMYSQLНаСайте;
    |uid=”+ИмяПользователя+”;
    |pwd=”+Пароль+”;
    |”;

    Connection = Новый COMОбъект(“ADODB.Connection”);

    Connection.Open(СтрокаПодключения);
    Connection.DefaultDatabase = “БазаДанныхMYSQLНаСайте”;
    Recordset = Новый COMОбъект(“ADODB.Recordset”);

    Для Каждого Стр из Объект.НоменклатураСписок Цикл

    ID = УбратьПробелы(Стр.ID);
    menu_order = УбратьПробелы(Стр.Номенклатура.ПорядокНаСайте);

    ТекстЗапроса = “INSERT INTO МояБаза_posts (ID, menu_order) VALUES(‘”+ ID +”‘,'”+ menu_order +”‘)
    |ON DUPLICATE KEY UPDATE ID= VALUES(ID), menu_order= VALUES(menu_order)”;

    Table = Connection.Execute(ТекстЗапроса);

    КонецЦикла;
    Connection.Close();

    В php.ini надо добавить блок, в самый низ файла

    [xdebug]
    ;;xdebug.max_nesting_level = 500
    zend_extension = ‘E:\Program Files (x86)\PHP\ext\php_xdebug-2.5.5-5.6-vc11-x86_64.dll’
    xdebug.auto_trace = 1
    xdebug.collect_includes = 1
    xdebug.collect_return = 1
    xdebug.default_enable = 1
    xdebug.idekey = “netbeans-xdebug”
    xdebug.profiler_enable = 0
    xdebug.profiler_enable_trigger = 0
    xdebug.profiler_output_dir=”E:\Work\_\tmp”
    xdebug.profiler_output_name = “cachegrind.out.%u”
    xdebug.remote_autostart = 1
    xdebug.remote_connect_back = 0
    xdebug.remote_enable = 1
    xdebug.remote_handler = “dbgp”
    xdebug.remote_log = “E:\Work\_\tmp\debug.log”
    xdebug.remote_port = 9000
    xdebug.remote_host = 127.0.0.1
    xdebug.remote_host = ВАШ IP адрес, например 11.22.33.44

    Это файл с моего локального апача. Вносите изменения в php.ini после этого перезапускаете апач и он начинает на ваш адрес, например 11.22.33.44, слать пакеты и NetBeans IDE начнет их отлавливать отладчиком. Перед обменом устанавливаете точку останова и переходите в отладчик NetBeans IDE. Потом запускаете обмен из 1С. NetBeans IDE остановится на точке останова. Дальше смотрите что в переменных и ищете место, где программа падает. Ну и все, разбираетесь чего ей не хватает. В NetBeans IDE все настройки стандартные, вроде там все просто запустилось у меня.

    Возьмите за аксиому – модуль работает. Проблема где-то у вас. Сайт, 1С или еще что-то – у вас не работает. Ни кто вам здесь не поможет потому, что надо сидеть и все анализировать именно в вашей ситуации. Я вам советую поставить NetBeans IDE на локальную машину. Это отладчик вашего сайта. Дальше подключаете либо свой сайт рабочий, либо локальную копию на денвере или еще чем к нему. Совершенно не важно. Находите строку в модуле /woocommerce-and-1centerprise-data-exchange/exchange.php под номером 434 и ставите точку останова. Потом запускаете на своем 1С обмен и ждете когда в NetBeans IDE сработает отладчик. Ну а дальше все просто, включаете свои мозги и смотрите на чем программа спотыкается. Там не сложно. Идете пошагово отладчиком и смотрите где программа уходит по ошибке. Потом исправляете. Автор модуля все подробно расписал, за что ему огромная благодарность. Автор модуля давно писал свой модуль. Возможно вам просто надо будет внести небольшие изменения в модуль обмена в самом 1С. Ну или поменять свои настройки в обмене. Если же вы обнаружите, что на локальной версии у вас все работает, а на сайте не работает – переходите к моему провайдеру. https://firstvds.ru/?from=516007 Не тратьте время на выяснение отношений со своей поддержкой. У меня через данный модуль выгружено на сайт около 80 тыс товара и все работает. Но я выгружаю только справочную информацию и фотографии. Остатки и цены я напрямую выгружают из 1С в базу mysql на сайте. Это значительно быстрее. Пробовал выгружать остатки большим запросом, но работает не стабильно. Сейчас выгружаю по 1 строчке в одном запросе. За 10 минут обновляет порядка 20 тыс товаров. Понимаю, что не оптимизированно, зато быстро.
    Чтобы NetBeans IDE начал работать и перехватывать запросы сайта в настройки апача, на сайте, надо внести изменения. Возвожно у своего провайдера вы не сможете это сделать. Тогда тестируйте все на локальной машине.

Viewing 15 replies - 1 through 15 (of 34 total)