MaxMedia | Интеграция с 1С

Интеграция MaxMedia API с 1С:Предприятие

📋 Общая информация

MaxMedia API позволяет автоматически обрабатывать фотографии товаров из вашей ERP системы 1С. Вы можете отправлять до 100 фотографий за один запрос и получать обработанные изображения.

Ваши данные для интеграции:

  • 🔗 Базовый URL: https://maxmedia.uz/api/v1
  • 🔑 API ключ: Получите у администратора MaxMedia

🔧 Шаг 1: Настройка HTTP-соединения в 1С

Создайте общий модуль MaxMediaAPI с функциями для работы с API:

// Общий модуль: MaxMediaAPI

// Константы (вынесите в настройки)
Перем BaseURL;
Перем APIKey;

Процедура ПриНачалеРаботыСистемы()
    BaseURL = "https://maxmedia.uz/api/v1";
    APIKey = "mm_ВАШ_API_КЛЮЧ_ЗДЕСЬ";
КонецПроцедуры

// Функция создания HTTP-соединения
Функция СоздатьHTTPСоединение() Экспорт
    
    SSL = Новый ЗащищенноеСоединениеOpenSSL();
    
    HTTPСоединение = Новый HTTPСоединение(
        "maxmedia.uz",  // Хост
        443,            // Порт HTTPS
        ,               // Логин
        ,               // Пароль
        ,               // Прокси
        60,             // Таймаут
        SSL             // SSL
    );
    
    Возврат HTTPСоединение;
    
КонецФункции

// Функция отправки POST запроса
Функция ОтправитьPOSTЗапрос(Путь, ТелоJSON) Экспорт
    
    HTTPСоединение = СоздатьHTTPСоединение();
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("X-API-Key", APIKey);
    
    HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоJSON, КодировкаТекста.UTF8);
    
    Попытка
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        Возврат HTTPОтвет;
    Исключение
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

// Функция отправки GET запроса
Функция ОтправитьGETЗапрос(Путь) Экспорт
    
    HTTPСоединение = СоздатьHTTPСоединение();
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("X-API-Key", APIKey);
    
    HTTPЗапрос = Новый HTTPЗапрос(Путь, Заголовки);
    
    Попытка
        HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
        Возврат HTTPОтвет;
    Исключение
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

📤 Шаг 2: Отправка фотографий на обработку

// Функция отправки фото на обработку
Функция ОтправитьФотоНаОбработку(МассивURLФото, ИдПромпта = Неопределено, ТекстПромпта = "") Экспорт
    
    // Формируем тело запроса
    Данные = Новый Структура;
    Данные.Вставить("images", МассивURLФото);
    
    Если ИдПромпта <> Неопределено Тогда
        Данные.Вставить("prompt_id", ИдПромпта);
    ИначеЕсли ТекстПромпта <> "" Тогда
        Данные.Вставить("custom_prompt", ТекстПромпта);
    КонецЕсли;
    
    Данные.Вставить("output_format", "png");
    Данные.Вставить("image_size", "auto");
    
    // Конвертируем в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Данные);
    JSONСтрока = ЗаписьJSON.Закрыть();
    
    // Отправляем запрос
    HTTPОтвет = ОтправитьPOSTЗапрос("/api/v1/process", JSONСтрока);
    
    Если HTTPОтвет = Неопределено Тогда
        Возврат Новый Структура("Успех, Ошибка", Ложь, "Ошибка соединения");
    КонецЕсли;
    
    // Парсим ответ
    ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
        Возврат Новый Структура("Успех, TaskId, Сообщение", Истина, Результат.task_id, Результат.message);
    Иначе
        Возврат Новый Структура("Успех, Ошибка", Ложь, Результат.detail);
    КонецЕсли;
    
КонецФункции

// Пример использования:
//
// МассивФото = Новый Массив;
// МассивФото.Добавить("https://example.com/photo1.jpg");
// МассивФото.Добавить("https://example.com/photo2.jpg");
//
// Результат = MaxMediaAPI.ОтправитьФотоНаОбработку(МассивФото, 1);
// Если Результат.Успех Тогда
//     Сообщить("Задача создана: " + Результат.TaskId);
// Иначе
//     Сообщить("Ошибка: " + Результат.Ошибка);
// КонецЕсли;

🔍 Шаг 3: Проверка статуса обработки

// Функция проверки статуса задачи
Функция ПроверитьСтатусЗадачи(TaskId) Экспорт
    
    HTTPОтвет = ОтправитьGETЗапрос("/api/v1/status/" + TaskId);
    
    Если HTTPОтвет = Неопределено Тогда
        Возврат Новый Структура("Успех, Ошибка", Ложь, "Ошибка соединения");
    КонецЕсли;
    
    ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
        Возврат Новый Структура(
            "Успех, Статус, ВсегоФото, Обработано, Ошибок",
            Истина,
            Результат.status,
            Результат.total_images,
            Результат.processed_images,
            Результат.failed_images
        );
    Иначе
        Возврат Новый Структура("Успех, Ошибка", Ложь, Результат.detail);
    КонецЕсли;
    
КонецФункции

// Статусы задачи:
// - "pending"    - в очереди
// - "processing" - обрабатывается
// - "completed"  - завершено
// - "partial"    - частично завершено (есть ошибки)
// - "failed"     - ошибка

📥 Шаг 4: Получение результатов

// Функция получения результатов обработки
Функция ПолучитьРезультатЗадачи(TaskId) Экспорт
    
    HTTPОтвет = ОтправитьGETЗапрос("/api/v1/result/" + TaskId);
    
    Если HTTPОтвет = Неопределено Тогда
        Возврат Новый Структура("Успех, Ошибка", Ложь, "Ошибка соединения");
    КонецЕсли;
    
    ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
    Результат = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Если HTTPОтвет.КодСостояния = 200 Тогда
        // Формируем массив с изображениями
        Изображения = Новый Массив;
        
        Для Каждого Фото Из Результат.images Цикл
            СтруктураФото = Новый Структура;
            СтруктураФото.Вставить("ОригинальныйURL", Фото.original_url);
            СтруктураФото.Вставить("РезультатURL", Фото.result_url);
            СтруктураФото.Вставить("Статус", Фото.status);
            СтруктураФото.Вставить("Ошибка", Фото.error);
            
            Изображения.Добавить(СтруктураФото);
        КонецЦикла;
        
        Возврат Новый Структура(
            "Успех, Статус, Изображения, СрокХранения",
            Истина,
            Результат.status,
            Изображения,
            Результат.expires_at
        );
    Иначе
        Возврат Новый Структура("Успех, Ошибка", Ложь, Результат.detail);
    КонецЕсли;
    
КонецФункции

// Функция скачивания изображения
Функция СкачатьИзображение(URLИзображения, ПутьСохранения) Экспорт
    
    // URL будет в формате: https://maxmedia.uz/static/uploads/taskid/image.png
    // Нужно скачать и сохранить
    
    HTTPСоединение = СоздатьHTTPСоединение();
    
    // Извлекаем путь из URL
    URLЧасти = СтрРазделить(URLИзображения, "maxmedia.uz");
    Путь = URLЧасти[1];
    
    HTTPЗапрос = Новый HTTPЗапрос(Путь);
    
    Попытка
        HTTPСоединение.Получить(HTTPЗапрос, ПутьСохранения);
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

📦 Полный пример обработки

// Процедура обработки фотографий номенклатуры
Процедура ОбработатьФотографииНоменклатуры(СсылкаНоменклатура) Экспорт
    
    // 1. Собираем URL фотографий номенклатуры
    МассивФото = Новый Массив;
    
    // Получаем фото из вашей базы (адаптируйте под свою структуру)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Фото.URL КАК URLФото
                   |ИЗ РегистрСведений.ФотоНоменклатуры КАК Фото
                   |ГДЕ Фото.Номенклатура = &Номенклатура";
    Запрос.УстановитьПараметр("Номенклатура", СсылкаНоменклатура);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        МассивФото.Добавить(Выборка.URLФото);
    КонецЦикла;
    
    Если МассивФото.Количество() = 0 Тогда
        Сообщить("Нет фотографий для обработки");
        Возврат;
    КонецЕсли;
    
    // 2. Отправляем на обработку
    // prompt_id = 1 - используем готовый шаблон промпта из админки
    Результат = MaxMediaAPI.ОтправитьФотоНаОбработку(МассивФото, 1);
    
    Если НЕ Результат.Успех Тогда
        Сообщить("Ошибка отправки: " + Результат.Ошибка);
        Возврат;
    КонецЕсли;
    
    TaskId = Результат.TaskId;
    Сообщить("Задача создана: " + TaskId);
    
    // 3. Ждём завершения (опрашиваем каждые 5 секунд)
    МаксПопыток = 120; // 10 минут максимум
    Для Попытка = 1 По МаксПопыток Цикл
        
        // Пауза 5 секунд
        НачВремя = ТекущаяУниверсальнаяДатаВМиллисекундах();
        Пока (ТекущаяУниверсальнаяДатаВМиллисекундах() - НачВремя) < 5000 Цикл
            // Ждём
        КонецЦикла;
        
        Статус = MaxMediaAPI.ПроверитьСтатусЗадачи(TaskId);
        
        Если НЕ Статус.Успех Тогда
            Сообщить("Ошибка проверки статуса: " + Статус.Ошибка);
            Продолжить;
        КонецЕсли;
        
        Сообщить("Статус: " + Статус.Статус + " (" + Статус.Обработано + "/" + Статус.ВсегоФото + ")");
        
        Если Статус.Статус = "completed" ИЛИ Статус.Статус = "partial" ИЛИ Статус.Статус = "failed" Тогда
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    // 4. Получаем результаты
    РезультатЗадачи = MaxMediaAPI.ПолучитьРезультатЗадачи(TaskId);
    
    Если НЕ РезультатЗадачи.Успех Тогда
        Сообщить("Ошибка получения результата: " + РезультатЗадачи.Ошибка);
        Возврат;
    КонецЕсли;
    
    // 5. Скачиваем и сохраняем обработанные фото
    Для Каждого Фото Из РезультатЗадачи.Изображения Цикл
        
        Если Фото.Статус = "completed" И Фото.РезультатURL <> Неопределено Тогда
            
            // Формируем путь для сохранения
            ПутьСохранения = КаталогВременныхФайлов() + "обработанное_" + Строка(Новый УникальныйИдентификатор) + ".png";
            
            Если MaxMediaAPI.СкачатьИзображение("https://maxmedia.uz" + Фото.РезультатURL, ПутьСохранения) Тогда
                Сообщить("Сохранено: " + ПутьСохранения);
                
                // Здесь можно загрузить в базу 1С
                // ...
                
            Иначе
                Сообщить("Ошибка скачивания: " + Фото.РезультатURL);
            КонецЕсли;
            
        ИначеЕсли Фото.Статус = "failed" Тогда
            Сообщить("Ошибка обработки: " + Фото.Ошибка);
        КонецЕсли;
        
    КонецЦикла;
    
    Сообщить("Обработка завершена!");
    
КонецПроцедуры

⚠️ Важные заметки

  • Срок хранения: Обработанные изображения хранятся 3 дня. Скачайте их заранее!
  • URL изображений: Исходные фото должны быть доступны по публичному URL (http/https)
  • Лимиты: У вас есть дневной и месячный лимит на обработку. Проверяйте через /api/v1/me
  • Размер пакета: Максимум 100 изображений за один запрос
  • API ключ: Храните ключ безопасно. Не передавайте третьим лицам!

❌ Коды ошибок

Код Описание Решение
401 Неверный API ключ Проверьте заголовок X-API-Key
404 Задача не найдена Проверьте task_id
429 Превышен лимит Подождите или увеличьте лимит
400 Неверные параметры Проверьте JSON запроса
500 Ошибка сервера Свяжитесь с поддержкой

📞 Поддержка

Возникли вопросы по интеграции? Свяжитесь с нами:

  • 📧 Email: support@maxmedia.uz
  • 💬 Telegram: @maxmedia_support