Работа с файлами в веб-клиенте 1С существенно отличается от работы в толстом клиенте. Многие начинающие разработчики сталкиваются с тем, что привычный код, успешно работающий на локальной машине, вызывает ошибки в браузере. Давайте разберем, почему это происходит и как построить процесс работы с файлами правильно. Дополнительно изучить особенности клиент-серверного взаимодействия поможет руководство по работе с файлами в управляемых формах 1С 8.3.
Основная причина заключается в архитектуре веб-клиента. В обычном приложении у нас есть прямой доступ к файловой системе компьютера. Однако в браузере действует строгая политика безопасности. Браузеры запрещают выполнение синхронных методов (таких как ДиалогВыбораФайла.Выбрать()), потому что они «замораживают» интерфейс страницы, пока пользователь не выберет файл. Если бы такой код работал, весь веб-клиент перестал бы отвечать на действия пользователя до завершения операции.
Поэтому в веб-клиенте нам доступны только асинхронные методы. Они не возвращают результат немедленно, а «обещают» выполнить действие и вызвать процедуру-обработчик (оповещение) после того, как пользователь завершит взаимодействие.
Чтобы получить файл, нам нужно инициировать диалог выбора файла асинхронно. Вместо простого вызова метода, мы используем механизм оповещений. Рассмотрим пример реализации:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
// Создаем описание оповещения, которое сработает после выбора файла
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма);
// Запускаем асинхронный диалог
Режим = РежимДиалогаВыбораФайла.Открытие;
Диалог = Новый ДиалогВыбораФайла(Режим);
Диалог.Заголовок = "Выберите файл для загрузки";
Диалог.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx";
Диалог.Показать(Оповещение);
КонецПроцедуры
После того как пользователь выберет файл, управление будет передано в процедуру, которую мы указали в ОписаниеОповещения.
В процедуре-обработчике мы получаем массив выбранных файлов. Теперь, чтобы работать с содержимым файла на сервере, нам нужно поместить его во временное хранилище. Для этого в веб-клиенте используется асинхронное помещение файла на сервер. Подобный подход позволяет корректно настроить, например, загрузку отчётов о продажах маркетплейсов в БП 3 из Excel при запуске базы через веб-интерфейс.
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // Пользователь отменил выбор
КонецЕсли;
// Получаем путь к локальному файлу
ИмяФайла = ВыбранныеФайлы[0];
// Создаем оповещение для завершения загрузки файла на сервер
ОповещениеОЗагрузке = Новый ОписаниеОповещения("ПослеПомещенияФайлаНаСервер", ЭтаФорма);
// Асинхронно помещаем файл во временное хранилище
НачатьПомещениеФайла(ОповещениеОЗагрузке, , ИмяФайла, Истина);
КонецПроцедуры
После вызова НачатьПомещениеФайла и успешной загрузки, сработает процедура ПослеПомещенияФайлаНаСервер. В ней мы получим адрес файла во временном хранилище. Этот адрес можно смело передавать в серверную процедуру для чтения данных.
&НаКлиенте
Процедура ПослеПомещенияФайлаНаСервер(ОписаниеПомещения, ДополнительныеПараметры) Экспорт
Если ОписаниеПомещения = Неопределено Тогда
Сообщить("Ошибка при загрузке файла!");
Возврат;
КонецЕсли;
// Вызываем серверный метод и передаем адрес временного хранилища
ОбработатьФайлНаСервере(ОписаниеПомещения.Адрес);
КонецПроцедуры
&НаСервере
Процедура ОбработатьФайлНаСервере(АдресВоВременномХранилище)
// Получаем двоичные данные
Данные = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
// Дальнейшая логика чтения файла...
КонецПроцедуры
КаталогВременныхФайлов на клиенте: Браузер не даст вам доступа к системным папкам пользователя. Всегда работайте через временное хранилище (ПоместитьВоВременноеХранилище).ТабличныйДокумент.Прочитать() для файлов формата .xls или .xlsx требуют наличия компонентов для работы с форматом на сервере. В облачных конфигурациях или на серверах Linux часто нет установленного Microsoft Excel, поэтому лучше использовать встроенные средства чтения XML-структуры файлов или специализированные библиотеки.ОписаниеОповещения.Следуя этим шагам, вы сможете реализовать надежную загрузку файлов, которая будет корректно работать как в веб-клиенте, так и в обычном тонком клиенте.