Пользователь 111813 Постоянный посетитель Сообщений: 162 |
#1 06.02.2015 12:41:56 Здравствуйте. Мы используем два механизма обмена с 1С — один от Битрикса (для обмена заказами) и другой от сторонней компании (обмен товарами). При обмене заказами битрикс ставит флаг использования новой версии обмена, и при обмене товарами (модуль от сторонней фирмы) выпадается ошибка «Ошибка проверки источника запроса. Обновите модуль обмена или отключите проверку в настройках компонента». Далее я выполняю следующие команды, что бы Битрикс воспринял обмен по старому формату (в этом случае обмен проходит нормально. но после обмена заказами снова выдаётся ошибка и необходимо заново вызывать данные команды)
Можно ли сделать, что бы Битрикс так не капризничал? Сильно ли изменился новый механизм обмена и на сколько сложно страрый обмен переделать под новый обмен? |
||
Александр Денисюк
Администратор Сообщений: 4929 |
#2 06.02.2015 15:07:34
Новый обмен несовместим со старым. Изменились http запросы. Появились критичные параметры session id + № версии. |
||||
Александр Денисюк, а можете подсказать как долго битрикс продолжить поддерживать старый обмен? Просто может получиться так, что если мы останемся на старом обмене, то в какой-то момент Битрикс резко прекратит поддержку и де-факто мы останемся не с чем |
|
Юрий Волошин
Администратор Сообщений: 1376 |
#4 06.02.2015 16:00:09
Мы не можем точно сказать срок такой поддержки, достаточно много клиентов использует предыдущий обмен, и мы его будем поддерживать продолжительное время. Но риск остается, что в какой та момент времени, пусть не завтра, обмен может перестать работать. Рассмотрите все-таки возможность перехода, это изменение сделано по причине безопасности, а передаются все-таки коммерческие данные. |
||
Добрый день |
|
Александр Денисюк
Администратор Сообщений: 4929 |
#6 24.02.2015 11:17:07
Все актуальные модули тут http://1c.1c-bitrix.ru/ecommerce/download.php Новый модуль — это модуль, который 4 версии |
||
Пользователь 426591 Заглянувший Сообщений: 2 |
#7 17.12.2015 19:28:54
На главной странице! 1с-битрикс написано что интеграция 1С и 1с- Битрикс доступна из коробки! |
||
Пользователь 506671 Заглянувший Сообщений: 1 |
#9 27.02.2016 17:45:34
УТ10.3 модуль и 5.0.0.5 и 6.0.0.1, а ошибка все та же — «обновите модуль» до сих пор приходится пользоваться регулярно скриптом. |
||||
Пользователь 428983 Заглянувший Сообщений: 9 |
#10 13.08.2016 07:09:51 Доброго здравия! Модуль 4.0.5.1 будет работать с Управление сайтом 16.0.8? В логах обнаружена ошибка: Ошибка Скажите, как можно запустить скрипт?
|
||
Командная php строка там выполнить этот код |
|
Пользователь 428983 Заглянувший Сообщений: 9 |
#12 15.08.2016 11:39:42
Владимир, благодарю за ответ, но я скорее программист 1С, чем web кодер, даже не представляю, как вызвать php строку. Подскажите, пожалуйте, ссылкой на какую-нибудь инструкцию? |
||
Не помогло, ни запуск скрипта, ни обновление до версии 6. На что может влиять данная ошибка? |
|
Пользователь 930959 Заглянувший Сообщений: 2 Web Developer |
#15 28.03.2017 18:51:56
Спасибо. Работает, помогло. |
||
В 1С используется стандартный механизм обмена данными с сайтом. Битрикс 17.0.15, 1С 11.3.4.93. С ошибкой при отправке заказов на сайт «Ошибка проверки источника запроса. Обновите модуль обмена или отключите проверку в настройках компонента» мы разобрались. Как-то можно привести в соответствие встроенный модуль обмена с сайтом и битриксовый, чтобы обмен происходил по новому формату без применения дополнительного модуля обмена от Битрикс? |
|
Пользователь 1392443 Заглянувший Сообщений: 2 |
#17 26.10.2017 15:31:27
+1 |
||
Добрый день. Используем облачную версию УНФ и 1С управление сайтом «Малый бизнес». За обновление облака следит 1С, за обновлением сайта — я. Все обновляется, но с июля месяца у нас перестал работать обмен заказами и товарами с сайта. Ранее все работало, что сейчас происходит не пойму. ___________________________________________________________________ Интерактивный обмен В том числе для каталога Основной каталог товаров: 10/26/2017 9:08:14 PM Выгрузка на сайт завершилась с ошибками. __________________________________________________________________________ Что делать? |
|
Пользователь 63774 Посетитель Сообщений: 47 |
#19 17.07.2018 16:24:33 Такая же проблема:
Версия модуля обмена 7.0.1.6
тоже не помогает:( |
||||
Пользователь 4790846 Заглянувший Сообщений: 1 |
#21 22.12.2021 19:31:41 А как импортировать reference, интересно, через модуль 1с_exchange если на стороне 1с не отправляется сессионная кука, а в компоненте catalog.import.hl лежит потрясающее условие elseif(!check_bitrix_sessid()), а в коде check_bitrix_sessid идет безусловное сравнение либо с $_REQUEST[<sessid (по умолчанию)>] либо со значением заголовка X-Bitrix-Csrf-Token. И ЭТО ОТКЛЮЧИТЬ НЕЛЬЗЯ НИКАК, кука не отправилась — хоть оботправляйся этот токен, bitrix_sessid() ему никогда соответствовать не будет!!!!! |
Неопытным разработчикам кажется, что это процесс обмена Битрикса и 1С это очень сложный процесс, но с опытом понимаешь, что это не просто сложно: это вообще полная жесть. Попробую описать словами этот процесс. Добро пожаловать в ад описание обмена с 1с.
Инициатором любого обмена является 1С, сайт не загружает ничего в 1С, сайт только принимает запросы и отдаёт результат. По умолчанию, 1С обращается к скрипту /bitrix/admin/1c_exchange.php. Этот путь указывается в настройках обмена в самой 1С. Из коробки в этом файле включается файл /bitrix/modules/sale/admin/1c_exchange.php. Если открыть файл, то видим там подключение нескольких компонентов в зависимости от $_GET[«type»]. В общем случае интересуют два из них:
bitrix:catalog.import.1c – импорт каталога.
bitrix:sale.export.1c – экспорт заказов.
Импорт товаров из 1С
Импорт начинается с авторизации, посылается запрос на /bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth
с передачей логина и пароля пользователя сайта, которые указали в настройках обмена. После авторизации сайт выдает ID сессии.
Далее идёт инициализация обмена, URL /bitrix/admin/1c_exchange.php?type=catalog&mode=init&sessid=ID_Сессии
. На этом этапе в сессии инициализируется массив данных обмена $_SESSION[«BX_CML2_IMPORT»] и сайт отдаёт параметры обмена: возможность использования zip, лимит размера файла и т.д. Также на этом этапе очищается папка для файлов выгрузки. Скорее всего, это будет папка /upload/1c_catalog/. Для отладки можно включить сохранение старых файлов обмена, тогда при новом обмене старые данные будут перемещаться в отдельные папки: 1c_catalog0, 1c_catalog1 и т.д.. Для сохранения данных нужно объявить константу в dbconn.php:
// Не забудьте убрать эту строку после отладки во избежание переполнения сервера
define("BX_CATALOG_IMPORT_1C_PRESERVE", true);
После этого 1С начинает подготовку данных и далее посылает их POST-запросом на сайт частями, URL: /bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=ИМЯ_ФАЙЛА.zip&sessid=ID_Сессии
. Запрос продолжается, пока файлы не будут переданы полностью.
1С передает на сайт xml-файлы с данными товаров и предложений, а также картинки. В случае если сайт разрешил использовать zip, то 1С передает все файлы одним архивом. Тогда следующий шаг начинается с его распаковки.
В выгрузке могут участвовать xml-файлы:
- import.xml — товары, разделы, типы цен, склады, свойства товаров и единицы измерения;
- offers.xml — торговые предложения товаров и их свойства;
- prices.xml — цены торговых предложений(в новых версиях);
- rests.xml — остатки торговых предложений(в новых версиях);
- references.xml — пользовательские справочники (highload-инфоблоки, в новых версиях).
Узнать подробнее о файлах обмена
Картинки загружаются в папку /upload/1c_catalog/import_files/.
Далее начинаются обработка файла и сам импорт данных, 1С раз за разом обращается к URL /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=ИМЯ_ФАЙЛА_ВЫГРУЗКИ.xml
, где ИМЯ_ФАЙЛА_ВЫГРУЗКИ — import.xml, offers.xml и т.д. Импорт завершается, когда сайт отдаёт слово «success». За обработку файла выгрузки отвечают классы CIBlockXMLFile (/bitrix/modules/iblock/classes/mysql/cml2.php) и CIBlockCMLImport (/bitrix/modules/iblock/classes/general/cml2.php).
Импорт состоит из нескольких шагов:
-
Очистка временной таблицы (таблица b_xml_tree)
Метод CIBlockXMLFile::DropTemporaryTables(). Обычный drop таблицы b_xml_tree.
-
Создание временной таблицы
Метод CIBlockXMLFile::CreateTemporaryTables(). Здесь создается таблица b_xml_tree. Можно, кстати, задать storage engine этой таблицы, равно как и всех создаваемые битриксом, с помощью определения константы MYSQL_TABLE_TYPE.
-
Чтение файла во временную таблицу
Метод CIBlockXMLFile::ReadXMLToDatabase().
-
Индексация временной таблицы
Метод CIBlockXMLFile::IndexTemporaryTables().
-
Импорт метаданных
Метод CIBlockCMLImport::ImportMetaData.
-
Импорт разделов
Метод CIBlockCMLImport::ImportSections.
-
Деактивация разделов и пересчёт левой и правой границ для разделов
Методы CIBlockCMLImport::DeactivateSections и CIBlockCMLImport::SectionsResort.
-
Импорт элементов
Самый длительный процесс, на этом этапе добавляются и обновляются новые товары (если загружается import.xml) или обновляются цены и остатки (если загружаетс offers.xml). Здесь задействован метод CIBlockCMLImport::ImportElements, который вызывает CIBlockCMLImport::ImportElement для товаров или CIBlockCMLImport::ImportElementPrices для остатков/цен.
-
Деактивация элементов
Методы CIBlockCMLImport::DeactivateSections и CIBlockCMLImport::SectionsResort.
-
success
Импорт файла завершен, сайт отвечат словом «success», 1С считает обмен успешным. При необходимости начинается импорт следующего файла.
Некоторые шаги могут выполняться за несколько запросов, порциями по несколько секунд (это время настраивается параметров «Интервал одного шага в секундах» в настройках интеграции с 1С в админке Битрикса).
Модификация
На шаге 9, т.е. по окончании обработки файла выгрузки (NB: одного файла, например, товаров или предложений) вызывается событие OnSuccessCatalogImport1C модуля catalog. Аргументы обработчика — параметры компонента обмена и путь к файлу выгрузки.
Также для изменения процесса обмена можно использовать обычные события, например, OnBeforeIBlockElementUpdate или OnBeforeProductAdd. В обработчике, чтобы определить, что событие вызвано именно во время обмена с 1С, я использую такое костыльное условие:
if (isset($_GET['type'], $_GET['mode']) && $_GET['type'] === 'catalog' && $_GET['mode'] === 'import') {
// ...
}
Ну и, если ничего нельзя решить событиями, всегда можно полностью изменить процесс обмена, скопировав и изменив файл /bitrix/admin/1c_exchange.php
, компонент bitrix:catalog.import.1c
и класс CIBlockCMLImport
.
Отключение проверки источника запроса
Как и в случае с выгрузкой товаров, при импорте товаров есть проверка источника запроса. Можно отключить её следующим кодом:
// old school:
COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y");
// d7 style:
BitrixMainConfigOption::set("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y");
Экспорт заказов в 1С
Обмен заказами начинается с авторизации с помощью логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=checkauth
.
После получения ID сессии идёт инициализация обмена, URL: /bitrix/admin/1c_exchange.php?type=sale&mode=init&sessid=ID_Сессии
. На этом этапе сайт отдаёт настройки обмена со стороны сайта.
Для получения списка заказов запрашивается URL /bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ID_Сессии
. Выгружаются заказы с полями EXTERNAL_ORDER = «N», UPDATED_1C = «N» и обновившиеся после последней успешной выгрузки в 1С (это проверяется по времени из свойства «last_export_time_committed_/bitrix/admin/1c_excha» модуля sale).
Флаг EXTERNAL_ORDER указывает, что заказ создан в 1С и его выгрузка в 1С не требуется.
Флаг UPDATED_1C после успешного импорта из 1С на сайте устанавливается в «Y» и такие заказы не участвуют в дальнейших экспортах до их обновления на сайте. Во время обновлений заказов на сайте UPDATED_1C устанавливается в «N».
После обработки заказов 1С для завершения обмена запрашивает URL /bitrix/admin/1c_exchange.php?type=sale&mode=success&sessid=ID_Сессии
. При этом в свойство «last_export_time_committed_/bitrix/admin/1c_excha» модуля sale записывается время запроса списка заказов (НЕ текущее время, т.к. с момента запроса заказов до их обработки могли добавиться заказы и они попадут в следующую выгрузку с сайта).
Модификация
В экспорте заказов участвуют файл /bitrix/admin/1c_exchange.php
, компонент bitrix:sale.export.1c
и класс CSaleExport
. Какие-либо события здесь отсутствуют, поэтому для модификации этого процесса нужно заменить компонент на свой, создать класс-наследник CSaleExport и заменить вызовы в компоненте на него. В последних версиях Битрикс этот класс стал относительно читабельным, в старых там была просто простыня из php и «xml».
Отключение проверки источника запроса
С версии 15.5 добавлена дополнительная проверка и если вызвать просто /bitrix/admin/1c_exchange.php?type=sale&mode=query
, то получим ошибку «failure Ошибка проверки источника запроса. Обновите модуль обмена». Если нет желания возиться с sessid, то можно отключить проверку источника запроса, для этого нужно выполнить:
// old school:
COption::SetOptionString("sale", "secure_1c_exchange", "N");
// d7 style:
BitrixMainConfigOption::set("sale", "secure_1c_exchange", "N");
Статья будет дополняться по мере появления новой информации и вдохновения.
Также полезно почитать:
- Алгоритм выгрузки данных на сайт
- Протокол обмена между системой «1С:Предприятие» и сайтом
- Подробнейшая документация класса CIBlockCMLImport
Ошибка при синхронизации МойСклад и Битрикс
Задача заказчика
Все работало, потом резко перестало. Кроме стандартного обмена, еще есть скрипт, который особым образом обрабатывает новые товары (он работает, его не трогаем). Не передаются остатки и цены.
сама ссылка /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=import.xml
Ответ поддержки МойСклад
У вас ошибки при обмене. Ошибка на стороне интернет магазина: Server returned HTTP response code: 504 for URL Такая ошибка может быть при проблемах на стороне сайта или хостинга. Либо не проходит обращение к сайту по запросу, либо не хватает каких-то прав
Решение
Ошибка «Остатки: Получен ответ на запрос. Отправлен каталог товаров. Отправлены остатки. Ошибка на стороне интернет магазина: Server returned HTTP response code: 504 for URL «
при переходе по ссылке /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=import.xml выдается следующая ошибка «failure
Ошибка проверки источника запроса. Обновите модуль обмена или отключите проверку в настройках компонента. «
Необходимо обновить модуль обмена со страницы http://1c.1c-bitrix.ru/ecommerce/download.php или как он просит отключить проверку командами
COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y"); COption::SetOptionString("sale", "secure_1c_exchange", "N");
Данные настройки — служебные и их нет в виде опций в настройках модуля. Поэтому их нужно установить программно из битрикс Настройки -> Инструменты -> Командная PHP-строка -> Выполнить или прописав в коде вашего сайта.
После выполнения последних команд и при переходе по ссылке /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=import.xml выдается информация «progress Временные таблицы созданы.» означающая, что ошибка побеждена
Ошибка «Остатки: Получен ответ на запрос. Отправлен каталог товаров. Отправлены остатки. Превышен лимит попыток проверки статуса отправки каталога (5)»
Данная ошибка означает, то что когда сервис МойСклад посылает на наш сайт файлы с остатками и каталогом, сайт должен отдавать ответы на запрос, но этого не происходит. Далее, запрос посылается повторно и снова без ответа. После 5 повторений этой ситуации обмен прекращается. Искать решение данной проблемы нужно на стороне сайта или сервера, на котором он расположен.
Вероятнее всего ресурсов на стороне битрикса недостаточно и в логи сервера падает ошибка «client request body is buffered to a temporary file»
скорее всего размер загружаемого файла больше, чем буфер памяти, установленной для закачки файлов Нужно настроить переменную client_body_buffer_size 256м
Напиши в тех поддержку сервера к сис админам. Пусть посмотрят логи и поправят.
Тех поддержка ответила что данный параметр установлен client_body_buffer_size 256м и увеличили time-out до 180, т.к. в логах ошибка Timeout waiting for output from CGI script
Проблема не ушла. Принято решение, что данная проблема связана с сервером и с его настройками. Проверил производительность конфигурации. На 13.06.2018 16:19:27 составляет 2.42 из 30 Нужно настраивать сервер под битрикс или переезжать на новый vps сервер и ставить Web окружение битрикс. Тут необходимы силы системного администратора. Поиграть с настройками сервера и по изучать логи
Разберем по шагам процесс выгрузки товаров на сайт под управлением Bitrix (да и всем чем угодно)
В процессе выгрузки, 1С должна обращается на сайт по следующим путям (пути к штатным контроллерам битрикса, если мы кастомим выгрузку пути будут другие):
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth
Это первый запрос, который делает 1С. Тут она получает ID сессии, которую будет передавать в каждый запрос в процессе всей выгрузки.
Далее на каждом шаге будет проверяться сессия, и она должна совпадать с той, которую мы получили на этом шаге. Если совпадать не будет, то битрикс будет ругаться такой ошибкой:
failure
Ошибка проверки источника запроса. Обновите модуль обмена или отключите проверку в настройках компонента.
Если мы по какой-то причине не хотим проверять сессию на каждом шаге, то можно отключить выполнив команду
COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y");
События не бросаются
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=init&sessid=ID_Сессии
Следующий запрос отчищает папку, в которую выгружаются файлы для выгрузки (загрузятся они далее).
Не забываем передать ID сессии в параметр sessid.
Если все ОК, то сайт сообщает нам следующие сведения:
zip=yes
file_limit=204800
zip: разрешено ли грузить архивы
file_limit: максимальный размер файла (по дефолту 200кб)
События не бросаются
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=ИМЯ_ФАЙЛА&sessid=ID_Сессии
Этот запрос загружает файл в нашу папку. По умолчанию /upload/1c_catalog. Можно передавать все файлы xml по одному и картинки загружать по одиночке, но лучше их упаковать в архив в загрузить один раз. Отправляем POST запросом архив, а в filename указываем имя файла.zip. Если все хорошо, то в результате запроса у нас в папке появиться загружаемый файл.
События не бросаются
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=ИМЯ_ФАЙЛА.zip&sessid=ID_Сессии
Этот запрос выполнять, только если мы загружали архив. Тут происходит распоковка архива.
События не бросаются
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=import.xml&sessid=ID_Сессии
Начинается самое интересное. Наша цель выгрузить товары и тут мы, наконец-то начинаем это делать! Этот запрос надо будет выполнить не один раз,а минимум 8. Именно за столько шагов проходит выгрузка одного файла. Тут мы выгружаем import.xml.
Детально описывать шаги нет смысла, про них можно почитать тут https://mrcappuccino.ru/blog/post/1c-exchange
Если у нас в архиве файл назывался по другому, скажем import_dasdasdasd.xml, то filename=import_dasdasdasd.xml
Бросаются события: OnBeforeCatalogImport1C, OnSuccessCatalogImport1C (по названию не сложно понять, когда они вызываются)
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=offers.xml&sessid=ID_Сессии
По аналогии с предыдущем выгружаем offers.xml и остальные файлы (prices.xml, rests.xml, …)
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=deactivate&sessid=ID_Сессии×tamp=000000000000
Важный шаг, который деактивирует элементы и разделы.
Обязательно должны передать параметр timestamp (временная метка в секундах(!)). Будут выбраны все элементы и разделы, которые не были модифицированы после этой метки.
Грубо говоря, деактивируется все, что было ранее этой метки. Обычно сюда передают метку начала выгрузки.
События не бросаются
- https://example.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=complete&sessid=ID_Сессии
Особо важного тут ничего не делается, а только бросается событие, что импорт успешно завершен.
Бросаются событие: OnCompleteCatalogImport1C