Работа в веб-клиенте накладывает определенные ограничения на взаимодействие с файловой системой пользователя. Долгое время стандартом была установка расширения для работы с файлами, однако современные требования безопасности и развитие браузерных технологий (HTML5) привели к тому, что платформа 1С, начиная с версии 8.3.15, предлагает бескомпонентные методы. Разберем подробно, как реализовать передачу файла на сервер так, чтобы это работало в любом современном браузере без лишних надстроек.
Главное отличие современных методов от старых (таких как ПоместитьФайл) — их асинхронность. В веб-клиенте браузер не может «замереть» и ждать, пока пользователь выберет файл. Программа должна «попросить» браузер открыть диалог и «пообещать», что она обработает результат позже. Для этого используется механизм оповещений (callback).
Основным инструментом для нашей задачи является метод НачатьПомещениеФайлаНаСервер(). Рассмотрим его синтаксис и практическое применение.
Для начала создадим процедуру, которая будет инициировать выбор файла. Мы будем использовать объект ОписаниеОповещения, чтобы указать системе, какую процедуру вызвать после того, как файл будет выбран и загружен во временное хранилище.
&НаКлиенте
Процедура ЗагрузитьФайлНаСервер(Команда)
// Описываем процедуру, которая выполнится после выбора файла
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайлаЗавершение", ЭтаФорма);
// Параметры метода:
// 1. Оповещение о завершении
// 2. Уникальный идентификатор формы (для очистки хранилища)
// 3. Адрес во временном хранилище (если пустой, 1С создаст новый)
// 4. Параметры помещения (можно настроить интерактивность)
НачатьПомещениеФайлаНаСервер(Оповещение, , , , УникальныйИдентификатор);
КонецПроцедуры
Теперь проанализируем процедуру завершения. Важно понимать, что в момент вызова этой процедуры файл уже находится на сервере во временном хранилище. Нам остается только получить его адрес.
&НаКлиенте
Процедура ОбработатьВыборФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Или Результат = Ложь Тогда
// Пользователь отменил выбор
Возврат;
КонецЕсли;
// Сохраняем имя файла в реквизит объекта для красоты
Объект.ИмяФайла = ВыбранноеИмяФайла;
// Теперь вызываем серверную процедуру для обработки полученных данных
ОбработатьФайлНаСервере(Адрес);
КонецПроцедуры
На сервере мы извлекаем двоичные данные из временного хранилища по адресу, который передал нам веб-клиент. Выясним, как правильно работать с этими данными, чтобы извлечь из них пользу (например, прочитать текст или сохранить в базу).
&НаСервере
Процедура ОбработатьФайлНаСервере(Адрес)
// Получаем двоичные данные из хранилища
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Если ДвоичныеДанные <> Неопределено Тогда
// Если нужно сохранить файл во временную папку на сервере для обработки
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Здесь выполняется логика обработки (например, парсинг PDF)
// ...
// Не забываем удалять временные файлы после использования
УдалитьФайлы(ИмяВременногоФайла);
КонецЕсли;
КонецПроцедуры
При переносе кода из старых конфигураций на обычных формах в управляемые формы часто возникает ситуация, когда процедура вроде бы написана правильно, но она не вызывается. Рассмотрим причину, упомянутую опытными разработчиками: процедуры событий должны быть жестко привязаны в свойствах формы.
Если вы просто скопируете текст процедуры ПриЗаписиНаСервере в модуль, она не заработает автоматически (в отличие от старых версий 1С 7.7). Вам необходимо:
ПриЗаписиНаСервере).Если ваша задача подразумевает сложную обработку (например, конвертацию PDF в Excel, как обсуждалось в теме), веб-клиент может столкнуться с проблемой таймаута. Браузер решит, что страница зависла, и предложит её закрыть. Проанализируем решение через фоновые задания.
Вместо того чтобы выполнять обработку прямо в серверном вызове, который «держит» клиент, мы запускаем фоновый процесс:
ФоновыеЗадания.Выполнить() и возвращает клиенту идентификатор задания.ПодключитьОбработчикОжидания), который раз в несколько секунд спрашивает сервер: «Готово?».Для запуска произвольных методов конфигурации в фоновом режиме часто используется вспомогательная функция, аналогичная ОбщегоНазначения.ВыполнитьМетодКонфигурации:
Процедура ВыполнитьМетодКонфигурации(Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт
// Формируем строку параметров для оператора Выполнить
ПараметрыСтрока = "";
Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда
Для Индекс = 0 По Параметры.ВГраница() Цикл
ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],";
КонецЦикла;
ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);
КонецЕсли;
// Динамический вызов метода
Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
КонецПроцедуры
Использование метода НачатьПомещениеФайлаНаСервер — это современный и правильный способ работы в веб-клиенте 1С. Это избавляет пользователей от необходимости настройки политик безопасности браузера и установки дополнительных компонентов. Помните о необходимости асинхронного мышления: всегда разделяйте процесс на инициализацию (вызов диалога), ожидание (callback) и последующую обработку данных на сервере.