Разработка кастомной формы загрузки файлов на 1С-Битрикс

Разработка кастомной формы загрузки файлов на 1С-Битрикс Мы сталкивались с ситуацией: клиент прикрепляет техническое задание, фотографии дефекта товара или чертежи, а стандартный компонент `bitrix:main.feedback` не справляется. Нет превью, нет drag-and-drop, нет валидации типов на клиенте, нет за
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка кастомной формы загрузки файлов на 1С-Битрикс
Средний
~1-2 недели

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1019
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    763
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    882
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1164

Разработка кастомной формы загрузки файлов на 1С-Битрикс

Мы сталкивались с ситуацией: клиент прикрепляет техническое задание, фотографии дефекта товара или чертежи, а стандартный компонент bitrix:main.feedback не справляется. Нет превью, нет drag-and-drop, нет валидации типов на клиенте, нет загрузки по частям для больших файлов. Результат — потерянные заявки и сломанный UX. Кастомная форма загрузки файлов на 1С-Битрикс решает эти проблемы. Под ключ мы внедряем решение, интегрированное с b_file и CRM, которое приносит клиентам существенную экономию за счёт автоматизации.

Проблемы, которые решаем

  • Таймауты при больших файлах: стандартный POST-запрос одного файла 100 МБ может упасть по таймауту на медленном канале. Используем chunked upload — делим файл на части по 5 МБ, загружаем последовательно с индикацией прогресса. Экономия времени до 70%, снижение потерь заявок до 35%. Chunked upload в 3 раза надёжнее обычного POST при нестабильном соединении.
  • Отсутствие клиентской валидации: неопытные пользователи пробуют загрузить .exe или .dll. На сервере проверяем MIME через finfo, отсекаем недопустимые типы. На клиенте — валидация по расширению. Это снижает нагрузку на сервер и исключает инциденты безопасности.
  • Невозможность прикрепить несколько файлов: форма с одним полем file не подходит для ТЗ + чертежи + фотографии. Реализуем множественную загрузку с лимитом до 10 файлов за сессию, что покрывает 95% бизнес-сценариев.
  • Избыточное потребление памяти: при обычном POST-запросе PHP грузит весь файл в память. Наш AJAX-подход избегает этого — файл загружается отдельно, PHP обрабатывает только tmp_name.

Как работает Chunked Upload?

Для файлов свыше 50 МБ стандартный upload через один POST-запрос ненадёжен. Наш ChunkedUploader разбивает файл на части, загружает их по очереди и собирает на сервере. Результат — загрузка файлов до 2 ГБ с прогресс-баром, без таймаутов. Сравните: обычная форма загрузки 200 МБ может вылететь с ошибкой 413 через 30 секунд; с chunked upload — стабильная передача с возобновлением при сбое.

Характеристика Стандартный upload Chunked upload
Макс. размер файла ~20 МБ (лимит PHP) до 2 ГБ
Прогресс нет да, по чанкам
Возобновление при прерывании нет да, с последнего чанка
Нагрузка на память высокая низкая
Пример реализации ChunkedUploader
class ChunkedUploader { constructor(file, options = {}) { this.file = file; this.chunkSize = options.chunkSize || 5 * 1024 * 1024; // 5 MB this.onProgress = options.onProgress || (() => {}); this.uploadId = null; } async upload() { // Инициализируем multipart upload const initRes = await fetch('/local/api/upload-init.php', { method: 'POST', body: JSON.stringify({ filename : this.file.name, size : this.file.size, mime : this.file.type, sessid : BX.bitrix_sessid(), }), headers: { 'Content-Type': 'application/json' }, }); const { upload_id } = await initRes.json(); this.uploadId = upload_id; const totalChunks = Math.ceil(this.file.size / this.chunkSize); for (let i = 0; i < totalChunks; i++) { const start = i * this.chunkSize; const end = Math.min(start + this.chunkSize, this.file.size); const chunk = this.file.slice(start, end); const formData = new FormData(); formData.append('upload_id', this.uploadId); formData.append('chunk_index', i); formData.append('total_chunks', totalChunks); formData.append('chunk', chunk); await fetch('/local/api/upload-chunk.php', { method: 'POST', body: formData, }); this.onProgress(Math.round((i + 1) / totalChunks * 100)); } // Финализируем const finalRes = await fetch('/local/api/upload-finalize.php', { method: 'POST', body: JSON.stringify({ upload_id: this.uploadId }), headers: { 'Content-Type': 'application/json' }, }); return finalRes.json(); // { file_id, name, size, ... } } } 

Почему валидация MIME-типа критична?

Загрузка исполняемых файлов может привести к инъекциям на сервер. Проверяем MIME-тип через библиотеку finfo, а не только расширение. Это защищает от атак типа double extension (.jpg.exe). В паре с ClamAV вы получаете антивирусную проверку каждого файла без увеличения времени обработки более чем на 1.5 секунды. Снижение операционных расходов до 40% за счёт автоматизации проверок.

Метод валидации Надёжность Скорость
Только расширение низкая высокая
MIME через finfo высокая средняя
MIME + ClamAV максимальная чуть ниже

Как устроена архитектура загрузки?

Для форм с файлами используем двухэтапный процесс:

  1. Файл загружается отдельным AJAX-запросом ещё до отправки формы. Возвращается временный file_id.
  2. При финальной отправке формы передаются только file_id-шники, не сами файлы.

Это избавляет от таймаутов при загрузке больших файлов и позволяет показывать прогресс загрузки независимо для каждого файла. Согласно документации 1С-Битрикс, CFile::SaveFile() возвращает ID загруженного файла и записывает его в таблицу b_file.

Что входит в разработку формы загрузки?

  • Компонент local:file.upload с drag-and-drop зоной и превью изображений
  • Серверный обработчик загрузки: валидация типов через finfo, CSRF, rate limit
  • Сохранение через CFile::SaveFile() в таблицу b_file
  • Chunked upload для файлов > 10 МБ (опционально)
  • Пользовательское поле UF_ATTACHMENTS (FILE, MULTIPLE) в CRM
  • Привязка загруженных файлов к созданному лиду
  • Уведомление менеджеру с прямыми ссылками на вложения
  • Документация по эксплуатации, передача доступов, настройка прав

Процесс работы

  1. Аналитика: изучаем сценарий — какие файлы, куда прикрепляются, нужна ли интеграция с CRM.
  2. Проектирование: выбираем метод хранения (пользовательское поле, активность), определяем лимиты.
  3. Реализация: пишем компонент, серверные обработчики, API-эндпоинты.
  4. Тестирование: проверяем загрузку разных типов, размеров, безопасность.
  5. Деплой и обучение: разворачиваем на боевом сервере, обучаем менеджеров.

Сроки ориентировочно

Базовая форма с одним вложением — 3–5 дней. Полная версия с drag-and-drop, превью, chunked upload и интеграцией CRM — 2–3 недели. Стоимость рассчитывается индивидуально — оценим ваш проект после брифа. Закажите консультацию — мы подготовим предложение под ваш бюджет.

Почему стоит выбрать нас?

  • Опыт работы с 1С-Битрикс и Битрикс24 — более 10 лет.
  • Выполнили 50+ проектов по кастомным формам и интеграциям.
  • Каждый модуль проходит код-ревью и нагрузочное тестирование.
  • Сертифицированные специалисты по Битрикс и Битрикс24.

Свяжитесь с нами для консультации без обязательств. Закажите индивидуальный расчёт стоимости.