Как настроить автоматическую передачу XML-файла из 1С на сайт MODX через HTTPS?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При реализации собственной выгрузки из 1С:Управление торговлей 10 часто возникает задача автоматизировать процесс, исключив ручную загрузку файлов через панель управления сайтом. Если ваш сайт работает на MODX с использованием компонента mSync, обмен данными должен строиться на стандартном протоколе обмена между 1С и сайтом (CommerceML). Рассмотрим подробно, как реализовать этот механизм программно.

Понимание протокола взаимодействия с mSync

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

Разберем основные этапы, которые нам необходимо имитировать в коде:

  1. Авторизация (checkauth): Запрашиваем у сайта разрешение на обмен. В ответ получаем куки (сессию), которые нужно будет прикреплять к каждому последующему запросу.
  2. Инициализация (init): Уточняем параметры сервера (поддерживает ли он сжатие zip и какие установлены ограничения по размеру).
  3. Передача файла (file): Отправляем сформированный XML-файл методом POST.
  4. Запуск импорта (import): Даем команду сайту начать обработку переданного файла.

Подготовка HTTP-соединения в 1С для работы с HTTPS

Поскольку современный веб работает преимущественно через защищенное соединение, нам необходимо правильно инициализировать объект HTTPСоединение. В старых версиях платформы (что характерно для УТ 10) работа с HTTPS требует обязательного использования объекта ЗащищенноеСоединениеOpenSSL.

Рассмотрим пример создания защищенного соединения:


// Настройки подключения
Сервер = "ваш-сайт.ru";
Логин = "admin";
Пароль = "ваш_пароль";

// Инициализируем защищенное соединение
// Используем системные сертификаты по умолчанию
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

// Создаем соединение
НТТР = Новый HTTPСоединение(Сервер, 443, Логин, Пароль, , 30, ЗащищенноеСоединение);

Выясним причину возможных ошибок на этом этапе: если платформа 1С слишком старая (ниже 8.3.8), она может не поддерживать протоколы TLS 1.2 или 1.3, которые требуются современными серверами. В этом случае придется использовать COMОбъект("WinHttp.WinHttpRequest.5.1").

Реализация этапа авторизации и получение Cookie

Для mSync крайне важно сохранять сессию. При первом запросе сервер вернет заголовок Set-Cookie. Мы должны извлечь его и передавать дальше.

Проанализируем пример функции для авторизации:


Функция ВыполнитьАвторизацию(НТТР)
    Запрос = Новый HTTPЗапрос("/assets/components/msync/connector.php?type=catalog&mode=checkauth");
    Ответ = НТТР.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
        // В ТекстОтвета придет успех и параметры сессии
        // Нам нужно извлечь куки из заголовков ответа
        Заголовки = Ответ.Заголовки;
        Куки = Заголовки.Получить("Set-Cookie");
        Возврат Куки;
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Передача файла методом POST

Это самый важный этап. Файл передается не как обычное поле формы, а как бинарное содержимое тела запроса. Важно установить правильный заголовок Content-Type.

Разберем по шагам процесс отправки:


Процедура ОтправитьФайлНаСайт(НТТР, ПутьКФайлу, Куки)
    ИмяФайлаНаСервере = "import.xml";
    АдресРесурса = "/assets/components/msync/connector.php?type=catalog&mode=file&filename=" + ИмяФайлаНаСервере;
    
    Запрос = Новый HTTPЗапрос(АдресРесурса);
    Запрос.Заголовки.Вставить("Cookie", Куки);
    Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");
    
    // Устанавливаем содержимое файла в тело запроса
    Запрос.УстановитьИмяФайлаТела(ПутьКФайлу);
    
    Ответ = НТТР.ОтправитьДляОбъекта(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Файл успешно передан");
    Иначе
        Сообщить("Ошибка при передаче: " + Ответ.КодСостояния);
    КонецЕсли;
КонецПроцедуры

Обратите внимание: использование УстановитьИмяФайлаТела предпочтительнее, чем чтение файла в память, особенно если XML-файл номенклатуры имеет большой объем. Это позволяет избежать переполнения оперативной памяти (OutOfMemoryException).

Запуск процесса импорта в MODX

После того как файл физически оказался на сервере в папке временных файлов mSync, его нужно обработать. Для этого отправляем финальный запрос mode=import. Рассмотрим ситуацию, когда импорт может длиться долго: сервер может возвращать статус выполнения частями. В простейшем случае достаточно одного вызова.


Процедура ЗапуститьИмпорт(НТТР, Куки)
    АдресРесурса = "/assets/components/msync/connector.php?type=catalog&mode=import&filename=import.xml";
    Запрос = Новый HTTPЗапрос(АдресРесурса);
    Запрос.Заголовки.Вставить("Cookie", Куки);
    
    Ответ = НТТР.Получить(Запрос);
    Сообщить("Ответ сервера на запуск импорта: " + Ответ.ПолучитьТелоКакСтроку());
КонецПроцедуры

Важные рекомендации по настройке сервера

Часто проблема кроется не в коде 1С, а в настройках PHP на стороне сайта. Проанализируем ключевые параметры, которые могут блокировать передачу:

Если вы используете mSync, убедитесь, что в его настройках разрешен доступ для пользователя, под которым вы авторизуетесь из 1С, и корректно указаны пути к директориям импорта. Также проверьте права доступа на папку assets/components/msync/ — она должна быть доступна для записи пользователю веб-сервера.

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

← На главную