Файлы картинок при потере и "восстановлении" не выгружаются. Только теги Картинка.
Ситуация наблюдается не постоянно. Т.е. при обмене она может возникнуть, а может и нет. Затрагивает с десяток произвольных товаров. Отловить причину сложно. Если бы терялись все картинки или терялись бы по части, но всегда, давно бы разобрался.
Со стороны если наблюдать, то после завершения обмена картинка анонса и детальная картинка теряются. Потом, через некоторое время восстанавливаются. Я привязываю факт восстановления к обмену, но не уверен в этом. От обмена акт восстановления может не зависеть (просто протоколов навешал именно на обмен).
При отладке выясняется следующее.
Если файла картинки нет, то Битрикс ищет картинку среди уже привязанных к элементу по EXTERNAL_ID. Эти внешние коды вычисляются элементарно (md5 по содержимому тега Картинка). Факт поиск картинки по внешнему коду и список привязанных к элементу картинок я вижу. Я также вижу, что картинка находится (да, для отладки я влез в CheckFileByName).
Это значит, что она должна быть пересоздана (с получением нового ИД в таблице b_file).
И да, она пересоздается. Но с задержкой в несколько секунд от момента поиска. А привязка файла картинки к элементу инфоблока происходит с чудовищной задержкой в 50 минут. Естественно, со стороны кажется, что картинка пропала, а потом появилась ниоткуда.
Что я уже проверил
Битрикс виновен только в том, что в коде обмена (проверил исходники вплоть до версии iblock 16.5.2 не используют транзакции). Судя по логу (описал выше) картинки находятся, пересоздаются, привязываются.
Задержку пытаюсь объяснить поведением MySQL 5.1.73 на CentOS 6.8 (не MariaDB). Таблицы InnoDB (файлы и элементы инфоблока).
Ошибок в логе MySQL нет. В логе медленных запросов update на привязку файла к элементу не найден (искать легко - по ИД файла). Тестирование конфигурации Битрикс пройдено без единой ошибки (предупреждений тоже нет). Монитор производительности СУБД жалуется только на кеш открытых таблиц (12.81% при table_open_cache = 8192; статистика за 22 дня). Статуса 500 на скрипте обмена в момент «потери» и «самовосстановления» картинок не было (да и вообще они крайне редки - это Premature end of script header; в описанной ситуации между потерей и восстановлением этой болячки не было).
Включил принудительное использование https на стороне nginx. Интеграция упала с ошибкой:
Код
Авторизация не выполнена.
Не удалось установить соединение с сервером. Проверьте имя пользователя и пароль.
Загрузка заказов не выполнена.
Предполагаю, что 1С не умеет обращаться с переадресацией и нужно сразу в параметрах узла указать https. Все равно ошибка.
Хорошо, тестирую конфигурацию сайта. Получаю на тесте "HTTP авторизация" успех. Но есть проблема с тестом "Внутреннее перенаправление (функция LocalRedirect)":
Код
2015-Dec-18 10:36:32 Внутреннее перенаправление (функция LocalRedirect) (check_localredirect): Ok
50% done
Connection to ssl://www.example.com:443 Success
2015-Dec-18 10:36:33 Внутреннее перенаправление (функция LocalRedirect) (check_localredirect): Fail
Connection to www.example.com:80 Success
== Request ==
GET /bitrix/admin/site_checker.php?test_type=redirect_test&unique_id=b3c83f2b444454696c505c30e01caeb4&SERVER_PORT=80&HTTPS=&FCGI_ROLE=&HTTP_HOST=www.example.com&SERVER_PROTOCOL=HTTP%2F1.0&done=Y HTTP/1.1
Host: www.example.com
== Response ==
HTTP/1.1 301 Moved Permanently
Server: nginx/1.6.0
Date: Fri, 18 Dec 2015 07:36:33 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://www.example.com:443/bitrix/admin/site_checker.php?test_type=redirect_test&unique_id=b3c83f2b444454696c505c30e01caeb4&SERVER_PORT=80&HTTPS=&FCGI_ROLE=&HTTP_HOST=www.example.com&SERVER_PROTOCOL=HTTP%2F1.0&done=Y
== Body ==
<ht ml>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.6.0</center>
</body>
</html>
==========
Ошибка! Не работает
Т.е. тест в курсе, что я зашел в админку по https, но упорно тестирует на 80 порту и нарывается на переадресацию. Потому и не проходит. Это вопрос отдельный, скорее всего. Сюда написал на всякий случай, для полноты картины.
Вопрос в теме. Нужно ли копать 1С, сайт, чтобы заставить работать интеграцию
Обмен 4, а потом 5 предлагает выгружать товары не все зараз, а пакетами. К примеру, всего 100 000 товаров. Можно разбить их на 1000 пакетов по 100 товаров и эти пакеты выгружать отдельно. Как на стороне сайта узнать, что 1С разбила весь каталог на 1000 пакетов и вот этот, текущий пакет уже последний? Или самый первый.
Для большей ясности - на каждый пакет уходит несколько XML файлов - метаданные товаров и предложений (два файла), товары и предложения (два файла), остатки (один файл) ... Все эти файлы описывают один пакет товаров с их предложениями и остатками по ним.
Посмотрел свежую версию компоненты bitrix:catalog.import.1c (catalog 15.5.0) - там ничего подобного не вижу, пакеты товаров обрабатываются независимо. Т.е. всю серию пакетов не отследить.
Я уже проверил по кодам (sale 14.5.16 25.10.2014; CIBlockCMLImport::ImportPropertyDirectory), что реально на автомате идет обмен только XML_ID и названия. Название может быть изменено на сайте, если оно изменилось в 1С. Все остальное руками.
Есть похожая тема, но там какой-то гибрид из отдельного справочника и свойства типа Справочник. Зато есть слова о том, что идут некие разработки (уже месяц идут).
Какие теги будет использован для остальных полей - Ссылка (UF_LINK), Описание (UF_DESCRIPTION), Полное описание (UF_FULL_DESCRIPTION), Сортировка (UF_SORT), Изображение (UF_FILE), По умолчанию (UF_DEF)?
Наиболее остро стоит вопрос картинкой.
Также интересует вопрос выгрузки произвольных полей для свойства типа Справочник по аналогии с отдельным справочником (там можно в настрйоках обмена выбрать что угодно из реквизитов).
Вопрос возник потому, что на обмен версии 4 владелец магазина перейти быстро не готов, но и совершенно нестандартные вещи делать не хочется. Есть желание ограничится программированием в 1С, а Битрикс будет получать эти данные стандартным путем, без кастомизаций и других доработок.
Обновился до sale 14.5.14 и такой сюрприз. В 1С этот комментарий создается реквизита Сайт, номера заказа на сайте. Операторы в 1С, само собой, дописывают туда свое. Вот этот комментарий возвращается на сайт в поле "Комментарий менеджера". Но при отмене выгрузкой 1С заказа буквально этот комментарий дублируется и в причину отмены. Там данные не предназначенные для глаз клиента!
Добавлено:
Проверил старые (когда класс загрузчика еще был в файле компоненты) и новые исходники. В обих случаях комментарий искали в теге <Комментарий>. Но в старом варианте он как-то не находился и не сохранялся ни в комментарий менеджера, ни в причину отмены. В новом сохраняется. Чтобы точно сказать что произошло, нужно детально разбираться в коде. Он заметно переписан, могли просто исправить "ошибку".
Мне интересно, это я один такой счастливый или на всех магазинах со свежей версией можно увидеть в причине отмены примерно такое "№ 1000 www.example.com [s1] Лучший магазин"?
Тестирую Покупку на Маркете. Там есть для этого страница для тестирования API. Заказы приходят на сайт, но не уходят в 1С. Почему?
Добавлено:
Настройки Покупки на Маркете и Интеграции с 1С я проверял. Документацию и курс смотрел.
Добавлено 2:
Заказы, полученные из Маркета считаются внешними. Внешние заказы (те, что в поле EXTERNAL_ORDER имеют Y) стандартной компонентой sale.export.1c не выгружаются в принципе.
Решения здесь может быть два:
Кастомизация компоненты с целью отмены этого фильтра (условно, по наличию в XML_ID признаков Маркета, либо безусловно).
Обработчики событий создания (и, возможно, изменения) заказа. В них нужно для заказов Маркета снимать признак внешнего заказа.
Оба варианта таят в себе пакостный подводный камень. Заказ из Маркета - хитрый заказ, первые 10 минут его заказом лучше не считать (он недописан до конца и может быть отменен по истечение этого времени).
Скрипт обмена ini_set('max_execution_time', '300');
То, что ini_set срабатывает, я проверял на отдельных скриптах.
Также добавил в код компоненты обмена запись в протокол (bitrix:catalog.import.1c)
2.) Что вижу
В логе nginx вижу запись со статусом 504. Время, это важно, 28/May/2014:23:05:28 +0400. Ок, смотрю в протоколе (я там записываю и ответ сайта, который уходит в 1С) - 2014-05-28 23:08:55, Распаковка архива завершена. Т.е. скрипт реально закончил свою работу (да и в логе ошибок PHP ничего!). При этом скрипт закончил работу на три (!) минуты позже того, как его перестал ждать nginx.
Могут быть сомнения в том, что время не совпадает по криворукости отладки. Ан нет! Предыдущий запрос в моем логе и логе nginx совпадает с точностью до секунду (а точнее не пишется в лог).
3.) В чем проблема
А не знаю я как заставить nginx дождаться ответа. Не было ничего похожего в списке директив. Ясно только то, что установленных пяти минут для скрипта вполне достаточно. Так и nginx должен ждать ответа от Apache теже 5 минут ...
[arFilter_124] => Array
(
[UPDATED_1C] => N
[STATUS_ID] => Array
(
[0] => N
[1] => N
[2] => B
[3] => B
[4] => F
[5] => F
)
[>=DATE_UPDATE] => 07.05.2014 15:09:37
)
Не выгружаются именно новые заказы (статус N).
Проблема началась после обновления Битрикс с 14.0 до 14.5. 1С не обновлялась, да и за обмен отвечает кастомизированная компонента, созданная на основе 14.0.
У кого-нибудь есть такие же проблемы, или у меня одного такое счастье?
<Комментарий>№ 100 www.example.com [s1] Самый лучший магазин</Комментарий>
В 1С под это выделена одна строка (я не знаю реально ли это изменить). Решил, что кастомизацией выгрузки этого тега заниматься смысла нет. Тогда должны помочь реквизиты документа (и соответствующая доработка 1С).
Хорошо, лезу в настройки профиля обмена. Как всегда, документация на высоте.
В пользовательской документации написано в стиле "Название параметра - это название параметра, чтобы ввести название параметра введите название". Можете сами посмотреть, это отписка. Ничего этот тест не проясняет.
В учебном курсе тоже практически ничего (а по теме - вообще ничего). Уточнения ничего не уточняют.
В форуме, как ни странно об этом не спрашивали (или глаза не протер - не нашел).
Я готов настроить профиль, но что мне вбивать в название и значение параметра (это о разделе Дополнительные параметры (передаются в реквизиты заказа в 1С))?
Кстати, в параметрах заказа я не усмотрел ничего, чтобы соответствовало полю USER_DESCRIPTION.
Не могу найти, а ориентироваться на существующую реализацию обмена в конкретном экземпляре 1С не могу (никогда не слышал о чистой конфигурации, часто люди доводят имеющуюся до "последней").
Знаю что давно можно указать какая группа номенклатуры пойдет в какой каталог на сайте.
Меня же интересует возможность настроить соответствие групп на сайте и групп в 1С. Да так, чтобы одна группа на сайте могла соответствовать двум и более группам в 1С. Толи у меня дежавю, толи и правда такая возможность есть, а я не могу найти о ней ничего.
Выгрузка заказов из 1С в промежуточных статусах, Возможно ли изменение заказа на сайте при изменении статуса заказа в 1С и при изменении его содержания?
В настройках интеграции со стороны Битрикс вижу только что делать, когда сайт получает информацию по отгрузке товаров по заказу.
А что происходит когда статус заказа меняется в 1С?
Например, когда заказ отменен, оплачен, произведена отгрузка (с этим вроде как понятно, но на всякий случай). А что если по результатам разговора с покупателем менеджер изменил содержание заказа в 1С? Он изменится га сайте после обмена заказами?
Не менее важен вопрос об изменении заказа на сайте уже после первичной выгрузки. Или при наличии 1С такие вещи не нужно делать, а оставлять за сайтом только первичное создание заказа?
Для импорта в БУС необходимо типизировать значения свойств номенклатуры, а для ссылочных типов (справочник) передать список принимаемых значений. Далее использются UUID элементов справочника
Под типизацией свойства я понял выбор вместо "Значения свойств объектов" чего-то другого, например, "Число", "Строка", ..., другой справочник. Я хотел список, значит нужен справочник. Свой создать я не смог (не специалист в 1С), использовал для теста уже готовый - Валюты. Создал свойство (без привязки к объектам, значит к любым), задал его значение для одного товара. Запустил выгрузку (полная).
А где обещанные варианты значений? Видимо, я не сделал еще "передать список принимаемых значений". Но как это сделать? В настройках обмена данными можно указать только номенклатуру ...
Для ясности. 1С-Предприятие 8.2.18.102, УТ 10.3.7.9.