В процессе разработки обработок для выгрузки присоединенных файлов пользователи часто сталкиваются с техническими трудностями. Основная проблема заключается в попытках прямого обращения к файловой системе сервера, на котором расположены файлы (особенно если они хранятся в томах на диске). В данной статье мы разберем, почему возникают ошибки и как правильно реализовать процесс получения файлов с использованием стандартных инструментов платформы и Библиотеки Стандартных Подсистем (БСП).
Чаще всего ошибки типа «Файл не найден» или «Значение данного типа невозможно преобразовать» возникают из-за непонимания архитектуры клиент-серверного взаимодействия. Рассмотрим ключевые причины:
Новый ДвоичныеДанные(Путь) на клиенте, программа пытается найти файл на компьютере пользователя, а не на сервере. При этом серверные пути для клиента недоступны.ПоместитьВоВременноеХранилище требует корректной передачи адреса между сервером и клиентом. Если между помещением данных и обращением к ним происходит задержка, адрес становится недействительным.Чтобы избежать ошибок, необходимо использовать функционал РаботаСФайлами, который предоставляет БСП. Этот подход универсален и работает независимо от того, где физически хранится файл (в информационной базе или в томе на диске).
В первую очередь, на сервере необходимо получить двоичные данные присоединенного файла. Для этого используем методы типовой конфигурации. Это позволит системе самостоятельно определить, откуда именно нужно считать байты.
// Пример получения двоичных данных на сервере
Функция ПолучитьДвоичныеДанныеНаСервере(СсылкаНаФайл)
// Метод БСП для получения данных
Возврат РаботаСФайлами.ПолучитьДвоичныеДанныеФайла(СсылкаНаФайл);
КонецФункции
После получения двоичных данных их нужно передать на клиент. Прямая передача больших объемов данных не рекомендуется, поэтому мы используем ПоместитьВоВременноеХранилище.
// Пример помещения во временное хранилище
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
На клиенте, получив адрес из временного хранилища, мы вызываем процедуру ПолучитьФайл. Она корректно инициирует процесс скачивания файла на локальный компьютер пользователя.
// Пример скачивания на клиенте
Процедура ЗавершитьВыгрузку(Адрес, ИмяФайла)
ПолучитьФайл(Адрес, ИмяФайла, Истина);
КонецПроцедуры
Если вам необходимо выгрузить множество файлов, не используйте цикличные вызовы НачатьПолучениеФайлаССервера, так как это может перегрузить сеанс и привести к потере связи с временным хранилищем. Вместо этого:
ПолучитьФайлы, если вы хотите выполнить операцию синхронно, или НачатьПолучениеФайлов для асинхронного выполнения в интерфейсе.ПрисоединенныеФайлы, такие как Наименование и Расширение, чтобы исключить ошибки формирования имен вручную.Следуя этим правилам и используя методы РаботаСФайлами, вы сделаете свою обработку надежной и соответствующей стандартам разработки 1С. Помните, что архитектура БСП создана для того, чтобы максимально абстрагировать разработчика от особенностей хранения файлов, поэтому использование стандартных процедур является единственно верным путем.