При автоматизации интернет-торговли нередко возникает задача связать учетную систему на базе платформы 1С:Предприятие 7.7 (типовую «Торговля и Склад» или самописную конфигурацию) с современным интернет-магазином на CMS «1С-Битрикс». Разберем, как устроена стандартная схема интеграции, какие требования предъявляются к форматам и транспорту, а также какими средствами платформы 1С 7.7 можно решить эту задачу без сложных внешних надстроек.
Проанализируем базовые принципы взаимодействия. Распространенным заблуждением является мнение, что для обмена с 1С-Битрикс требуются тяжелые SOAP веб-сервисы, сложные хэш-подписи (SHA-1/MD5) или формат JSON. На самом деле стандартный модуль обмена 1С-Битрикс работает по протоколу CommerceML 2 через обычные HTTP-запросы методом GET и POST.
Вся процедура обмена строится на следующих правилах:
/bitrix/admin/1c_exchange.php с передачей служебных GET-параметров type (тип обмена: catalog для товаров и цен или sale для заказов) и mode (текущая фаза обмена).import.xml, offers.xml для каталога и orders.xml для заказов).Рассмотрим последовательность шагов, которую необходимо воспроизвести в обработке 1С 7.7 при выгрузке каталога товаров на сайт:
mode=checkauth):
1С отправляет GET-запрос с базовой HTTP-авторизацией (Basic Auth). При успешной проверке логина и пароля Битрикс возвращает три строки: статус success, имя cookie сессии и значение cookie. Эту сессионную cookie необходимо сохранять и передавать во всех последующих запросах сеанса.
mode=init):
1С запрашивает системные настройки импорта. Сервер возвращает параметры, например, признак поддержки сжатия (zip=yes или zip=no) и ограничение на максимальный размер передаваемого пакета в байтах (file_limit=...).
mode=file&filename=имя_файла.xml):
Файлы выгрузки отправляются телом POST-запроса в виде бинарного потока. Если размер сформированного XML-файла превышает значение file_limit, файл передается порциями (несколькими последовательными POST-запросами).
mode=import&filename=имя_файла.xml):
1С отправляет GET-запрос на запуск разбора переданного XML-документа. Чтобы избежать падения скрипта по таймауту выполнения PHP (max_execution_time), сайт выполняет разбор порциями. Если импорт не завершен, сервер возвращает статус progress с текстом текущего состояния. 1С должна в цикле повторять запрос mode=import до тех пор, пока от сервера не будет получен ответ success.
При обмене заказами (type=sale) шаги авторизации и инициализации аналогичны, после чего вызывается режим mode=query для получения XML с новыми заказами и режим mode=success для подтверждения успешного приема документов учетной системой.
Выясним причину, почему старая компонента v7plus.dll не подходит для прямого обмена с современными сайтами. Данная библиотека не поддерживает защищенный протокол HTTPS с современными версиями шифрования TLS 1.2 и TLS 1.3. При попытке отправить запрос на защищенный URL возникнет ошибка соединения.
Для надежной работы по HTTP и HTTPS в среде 1С 7.7 рекомендуется использовать системные COM-объекты Windows: MSXML2.ServerXMLHTTP.6.0 или WinHttp.WinHttpRequest.5.1.
Посмотрим на пример реализации HTTP-запроса через WinHttp.WinHttpRequest.5.1:
// Инициализация объекта сетевого запроса
Попытка
HTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Исключение
Сообщить("Не удалось создать объект WinHttp: " + ОписаниеОшибки(), "!");
Возврат;
КонецПопытки;
АдресСкрипта = "https://myshop.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth";
// Открываем GET-запрос (асинхронный режим = Ложь)
HTTP.Open("GET", АдресСкрипта, 0);
// Устанавливаем учетные данные для Basic Auth
HTTP.SetCredentials("Пользователь1С", "Пароль1С", 0);
// Отправляем запрос
HTTP.Send();
// Проверяем код ответа сервера
Если HTTP.Status = 200 Тогда
ОтветСервера = HTTP.ResponseText;
Сообщить("Ответ сайта: " + ОтветСервера);
Иначе
Сообщить("Ошибка HTTP: " + HTTP.Status + " " + HTTP.StatusText, "!");
КонецЕсли;
Разберем еще одну техническую особенность: стандартный объект платформы 1С 7.7 Текст сохраняет файлы исключительно в однобайтовых кодировках (Windows-1251 или DOS), тогда как протокол CommerceML 2 для Битрикс ожидает данные в кодировке UTF-8.
Чтобы сформировать XML-файл с корректной кодировкой, применяются следующие подходы:
ADODB.Stream: формируем текстовый документ стандартными средствами или склеиванием строк, после чего перекодируем его в UTF-8 и записываем на диск через поток ADO.MSXML2.DOMDocument: строим структуру XML-документа объектным методом, задавая декларацию <?xml version="1.0" encoding="utf-8"?>, и сохраняем файл методом Save().Если нет необходимости реализовывать полный пошаговый цикл протокола Битрикс на встроенном языке 1С 7.7, рассмотрим альтернативные практические варианты: