Вариант реализации REST API для 1С-Битрикс Управление сайтом

29.10.20

Интеграция - Сайты и интернет-магазины

В статье опишу вариант обмена 1С УТ 11.4 и 1С-Битрикс управление сайтом с иcпользованием компонентов Symfony, в качестве примера обмен данными по товарам.

Скачать исходный код

Наименование Файл Версия Размер
Вариант реализации REST API для 1С-Битрикс Управление сайтом:
.zip 1,02Mb
14
.zip 1,02Mb 14 Скачать

Вводные

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 описываем приложение, подключаем контроллеры с данными.

 
 Содержимое index.php

1. Аутентификация по токену

1.1 Заголовок токена, его значения, инфоблоки для работы с товарами заданы в Helpers/ConfigAPI

 

Работа с товарами

 
 Содержимое \Controllers\References\ProductController

 

Основная логика описана в "ReferenceIblockController" и "ReferenceController"

 
 Содержимое ReferenceIblockController

 

 
  Содержимое ReferenceController

 

Для чтения списка товаров используется "Iblock\ElementTable", т.к. поддерживает limit/offset, для работы с элементами используется CIBlockElement, потому что в новом движке через ElementTable элемент не поменять.

Наследование использую для уменьшения количества кода, т.к. операции с элементами повторяются.

Для проверки параметров запроса и данных в теле запроса использую https://symfony.com/doc/current/validation.html, существенно удобнее чем вручную все проверять и писать сообщения. При ошибки проверки вызываю исключение BadRequestException в которое передаю массив ошибок.

 

Работа со справочником товары, реализация со стороны 1С

 
 Процедура загрузки списка

 

Гружу без пагинации, т.к. каталог небольшой, текущего limit 1000 хватает.

Для обновления элемента используется код

 
 Функция обновления xml_id

 

Итог

Реализация обмена через REST не сложна, гибка и структурирована, понятно на каком именно элементе произошла ошибка.

Сборка symfony нестандартная, если получится нормально настроить ErrorHandler, то будет чуть проще.

 

Благодарю за внимание.

Битрикс REST API Обмен 1С.

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

Сайты и интернет-магазины Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Беларусь Россия Управленческий учет Платные (руб)

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси. Поддержка искусственного интелекта GigaChat

59990 руб.

05.09.2023    8314    126    74    

78

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15936    13    18    

13

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1546    12    3    

10

Обмен данными с сайтом. БП 3.0

Оптовая торговля Розничная торговля Сайты и интернет-магазины Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 руб.

18.03.2019    31528    111    100    

64

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17896    6    15    

12

Универсальный парсер интернет-магазинов

Оптовая торговля Розничная торговля Сайты и интернет-магазины Платформа 1С v8.3 Управляемые формы 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

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

9600 руб.

19.10.2018    52202    220    99    

111
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. FreeArcher 159 30.01.20 11:57 Сейчас в теме
Не соглашусь с первыми 2 пунктами.

Но решение интересное и познавательное, спасибо за статью.

Вопрос следующий: в БУС развивается свое REST API и планируется создать обмен с использованием его (по аналогии, как сейчас работает обмен с Битрикс24). Не сморили в сторону работы через REST API?
2. malikov_pro 1293 30.01.20 14:19 Сейчас в теме
(1) "БУС развивается свое REST API" - Отсутсвие документации и включить не получилось, компонент размещенный в админке не сработал.

Общая проблема битрикса это работа как "черный ящик", пример: грузим через модуль от битрикс реализации в сторону БУС, прилетает первый, после блокировка, типа "нельзя редактировать заказ после реализации". Даже при работе с API напрямую мучаюсь со структурами данных (вытаскивал информацию о приложенных файлах), а БУС REST API это еще один слой абстракции со своими косяками.
Допом подход к архитектуре программистов дорабатывающих типовое решение, запихать остатки в пути в множественнное строковое свойство и отключить его, и хрен пойми как проверять корректность данных со стороны админки пользователем. Про качество кода и организацию сторонних библиотек еще хуже.
Если кратко - накипело, хочу по возможности перевести на другую CMS или фреймворк.

"Но решение интересное и познавательное" - есть желание развить, с упором на редактирование данных на стороне 1С, а CMS чисто обертка.
3. Bublik2011 9 03.10.22 16:56 Сейчас в теме
Ок. Не соглашусь с третьим пунктом. Элементарно кастомизируется копированием компоненты. Откровенно говоря, после копирования - первым этапом надо "нарисовать XML", а потом уже немного "своего" добавить кода в "доп модуль https://1c.1c-bitrix.ru/ecommerce" для формирования "нарисованной XML"

На дворе уже конец 2022 года. C api-rest вендора не ахти как хорошо. Мда-а.аа...
Идеально в своих задачах применять свой, самописный API, пэтому, malikov_pro , Ваше решение - блестящее и идеальная , масштабируемая абстракция !!

P.S. Кстати, в приаттаченном файле не хватает метода getItemListByIds

	/**
	 * @param array $idList
	 * @param array $order
	 *
	 * @return array
	 */
	public static function getItemListByIds(array $idList, array $order = null )
	{
		if (empty($idList)) {
			return $idList;
		}
		$ItemListByIds=[];

		$iterator = static::getClass()::getList([
			'select' => static::getItemFields(),
			'filter' => ['=ID' => $idList]
		]);

		while ($row = $iterator->fetch()) {
			$ItemListByIds[]= $row;
		}

		return $ItemListByIds;
	}
Показать
Оставьте свое сообщение