Massdomain.ru

Хостинг и домены
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как работает обмен Битрикс с 1С. Часть 1

Эта вводная часть об устройстве обмена между 1С-Битрикс и 1С, настройке, ошибках и отладке. Всего планируется несколько частей, т.к. объем материала достаточно большой.

Эта вводная часть об устройстве обмена между 1С-Битрикс и 1С, настройке, ошибках и отладке. Информация взята из онлайн-вебинара, автор которого Гелейшев Павел. Всего планируется несколько частей, т.к. объем материала достаточно большой.

Существует 5 типов обмена:

  1. Импорт каталога (в т.ч. остатки и цены) из 1С в Битрикс
  2. Экспорт каталога из Битрикс в 1С
  3. Обмен документами (заказы, оплаты, отгрузки)
  4. Обмен пользовательскими справочниками
  5. Обмен контрагентами

Импорт товаров из Битрикс в 1С используется единоразово, когда к уже существующему сайту подключают пустую 1С. Так же редко используются обмен справочниками и контрагентами, поэтому для начала рассмотрим импорт каталога и обмен документами.

Версии модулей

Старые версии обмена. (ниже 4.x)

  • не требуют отдельной установки в 1С;
  • у них ограниченный функционал по сравнению с новыми модулями;
  • компания 1С-Битрикс официально уже не поддерживает данные модули и заявляет о их неработоспособности, но на практике данные модули еще встречаются и, хоть как, но работают.

Новые версии обмена. (4.x, 5.x, 6.x, 7.x)

  • устанавливаются отдельно в 1С;
  • умеют автоматически обновляться;
  • под каждую версию 1С необходим свой модуль обмена.

Инициализация обмена

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

По умолчанию, если ничего не кастомизировано, все свои запросы 1С отправляет именно по этому адресу.

Рассмотрим по шагам как происходит обмен информацией (на примере обмена каталогом).

Шаг 1: авторизация

Для начала 1Ске необходимо авторизоваться на сайте, для этого она отправляет get запрос на страницу:

Где параметр type зависит от типа обмена: catalog — для обмена товарами, sale — для обмена документами. Параметр mode равный checkauth это как раз и есть попытка авторизоваться.

Вместе с этим, методом post 1Cка отправляет логин и пароль пользователя сайта под которым она авторизуется. Этого пользователя специально добавляют на сайте для 1С. Чаще всего его делают администратором с полными правами. Но будет правильнее ограничивать данного пользователя в правах и помещать его в отдельную группу, предоставляя только те права, которые необходимы для обмена. Логин и пароль пользователя вносится в 1С, в настройки модуля обмена.

На запрос авторизации, сайт отвечает строкой вида:

success PHPSESSID kLv28pH4X0XpW91T4wg28YeY7DwZZXnz
sessid=7f8ec88162e001fdccabfdd202653fc6 timestamp=1614319624

Где success означает что авторизация прошла успешно. Если вместо success будет fail, либо что-то еще, то 1С выдаст ошибку и обмен прекратится. Параметр sessid это идентификатор сессии, значение которого 1C будет добавлять в каждый следующий запрос обмена. Так сайт понимает, что полученные запросы именно от этой 1Ски и запоминает последнюю операцию обмена.

Шаг 2: инициализация

На этом шаге 1С делает запрос на страницу

Где в параметре mode передаётся init, а в sessid передаётся значение идентификатора сессии, полученное на прошлом шаге. Помимо этого в параметре version указывается версия схемы обмена. На данный момент самая последняя версия это 2.10. Версия передаётся из-за того, что в разных модулях для 1С, схема обмена реализована с отличиями, поэтому сайту необходимо понимать по какой схеме будет происходить обмен.

Читайте так же:
Двд не читает диски записанные на компьютере

Получив запрос на инициализацию, сайт очищает все папки с файлами от предыдущего обмена и отвечает 1Ске строкой с настройками обмена:

Параметр zip равный yes, что означает у сайта есть библиотека для работы с zip архивом. 1С в данном случае будет отправлять файлы в zip архивах. Это экономит время для передачи файлов. В противном случае (zip=no) 1С будет отправлять XML файлы в открытом виде.

В параметре file_limit сайт указывает максимальный размер одного файла. Значение этого параметра задаётся в настройках обмена на сайте. В случае если файл будет большего размера, то 1С разобьёт его на несколько частей и будет передавать его, соответственно, за несколько запросов. Это необходимо для того что бы не сработало ограничение по размеру файлов загружаемых на сервер сайта.

Шаг 3: отправка файла

1С методом post отправляет тело файла по адресу:

Параметр mode устанавливается в значение file, а в параметре filename передаётся имя файла. Сайт сохраняет загружаемые файлы в папку /upload/1c_catalog/ (для обмена товарами), либо /upload/1c_exchange/ (для обмена заказами). Имя файла берется из параметра filename, т.е. именно 1С задает название файла обмена под которым сайт сохраняет его у себя.

Запрос на отправку файлов может повторяться несколько раз, например в случае если файл был разбит 1Ской на несколько частей. На каждый запрос сайт отвечает строкой:

Если в ответе будет что-то другое, то обмен прервётся с ошибкой.

После того как файл будет получен полностью, начинается сам процесс импорта.

Шаг 4: начало обмена

Для этого 1С отправляет запрос на страницу:

Где для параметра mode указывает значение import и повторно в параметре filename указывает имя файла.

В это время сайт находит нужный файл с указанным именем у себя в папке обмена и начинает импорт. Импорт выполняется в несколько шагов. На процесс импорта 1С уже никак не влияет, они лишь отправляет запросы повторно с mode=import до тех пока пока операция импорта не завершится. В ответ на каждый запрос она получает строку вида:

progress Временные таблицы созданы.
progress Файл импорта прочитан.
progress Обработано 1 из 1 элементов.

Если в строке есть значение progress, то 1С повторяет запрос и будет повторять до тех пор пока не получит ответ:

success Импорт успешно завершен.

Сам процесс импорта несколько необычен в 1С-Битрикс. Скрипт импорта не работает с xml напрямую (с помощью стандартных библиотек php), а создает в базе данных пустую таблицу b_xml_tree (предварительно очистив) и построчно считывая xml файл импорта заносит данные в созданную таблицу. После того как файл будет полностью перенесён во временную таблицу скрипт импорта начинает обрабатывать данные из таблицы и уже вносить изменения в данные сайта (например создаёт группы, товары и т.п.)

Читайте так же:
Загадочные места на яндекс картах

После того как импорт файла будет завершён запускается процесс деактивации разделов и элементов каталога.

Шаг 5: деактивация

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

Процесс деактивации отличается в разных версиях модуля обмена:

в старых версиях деактивация происходила на 4-ем шаге (в момент импорта xml, настройки хранились на сайте),

настройки деактивации на сайте

в последних версиях деактивация происходит на отдельном шаге (настройки уже хранятся в 1С)

Деактивация происходит только при полном обмене. Для деактивации 1С отправляет запрос на страницу:

Где параметр mode равен deactivate, а так же указывается timestamp, значение которого 1С получала на первом шаге. timestamp это время начала обмена, по нему сайт ищет все товары, у которых время модификации меньше чем значение в timestamp и деактивирует их. Логика такая: все товары, которые были изменены после времени начала обмена — считаются что они были в xml импорта, а все остальные — нет.

Тут есть особенность, если в момент импорта каталога какие-либо товары были изменены (администратором, скриптом выполняющимся на cron и т.п.), то 1С-Битрикс не поймет, были они в импорте или нет. Такие товары не будут деактивированы, даже если их не было в обмене. Это особенно актуально для больших сайтов, где обмен выполняется очень долго.

При использовании нового модуля обмена, деактивация зависит только от настроек в 1С, настройки в 1С-Битрикс не работают.

Обмен заказами

Обмен заказами (выгрузка из 1С на сайт) идёт по той же самой схеме. Только в параметр mode передаётся значение sale, а сохранение файла происходит в папку /upload/1c_exchange/.

Для экспорта заказов в 1С используется запрос:

В ответ сайт отдаёт XML с заказами, которые были как-либо изменены с даты последнего обмена. Для этого сайт записывает дату и время последнего обмена. Время сохраняется в таблицу b_option, строка last_export_time_committed_/bitrix/admin/1c_excha.
При последующих запросах сайт отдаёт все заказы, в которых дата и время изменения новей, чем дата последнего обмена.

Например, если по какой-либо причине не выгрузился определённый заказ, то достаточно зайти в редактирование этого заказа и нажать «Сохранить». Тогда у заказа изменится дата редактирования и при следующем обмене он попадёт в выгрузку.

Так же можно сбросить время в last_export_time_committed, тогда в xml попадут все заказы. Пример кода для сброса:

Если обмен завершается с ошибкой

Например при запросе:

1C ожидает получить строку, например:

progress Файл импорта прочитан.

А получает: «DB query error»

настройки деактивации в 1С

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

настройки деактивации в 1С

Так же есть галочка «Выгружать лог на сайт», в этом случае, после окончания обмена, 1С отправит логи на сайт. Но проблема в том, что если сайт при обмене падает с ошибкой, то логи 1С отправить не сможет.

Читайте так же:
Звук интел на смс

Пример лога обмена 1С

настройки деактивации в 1С

В лог записываются, как действия самой 1С (например «Формирование пакета для общих данных для товаров»), так и то, что возвращает сайт (например «Процесс выполнения обмена: Временные таблицы удалены»). Для того, чтобы сайт возвращал более полные данные по ошибке, а не заглушку «DB query error», необходимо включить режим вывода расширенных ошибок:

После этого необходимо повторить обмен. В логах уже будет описана конкретная ошибка, например:

Table ‘sv22.b_xml_tree’ doesn’t exist
.
Сan’t create table ‘b_xml_tree’ (errno: -1)
.
MySQL Query Error: create table b_xml_tree_import_1c

Ошибка по таблице b_xml_tree возникает из-за того, что скорее всего было запущено несколько обменов одновременно. В битрикс процесс устроен так, что может идти одновременно только один обмен, т.к. запись происходит в таблицу b_xml_tree, которая очищается вначале каждого обмена. Т.е. при запуске второго обмена, таблица очистится и первый процесс обмена получит ошибку, т.к. таблицы уже не существует.

Очень часто это возникает из-за того, что подключают дополнительно тестовую 1С и забывают в ней отключить периодический обмен. И две 1С (боевая и тестовая) одновременно шлют запросы на обмен.
Так же случается, если настроен автоматический обмен по расписанию и примерно в это же время запускается ручной обмен.

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

Бонус для дочитавших

Когда необходимо посмотреть что же конкретно присылает 1С в xml, приходится запрашивать файлы выгрузки (1С хранит их локально), но это долго и неудобно.

Для решения этой задачи есть волшебная константа:

После её установки битрикс перестаёт удалять файлы обмена и сохраняет их в папки
/upload/1c_catalog0/
/upload/1c_catalog1/
.
/upluad/1c_catalogNNN/

Важно! После отладки обязательно убирайте константу, иначе место на сервере быстро закончится.

2 шаг. Маркетплейс и лицензионное соглашение

Перейдем к непосредственной активации системы. Сделаем это на примере одного из самых популярных решений платформы – «Аспро: Маркет».

Вначале нужно скопировать адрес сайта и вставить его в поисковую строку браузера. При этом index.php требуется заменить на bitrix. Получается ссылка вида «названиесайта.hostdk.ru/bitrix». Так мы попадаем в административную панель веб-ресурса. Нужно перейти в раздел «Маркетплейс», располагаемый в левой части сайта.

Обновление платформы Bitrix

Обновление платформы Bitrix

Вам будет предложено изучить и принять лицензионное соглашение Битрикс.

Ошибки при работе с файлами данных

Данные ошибки возникают при неверной настройке прав доступа к файлу.

Отображение ошибок звучит следующим образом: «Ошибка открытия файла» и «Ошибка записи файла».

Возможные причины и их решение:

Закончилось место на диске.

Удалить старые бэкапы или увеличить тариф на хостинге.

По ftp файлы загружаются, а через веб-интерфейс административного раздела сайта нет.

Обратиться в техническую поддержку хостинг-провайдера.

Не работает или некорректно работает сжатие данных при обмене.

Для начала можно попробовать выключить сжатие в настройках модуля обмена.

Также можно проверить работу функции zip_open на сервере

Откройте в браузере страницу http:// //bitrix/admin/phpinfo.php (Либо выполните команду

Читайте так же:
Жесткий диск на 1 терабайт для ps4

if (exist_function (“zip_open”))

В браузере отобразится таблица:

Для строки ZIP должно стоять «enabled».

Не работает 404 ошибка в 1с битрикс. Правильная настройка

В битриксе 404 ошибка отрабатывается весьма специфически — неправильный адрес со статических страниц и разделов корректно перебрасывает на страницу 404.php, при этом сохраняя неправильный URL в адресной строке браузера. То есть все по seo.

А вот если неправильный адрес начинается с раздела инфоблока или каталога, то сервер отдаст браузеру 404 статус страницы (и то при определенных настройках инфоблока, о которых ниже), но 404 страницу не покажет, а покажет корневую страницу инфоблока, причем иногда совсем другого инфоблока. Но все-таки сохранит неправильный URL в адресной строке.

В интернете данный вопрос поднимался не раз. Когда-то популярным решением была настройка в битрикс принудительного редиректа на 404 страницу.))) Перечитав изрядно статей, выполнив несколько найденных инструкций, желаемого результата добиться не удалось(((. Пришлось, вооружившись командой print backtrace, отловить негодяйскую 404 ошибку и заставить ее работать как положено.

Ставим задачу:

  1. Нужно, чтобы инфоблоки и каталоги в случае неправильной ссылки отдавали 404 статус
  2. Нужно, чтобы этот статус правильно обрабатывался и приводил к вызову страницы 404.php

На что стоит обратить внимание:

1. Файл 404.php — лежит в корне сайта. Должен выглядеть вот так (тут все стандартно):

2. В .htaccess должна быть вот такая строчка:

Если у вас сервер на nginx, то нужно прописать в конфиге, в секции location, следующее:

тех. отступление:

Skrinshot-2015-01-01-14.35.46

Попробуем сэмулировать 404 ошибку с какой-нибудь статической страницы и отловить результат через команду debug_print_backtrace ( ) ;

Смотрим файл — видим там строку с инклюдом 404 страницы. Она вызывается, очевидно, в том случае, если страница не найдена в структуре файлов и папок, а также в файле urlrewrite.php в корне сайта, где как раз описаны все наши инфоблоки и каталоги (для правильной работы ЧПУ).

Первая поставленная нами задача выполняется настройкой инфоблоков и компонентов:

3. Проверим настройки самих каталогов:

Скриншот 2015-01-01 14.56.00

URL страницы ИБ — должен указывать на папку, из которой будет осуществляться вызов инфоблока.

URL страницы раздела — если структура инфоблока будет иметь подразделы, то ссылка должна строиться на основе символьного кода раздела.

URL страницы детального просмотра — если элемент находится в подразделе, то к ссылке будет прибавляться символьный код раздела перед символьным кодом элемента. Иначе — только символьный код элемента.

4. И инфоблоков:

Скриншот 2015-01-01 15.48.25

то есть, как мы видим, для инфоблоков подразделы можно не описывать.

5. Проверяем настройки вызова инфоблоков:

Скриншот 2015-01-01 15.22.18

Обязательно проверяем, что отмечена галка «Включить поддержку ЧПУ»!

Каталог ЧПУ — корневая папка инфоблока

Раздел — #SECTION_CODE#/ — повторяем из настроек инфоблока, но не ставим слеш в начале, иначе компонент будет работать не верно

Детальная информация — #SECTION_CODE#/#ELEMENT_CODE#/ — ссылка формируется на основе символьного кода раздела (если есть) и кода элемента. Опять же, слеш в начале не ставим!

Если предполагается, что все элементы будут располагаться в корне инфоблока, без подразделов, то можно использовать следующие настройки:

Читайте так же:
Если сгорела материнская плата включится ли компьютер

Скриншот 2015-01-01 15.49.27

То есть поле для страницы раздела вообще можем пропустить , для страницы элемента: #ELEMENT_CODE#/ . Не забываем пропустить слеш в начале!

6. Отмечаем галочку там же в настройках: «Устанавливать статус 404, если не найдены элемент или раздел:».

тех. отступление:

Скриншот 2015-01-01 15.26.32

После сохранения всех настроек, если мы набираем в разделе инфоблока неправильный адрес, то по-прежнему вместо 404 страницы увидим корневую страницу раздела инфоблока, но страница будет иметь в заголовке 404 статус. Посмотреть его можно через браузерную панель разработчика:

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

7. Добавим следующий код в файл /bitrix/php_interface/init.php:

С этого момента страница ошибок будет работать! (наверно))) Если нет, опишите вашу ситуацию в комментариях

UPD от 29.08.15: чуть обновил код файла 404.php и сниппет для init.php

UPD от 15.01.18: настраивал сегодня на одном проекте отладку 404-й ошибки по данной инструкции. Все работает отлично)) Версия битрикса — последняя на указанную дату

новейших вопросов о битриксе — Stack overflow на русском

  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. работы Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Разместим блок корзины в шаблоне

Корзина в шапке

Вот собственно и все. Осталось только выводить данные в корзину при переходе по товарам.
А это мы решим еще проще, просто заменив в строке вывода корзины
Код:

Вот теперь наша AJAX корзина в интернет-магазине на Битрикс готова.
Архив магазина шаблона StartShop на момент урока можно скачать отсюда.

От автора:
Ну вот мы рассмотрели самую интересную на данный момент тему AJAX запросы. Сейчас практически все взаимодействия строятся через AJAX. Красиво, но как вы видите достаточно прилично усложняет код. В следующем уроке я рассмотрю работу с корзиной в списке товаров и там я размещу JacaScript в отдельном файле, а взаимодействие сделаю с помощью библиотеки JQuery. Посмотрите разницу: Урок 12. AJAX запрос средствами JQuery в Bitrix. До новых встреч.

Шаблон письма

Шаблон письма до безобразия прост, в нём мы отразим только самую необходимую информацию:

Осталось дополнить наш ajax.php чтобы в случае успешной проверки капчи он отправлял данные на почту:
Метод CEvent::Send() отвечает за отправку письма, число 10 в параметрах метода — это идентификатор почтового шаблона который мы подготовили ранее, у вам он может отличаться. Если вы всё сделали правильно, в результате вам на почту будет приходить такое вот письмо:
Заявка с сайта

Как видите для менеджера выделен предпочтительный способ связи с клиентом, это одна из фишек БМ, вы будете связываться с потенциальным покупателем максимально комфортным для него способом, что повысит его лояльность и возможно конверсию.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector