Введение
В 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/