Вариант реализации REST API для 1С-Битрикс Управление сайтом
Интеграция - Сайты и интернет-магазины
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Вводные
1. В Битрикс заведен каталог товаров без привязки к 1С. В 1С УТ 11 аналогичный каталог.
2. Типовая обработка не позволяет состыковать номенклатуру, результат её работы дубли либо со стороны 1С либо со стороны БУС.
3. Реализация обмена со стороны БУС "черный ящик", в который даже продвинутые программисты по битрикс не горят желанием лезть.
4. Реализация обмена со стороны 1С вызывает ряд вопросов (по логичности и по реализации).
5. Установка доп модуля https://1c.1c-bitrix.ru/ecommerce/download.php проблему не решает, усложняет обновление конфигурации.
Все вышесказанное вынес из собственного опыта взаимодействия при реализации обменов различными способами.
Вариант решения
Реализовать
- точку подключения
- аутентификацию
- роутер
- возможность подключения к классам битрикс
- проверки параметров и данных в запросах (тема отдельной статьи)
Настройка проекта
Есть опыт работы с symfony, взял его.
В ходе реализации получил ошибку "Case mismatch between loaded and declared class names: "CCatalogSKU" vs "CCatalogSku". В коде вызывается $catalogInfo = \CCatalogSKU::getInfoByProductIBlock($this->iblockId); хотя внутри class CCatalogSku extends CAllCatalogSku, что отражает не высокое качество кода БУС (как минимум отсутствие проверок).
Так же присутствуют ошибки по проверке доступности реквизитов (PSR-4).
Для обхода ошибок был собран symfony без errorhandler.
В папке /local БУС создал папку api_min, в ней создал проект (архив проекта будет в фйлах для скачивания)
Создал папку public, в ней index.php, это будет точкой входа в API
В админке БУС добавил правило обработки адреса, раздел "Рабочий стол - Настройки - Настройки продукта - Обработка адресов - Правила обработки"
- Условие #^/api_min/#
- Файл /local/api_min/public/index.php
Роутинг реализован через https://symfony.com/doc/current/create_framework/routing.html, пример для ping
Слеш в конце строки сделал для унификации, т.к. в некоторых настройках БУС автодобавление слеша.
В маршрутах можно использовать regex, что удобно при работе и через id и через xml_id
Организация точки входа
В файле index.php описываем приложение, подключаем контроллеры с данными.
1. Аутентификация по токену
1.1 Заголовок токена, его значения, инфоблоки для работы с товарами заданы в Helpers/ConfigAPI
Работа с товарами
Основная логика описана в "ReferenceIblockController" и "ReferenceController"
Для чтения списка товаров используется "Iblock\ElementTable", т.к. поддерживает limit/offset, для работы с элементами используется CIBlockElement, потому что в новом движке через ElementTable элемент не поменять.
Наследование использую для уменьшения количества кода, т.к. операции с элементами повторяются.
Для проверки параметров запроса и данных в теле запроса использую https://symfony.com/doc/current/validation.html, существенно удобнее чем вручную все проверять и писать сообщения. При ошибки проверки вызываю исключение BadRequestException в которое передаю массив ошибок.
Работа со справочником товары, реализация со стороны 1С
Гружу без пагинации, т.к. каталог небольшой, текущего limit 1000 хватает.
Для обновления элемента используется код
Итог
Реализация обмена через REST не сложна, гибка и структурирована, понятно на каком именно элементе произошла ошибка.
Сборка symfony нестандартная, если получится нормально настроить ErrorHandler, то будет чуть проще.
Благодарю за внимание.
Вступайте в нашу телеграмм-группу Инфостарт