Долгое время работа с файловой системой в веб-клиенте 1С была сопряжена с необходимостью установки специального расширения браузера. Это создавало дополнительные сложности для конечных пользователей, особенно в закрытых корпоративных средах или при работе на мобильных устройствах. Однако, начиная с версии платформы 8.3.15, фирма «1С» кардинально пересмотрела механизмы взаимодействия с файлами. В этой статье мы подробно разберем, как программно реализовать загрузку файлов, используя современные асинхронные методы, которые работают «из коробки» в любом современном браузере.
Проанализируем ситуацию: почему раньше требовалось расширение? Браузеры работают в режиме «песочницы» для обеспечения безопасности, ограничивая прямой доступ к дисковой подсистеме. Раньше 1С использовала синхронные методы, которые конфликтовали с этой моделью. С выходом обновленных версий платформы произошла унификация: теперь методы работы в тонком и веб-клиенте практически идентичны. Главный секрет заключается в использовании асинхронных вызовов, которые позволяют платформе взаимодействовать со стандартными API браузера (HTML5 File API) напрямую (также доступно управление WebSocket-соединениями).
Рассмотрим пример кода, который часто встречается в старых проектах и на форумах. Этот метод был промежуточным этапом в развитии платформы. Он позволяет вызвать стандартный диалог выбора файла и поместить его во временное хранилище (например, чтобы перевернуть картинку в правильную ориентацию после загрузки).
Разберем по шагам реализацию через НачатьПомещениеФайла:
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
// Создаем объект диалога выбора файла
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл для загрузки в систему";
// Подготавливаем описание оповещения, которое сработает после выбора файла
ОбработкаОкончанияЗагрузки = Новый ОписаниеОповещения("Обработчик_Завершения_Загрузки", ЭтотОбъект, Диалог);
// Вызываем асинхронный метод помещения файла
НачатьПомещениеФайла(ОбработкаОкончанияЗагрузки, , Диалог, Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура Обработчик_Завершения_Загрузки(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
// Файл успешно помещен во временное хранилище
// Здесь можно вызвать серверную процедуру для обработки данных по адресу
Сообщить("Файл успешно загружен: " + ВыбранноеИмяФайла);
Сообщить("Адрес во временном хранилище: " + Адрес);
Иначе
Сообщить("Загрузка файла была отменена пользователем.");
КонецЕсли;
КонецПроцедуры
Важно отметить, что метод НачатьПомещениеФайла помечен как устаревший (deprecated) начиная с версии 8.3.15. Несмотря на то, что он продолжает работать в веб-клиенте без расширений, для новых разработок (таких как импорт данных из Excel) рекомендуется использовать более современные инструменты.
Выясним причину, по которой стоит перейти на НачатьПомещениеФайловНаСервер. Этот метод более универсален: он поддерживает множественный выбор файлов и лучше оптимизирован для работы в асинхронной среде. Рассмотрим, как выглядит современный подход к загрузке.
Проанализируем пример реализации:
&НаКлиенте
Процедура ЗагрузитьФайлыСовременно(Команда)
// Описание параметров для передачи файлов
ПараметрыЗагрузки = Новый ПараметрыПомещенияФайловНаСервер;
ПараметрыЗагрузки.Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ПараметрыЗагрузки.Диалог.МножественныйВыбор = Ложь; // Или Истина, если нужно несколько
ОповещениеЗавершения = Новый ОписаниеОповещения("ПослеЗагрузкиФайлов", ЭтотОбъект);
// Вызываем метод. Если массив описаний пуст, 1С сама откроет диалог
НачатьПомещениеФайловНаСервер(ОповещениеЗавершения, , , , ПараметрыЗагрузки.Диалог, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗагрузкиФайлов(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Результат содержит массив объектов ОписаниеПомещенногоФайла
Для Каждого Файл Из Результат Цикл
Сообщить("Файл: " + Файл.Имя + " доступен по адресу: " + Файл.Адрес);
// Далее передаем адрес на сервер для обработки
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Преимущества этого метода (через который также возможен экспорт печатных форм в растровое и векторное изображения):
Современный веб-клиент 1С поддерживает также перетаскивание файлов прямо в форму. Это особенно удобно для пользователей. Посмотрим, как это настроить. Для реализации перетаскивания нам необходимо настроить обработчики событий формы ПроверкаПеретаскивания и ОкончаниеПеретаскивания.
В событии ПроверкаПеретаскивания мы должны указать платформе, что форма готова принять файл:
&НаКлиенте
Процедура ПриПроверкеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
КонецПроцедуры
А в событии ОкончаниеПеретаскивания мы получаем данные файла. Важно понимать, что в веб-клиенте без расширения параметры перетаскивания будут содержать объекты типа ОписаниеПередаваемогоФайла, которые нужно отправить на сервер асинхронно.
Несмотря на мощные возможности новых методов, разберем важные нюансы, которые необходимо учитывать разработчику:
НачатьПомещение..., не должен рассчитывать на то, что файл уже загружен. Основная логика обработки должна находиться внутри процедуры обратного вызова (callback).C:\Users\Documents\file.pdf). Это запрещено политикой безопасности браузеров. Вам доступно только имя файла и его двоичные данные во временном хранилище.Таким образом, мы видим, что современная платформа 1С предоставляет исчерпывающий набор инструментов для работы с файлами в браузере. Использование метода НачатьПомещениеФайловНаСервер совместно с объектом ОписаниеОповещения является «золотым стандартом» разработки, обеспечивающим стабильную работу приложения без установки сторонних компонентов.