При разработке под веб-клиент 1С разработчики часто сталкиваются с задачей выбора и обработки файлов. В тонком клиенте мы привыкли к тому, что ДиалогВыбораФайла возвращает нам полный путь к локальному файлу на компьютере пользователя, который мы затем передаем в методы вроде НачатьПомещениеФайлаНаСервер. Однако при попытке повторить этот сценарий в браузере возникает закономерный вопрос: как получить этот самый «полный путь»?
Для начала давайте проанализируем, почему это вызывает сложности. Веб-клиент 1С работает внутри браузера, который, в свою очередь, исполняется в «песочнице». Это необходимо для обеспечения безопасности данных пользователя. Если бы любой веб-сайт, включая ваше приложение 1С, мог свободно считывать структуру папок и пути к файлам на вашем диске, это создало бы критическую уязвимость.
Именно поэтому стандартные механизмы браузеров при выборе файла скрывают реальную файловую систему. Вместо настоящего пути, такого как C:\Users\Documents\data.xlsx, браузер предоставляет фиктивное значение C:\fakepath\data.xlsx. Это фундаментальное ограничение безопасности, которое невозможно обойти простым вызовом метода 1С.
Даже если бы мы смогли каким-то образом получить полный локальный путь к файлу на компьютере пользователя, это не помогло бы серверу 1С. Сервер обычно находится на другой машине или в облаке. Он физически не имеет доступа к локальному диску вашего клиента. Серверу 1С не нужен путь к файлу, ему нужен сам поток данных, который можно сохранить во временное хранилище или записать в базу данных.
Поскольку получить путь невозможно, нам необходимо пересмотреть логику взаимодействия пользователя с обработкой. Вместо того чтобы «выбрать файл, получить путь, сохранить путь, нажать кнопку», мы переходим к современной модели событийной обработки.
НачатьПомещениеФайла, который перекладывает ответственность за получение данных на браузер и платформу 1С.ВременномХранилище. Этот адрес — это именно то, что нам нужно для дальнейшей работы на сервере.Рассмотрим, как правильно организовать процесс загрузки. Мы не храним пути, мы храним ссылки на временные хранилища. Логика строится следующим образом:
Сначала мы вызываем диалог выбора файла. После того как пользователь выбрал файл, мы не сохраняем путь, а сразу инициируем процесс перемещения данных на сервер.
// Пример логики в модуле формы
&НаКлиенте
Процедура ВыбратьФайлНажатие(Элемент)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Результат Тогда
// Файл успешно помещен во временное хранилище
// Адрес — это путь к временному хранилищу, а не к файлу на диске
Объект.ПутьКФайлуНаСервере = Адрес;
Сообщить("Файл успешно загружен во временное хранилище: " + Адрес);
КонецЕсли;
КонецПроцедуры
Итак, мы выяснили, что требование получения полного пути к файлу в веб-клиенте является пережитком «толстых» архитектур. В современных веб-приложениях 1С сервер работает не с файлами на диске клиента, а с потоками данных, помещенными во временное хранилище. Переход на использование АдресВоВременномХранилище полностью решает проблему, делая приложение безопасным и удобным для конечного пользователя.
Если вы привыкли хранить пути к файлам в реквизитах формы, рекомендуем изменить логику: сохраняйте адрес временного хранилища. Это избавит вас от зависимости от расширения браузера и сделает ваше решение соответствующим текущим стандартам разработки 1С.