При реализации собственной выгрузки из 1С:Управление торговлей 10 часто возникает задача автоматизировать процесс, исключив ручную загрузку файлов через панель управления сайтом. Если ваш сайт работает на MODX с использованием компонента mSync, обмен данными должен строиться на стандартном протоколе обмена между 1С и сайтом (CommerceML). Рассмотрим подробно, как реализовать этот механизм программно.
Прежде чем писать код в 1С, проанализируем, как именно сайт ожидает получить данные. Компонент mSync реализует стандартный интерфейс обмена. Весь процесс не ограничивается одной отправкой файла; это последовательность шагов, в которой 1С выступает инициатором (клиентом), а сайт — исполнителем (сервером).
Разберем основные этапы, которые нам необходимо имитировать в коде:
zip и какие установлены ограничения по размеру).POST.Поскольку современный веб работает преимущественно через защищенное соединение, нам необходимо правильно инициализировать объект HTTPСоединение. В старых версиях платформы (что характерно для УТ 10) работа с HTTPS требует обязательного использования объекта ЗащищенноеСоединениеOpenSSL.
Рассмотрим пример создания защищенного соединения:
// Настройки подключения
Сервер = "ваш-сайт.ru";
Логин = "admin";
Пароль = "ваш_пароль";
// Инициализируем защищенное соединение
// Используем системные сертификаты по умолчанию
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
// Создаем соединение
НТТР = Новый HTTPСоединение(Сервер, 443, Логин, Пароль, , 30, ЗащищенноеСоединение);
Выясним причину возможных ошибок на этом этапе: если платформа 1С слишком старая (ниже 8.3.8), она может не поддерживать протоколы TLS 1.2 или 1.3, которые требуются современными серверами. В этом случае придется использовать COMОбъект("WinHttp.WinHttpRequest.5.1").
Для mSync крайне важно сохранять сессию. При первом запросе сервер вернет заголовок Set-Cookie. Мы должны извлечь его и передавать дальше.
Проанализируем пример функции для авторизации:
Функция ВыполнитьАвторизацию(НТТР)
Запрос = Новый HTTPЗапрос("/assets/components/msync/connector.php?type=catalog&mode=checkauth");
Ответ = НТТР.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
// В ТекстОтвета придет успех и параметры сессии
// Нам нужно извлечь куки из заголовков ответа
Заголовки = Ответ.Заголовки;
Куки = Заголовки.Получить("Set-Cookie");
Возврат Куки;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Это самый важный этап. Файл передается не как обычное поле формы, а как бинарное содержимое тела запроса. Важно установить правильный заголовок Content-Type.
Разберем по шагам процесс отправки:
Процедура ОтправитьФайлНаСайт(НТТР, ПутьКФайлу, Куки)
ИмяФайлаНаСервере = "import.xml";
АдресРесурса = "/assets/components/msync/connector.php?type=catalog&mode=file&filename=" + ИмяФайлаНаСервере;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Cookie", Куки);
Запрос.Заголовки.Вставить("Content-Type", "application/octet-stream");
// Устанавливаем содержимое файла в тело запроса
Запрос.УстановитьИмяФайлаТела(ПутьКФайлу);
Ответ = НТТР.ОтправитьДляОбъекта(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Файл успешно передан");
Иначе
Сообщить("Ошибка при передаче: " + Ответ.КодСостояния);
КонецЕсли;
КонецПроцедуры
Обратите внимание: использование УстановитьИмяФайлаТела предпочтительнее, чем чтение файла в память, особенно если XML-файл номенклатуры имеет большой объем. Это позволяет избежать переполнения оперативной памяти (OutOfMemoryException).
После того как файл физически оказался на сервере в папке временных файлов mSync, его нужно обработать. Для этого отправляем финальный запрос mode=import. Рассмотрим ситуацию, когда импорт может длиться долго: сервер может возвращать статус выполнения частями. В простейшем случае достаточно одного вызова.
Процедура ЗапуститьИмпорт(НТТР, Куки)
АдресРесурса = "/assets/components/msync/connector.php?type=catalog&mode=import&filename=import.xml";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Cookie", Куки);
Ответ = НТТР.Получить(Запрос);
Сообщить("Ответ сервера на запуск импорта: " + Ответ.ПолучитьТелоКакСтроку());
КонецПроцедуры
Часто проблема кроется не в коде 1С, а в настройках PHP на стороне сайта. Проанализируем ключевые параметры, которые могут блокировать передачу:
Если вы используете mSync, убедитесь, что в его настройках разрешен доступ для пользователя, под которым вы авторизуетесь из 1С, и корректно указаны пути к директориям импорта. Также проверьте права доступа на папку assets/components/msync/ — она должна быть доступна для записи пользователю веб-сервера.
Следуя этой структуре, мы превращаем ручную выгрузку в полностью автоматизированный процесс, который можно запускать по расписанию через РегламентныеЗадания или сразу после завершения формирования файла в вашей обработке.