Как передать файл на сервер в веб-клиенте 1С 8.3 без использования расширения браузера

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

Работа в веб-клиенте накладывает определенные ограничения на взаимодействие с файловой системой пользователя. Долгое время стандартом была установка расширения для работы с файлами, однако современные требования безопасности и развитие браузерных технологий (HTML5) привели к тому, что платформа 1С, начиная с версии 8.3.15, предлагает бескомпонентные методы. Разберем подробно, как реализовать передачу файла на сервер так, чтобы это работало в любом современном браузере без лишних надстроек.

Переход к асинхронной модели работы

Главное отличие современных методов от старых (таких как ПоместитьФайл) — их асинхронность. В веб-клиенте браузер не может «замереть» и ждать, пока пользователь выберет файл. Программа должна «попросить» браузер открыть диалог и «пообещать», что она обработает результат позже. Для этого используется механизм оповещений (callback).

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

Реализация выбора и загрузки файла на клиенте

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


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

КонецПроцедуры

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


&НаКлиенте
Процедура ОбработатьВыборФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

    Если Результат = Неопределено Или Результат = Ложь Тогда
        // Пользователь отменил выбор
        Возврат;
    КонецЕсли;

    // Сохраняем имя файла в реквизит объекта для красоты
    Объект.ИмяФайла = ВыбранноеИмяФайла;
    
    // Теперь вызываем серверную процедуру для обработки полученных данных
    ОбработатьФайлНаСервере(Адрес);

КонецПроцедуры

Обработка файла на стороне сервера

На сервере мы извлекаем двоичные данные из временного хранилища по адресу, который передал нам веб-клиент. Выясним, как правильно работать с этими данными, чтобы извлечь из них пользу (например, прочитать текст или сохранить в базу).


&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
    
    // Получаем двоичные данные из хранилища
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    
    Если ДвоичныеДанные <> Неопределено Тогда
        
        // Если нужно сохранить файл во временную папку на сервере для обработки
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
        ДвоичныеДанные.Записать(ИмяВременногоФайла);
        
        // Здесь выполняется логика обработки (например, парсинг PDF)
        // ...
        
        // Не забываем удалять временные файлы после использования
        УдалитьФайлы(ИмяВременногоФайла);
        
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: привязка событий формы

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

Если вы просто скопируете текст процедуры ПриЗаписиНаСервере в модуль, она не заработает автоматически (в отличие от старых версий 1С 7.7). Вам необходимо:

  1. Открыть форму в конфигураторе.
  2. Перейти в палитру свойств формы (или конкретного элемента).
  3. Найти нужное событие (например, ПриЗаписиНаСервере).
  4. Нажать на «лупу» и выбрать вашу процедуру из списка.

Борьба с «зависанием» браузера при долгой обработке

Если ваша задача подразумевает сложную обработку (например, конвертацию PDF в Excel, как обсуждалось в теме), веб-клиент может столкнуться с проблемой таймаута. Браузер решит, что страница зависла, и предложит её закрыть. Проанализируем решение через фоновые задания.

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

  1. Клиент загружает файл и передает адрес на сервер.
  2. Сервер запускает ФоновыеЗадания.Выполнить() и возвращает клиенту идентификатор задания.
  3. Клиент запускает обработчик ожидания (ПодключитьОбработчикОжидания), который раз в несколько секунд спрашивает сервер: «Готово?».
  4. Как только задание завершено, сервер передает результат обратно, а клиент выводит его пользователю.

Для запуска произвольных методов конфигурации в фоновом режиме часто используется вспомогательная функция, аналогичная ОбщегоНазначения.ВыполнитьМетодКонфигурации:


Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт
    // Формируем строку параметров для оператора Выполнить
    ПараметрыСтрока = "";
    Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда
        Для Индекс = 0 По Параметры.ВГраница() Цикл 
            ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],";
        КонецЦикла;
        ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);
    КонецЕсли;
    
    // Динамический вызов метода
    Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
КонецПроцедуры

Заключение

Использование метода НачатьПомещениеФайлаНаСервер — это современный и правильный способ работы в веб-клиенте 1С. Это избавляет пользователей от необходимости настройки политик безопасности браузера и установки дополнительных компонентов. Помните о необходимости асинхронного мышления: всегда разделяйте процесс на инициализацию (вызов диалога), ожидание (callback) и последующую обработку данных на сервере.

← На главную