Как организовать асинхронную передачу и обработку файла между клиентом и сервером в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современной разработке на платформе 1С:Предприятие 8.3 асинхронная работа с файлами стала стандартом. Это необходимо для того, чтобы интерфейс программы не «замирал» во время передачи больших объемов данных или длительной обработки на стороне сервера. Разберем подробно, как правильно реализовать цепочку: выбор файла на клиенте — асинхронная загрузка — серверная обработка — получение результата.

Эволюция методов: НачатьПомещениеФайла vs НачатьПомещениеФайлаНаСервер

Проанализируем инструменты, которые предоставляет нам платформа. До версии 8.3.15 основным инструментом был метод НачатьПомещениеФайла. Однако, начиная с релиза 8.3.15, появился более оптимизированный метод — НачатьПомещениеФайлаНаСервер.

Основное различие заключается в том, что НачатьПомещениеФайлаНаСервер специально спроектирован для клиент-серверной архитектуры. Он позволяет поместить файл во временное хранилище за один программный шаг, минимизируя количество обращений между клиентом и сервером. Если в вашей базе установлен режим совместимости ниже 8.3.15, этот метод будет недоступен, и придется использовать классический НачатьПомещениеФайла.

Реализация асинхронной загрузки через ОписаниеОповещения

Рассмотрим по шагам процесс использования метода НачатьПомещениеФайлаНаСервер. Основная идея заключается в том, что мы не ждем завершения загрузки в текущем потоке кода, а передаем управление платформе, указав процедуру, которую нужно вызвать по окончании процесса.

Для этого используется объект ОписаниеОповещения. Посмотрим на пример кода на стороне клиента:


&НаКлиенте
Процедура ВыбратьИОтправитьФайл(Команда)
    
    // Подготавливаем описание оповещения, которое сработает после загрузки
    Оповещение = Новый ОписаниеОповещения("ПослеЗагрузкиФайла", ЭтотОбъект);
    
    // Параметры диалога выбора файла
    ПараметрыЗагрузки = Новый ПараметрыПомещенияФайлаНаСервер;
    ПараметрыЗагрузки.Интерактивно = Истина;
    ПараметрыЗагрузки.Заголовок = "Выберите текстовый файл для обработки";
    
    // Запускаем процесс асинхронно
    НачатьПомещениеФайлаНаСервер(Оповещение, , , , ПараметрыЗагрузки, УникальныйИдентификатор);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗагрузкиФайла(РезультатПомещения, ДополнительныеПараметры) Экспорт
    
    Если РезультатПомещения <> Неопределено Тогда
        // Файл успешно загружен во временное хранилище
        АдресФайла = РезультатПомещения.Адрес;
        Сообщить("Файл загружен по адресу: " + АдресФайла);
        
        // Теперь вызываем серверный метод для обработки
        ОбработатьФайлНаСервере(АдресФайла);
    КонецЕсли;
    
КонецПроцедуры

Проблема «зависания» интерфейса при обработке

Многие разработчики сталкиваются с ситуацией, когда сама загрузка файла проходит «красиво» (асинхронно), но как только вызывается серверная процедура ОбработатьФайлНаСервере(АдресФайла), интерфейс пользователя все равно блокируется до окончания обработки. Это происходит потому, что обычный серверный вызов из контекста формы является синхронным.

Чтобы избежать этой проблемы, выясним, как правильно организовать длительную обработку. Лучшим решением здесь будет использование фоновых заданий.

Использование фоновых заданий для обработки файла

Вместо прямого вызова процедуры, которая читает файл, мы запустим фоновое задание. Это позволит пользователю продолжать работу с формой, пока сервер анализирует данные.

  1. Клиент загружает файл во временное хранилище и получает Адрес.
  2. Клиент вызывает серверный метод, который запускает ФоновыеЗадания.Выполнить.
  3. Серверный метод возвращает идентификатор задания.
  4. На клиенте подключается ОбработчикОжидания, который периодически проверяет статус задания.

Если в вашей конфигурации используется БСП (Библиотека стандартных подсистем), всё упрощается. Вы можете использовать функции модуля ДлительныеОперации. Это «сахар» над механизмом фоновых заданий, который берет на себя всю рутину по проверке статуса и визуализации процесса загрузки.

Пример использования БСП для таких задач:


// На клиенте
ПараметрыВыполнения = ДлительныеОперацииКлиент.ПараметрыВыполнения(ЭтотОбъект);
ПараметрыВыполнения.ВыводитьПрогрессВыполнения = Истина;

Результат = ДлительныеОперацииКлиент.ВыполнитьПроцедуру(ОповещениеЗавершения, 
    "ИмяВашегоСерверногоМодуля.ОбработатьФайл", ПараметрыПроцедуры, ПараметрыВыполнения);

Нюансы работы с временным хранилищем

Проанализируем важный аспект: время жизни данных. При использовании НачатьПомещениеФайлаНаСервер, если вы передаете УникальныйИдентификатор формы, файл будет автоматически удален из временного хранилища при закрытии этой формы. Это критически важно для предотвращения утечек памяти на сервере приложений 1С.

Также помните, что если обработка файла происходит в фоновом задании, адрес временного хранилища должен быть доступен для этого задания. В платформе 8.3 адрес, созданный в сеансе пользователя, по умолчанию доступен в фоновом задании, запущенном из этого же сеанса.

Альтернативный подход: когда файл не нужен

Иногда задача «передать файл для обработки» может быть решена эффективнее. Например, если вам нужно получить данные из Active Directory (LDAP), как в примере автора темы, создавать файл net user > file.txt на клиенте и передавать его на сервер — не самый оптимальный путь.

Рассмотрим вариант выполнения этой задачи целиком на сервере:

Это полностью исключит стадию передачи файла и сделает работу системы быстрее и надежнее.

Подведение итогов

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

  1. Проверьте режим совместимости платформы (для использования НачатьПомещениеФайлаНаСервер нужен 8.3.15+).
  2. Используйте ОписаниеОповещения для обработки результата загрузки в отдельной процедуре.
  3. Если обработка файла на сервере занимает более 1–2 секунд, обязательно выносите её в фоновое задание (самостоятельно или через механизмы БСП).
  4. Всегда связывайте временное хранилище с уникальным идентификатором формы для автоматической очистки данных.

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

← На главную