Выгрузка картинок из 1С в Django: multipart/form-data и предотвращение дублирования

Введение

В 13-й части курса Django 1С рассматривается интеграция 1С с веб‑приложением на Django. Основной задачей является выгрузка изображений из 1С на сайт, а также оптимизация работы API и рефакторинг расширения 1С.

1. Выгрузка картинок из 1С на сайт с помощью multipart/form-data

Для передачи файлов из 1С в Django используется стандартный формат multipart/form-data. В 1С это реализуется через вызов HTTP‑запроса, где в теле запроса передаётся файл в виде части multipart. На стороне Django в представлении принимается файл через объект request.FILES и сохраняется в нужную директорию.

Пример запроса из 1С

HTTPЗапрос = Новый HTTPЗапрос("https://example.com/api/upload/", "POST");
HTTPЗапрос.УстановитьЗаголовок("Content-Type", "multipart/form-data");
HTTPЗапрос.ДобавитьФайл("image", "C:\\Images\\photo.jpg", "image/jpeg");
Ответ = HTTPЗапрос.Отправить();

Обработка в Django

def upload_image(request):
    if request.method == "POST":
        image = request.FILES.get("image")
        if image:
            # Сохраняем файл
            path = default_storage.save(f"uploads/{image.name}", image)
            return JsonResponse({"status": "ok", "path": path})
    return JsonResponse({"status": "error"})

2. Предотвращение дублирования картинок на сайте

При многократной выгрузке одного изображения возникает риск дублирования файлов. Для решения этой проблемы в API реализован механизм проверки наличия изображения по уникальному идентификатору (например, хешу файла). Если изображение уже существует, сервер возвращает ссылку на существующий ресурс вместо загрузки нового.

Алгоритм проверки

def upload_image(request):
    if request.method == "POST":
        image = request.FILES.get("image")
        if image:
            hash_value = hashlib.md5(image.read()).hexdigest()
            image.seek(0)
            existing = ImageModel.objects.filter(hash=hash_value).first()
            if existing:
                return JsonResponse({"status": "exists", "path": existing.file.url})
            # Сохраняем новый файл
            path = default_storage.save(f"uploads/{image.name}", image)
            ImageModel.objects.create(file=path, hash=hash_value)
            return JsonResponse({"status": "ok", "path": path})
    return JsonResponse({"status": "error"})

3. Рефакторинг и исправление ошибок расширения 1С

В ходе работы выявлены несколько проблем в расширении 1С, связанных с некорректной обработкой ошибок и неэффективным использованием памяти. Были проведены следующие изменения:

  • Оптимизировано чтение файлов – теперь используется потоковый режим, чтобы избежать загрузки больших изображений в память.
  • Добавлена логика обработки исключений, чтобы при ошибке в запросе сервер возвращал понятный статус и сообщение.
  • Переработана структура кода расширения: вынесены повторяющиеся блоки в отдельные функции, улучшена читаемость и тестируемость.

Заключение

В результате работы в 13-й части курса вы получите готовый механизм выгрузки изображений из 1С в Django, способный избежать дублирования и работать надёжно даже при больших объёмах данных. Полный набор исходных файлов доступен в репозитории курса.

Ссылка на курс: https://nizamov.school/courses/integration1s/django-1c/