В процессе разработки на платформе 1С:Предприятие 8.3 (особенно в конфигурациях на управляемых формах, таких как УТ 11, ERP или КА 2) часто возникает задача: файл уже загружен во временное хранилище, его адрес получен, и теперь нужно предоставить пользователю возможность просмотреть этот файл. Рассмотрим подробнее, как это реализовать максимально эффективно и правильно с точки зрения архитектуры системы.
Проанализируем базовый алгоритм, который использовался программистами долгие годы. Суть его заключается в извлечении бинарных данных из хранилища, записи их на диск локального компьютера и последующем открытии через операционную систему. Если вам требуется не просто открыть один файл, а реализовать копирование файлов и каталогов между Клиентом и Сервером, данный подход ложится в основу таких механизмов.
Разберем по шагам, как это выглядит в коде:
// Пример на стороне клиента
&НаКлиенте
Процедура ОткрытьФайлИзХранилища(АдресХранилища, ИмяФайлаСРасширением)
// Получаем двоичные данные из хранилища (вызов сервера)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
// Формируем путь во временном каталоге пользователя
ПутьКФайлу = КаталогВременныхФайлов() + ИмяФайлаСРасширением;
// Записываем данные на диск
ДвоичныеДанные.Записать(ПутьКФайлу);
// Открываем файл средствами ОС
ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры
Важный нюанс: Чтобы метод ЗапуститьПриложение сработал корректно, операционная система должна знать, какой программой открывать файл. Поэтому крайне важно передавать корректное расширение (например, .pdf, .xlsx или .jpg). Для специфических задач, таких как работа с PDF файлами без внешних компонентов (преобразование в картинки, масштабирование), могут потребоваться дополнительные манипуляции с данными перед открытием.
Начиная с версии платформы 8.3.15, разработчики получили более изящный инструмент. Вместо ручного управления записью файлов, мы можем использовать метод ПолучитьФайлССервера. Выясним причину, почему это лучше: данный метод берет на себя взаимодействие с браузером (в случае веб-клиента) и упрощает код. Это особенно удобно, когда реализовано отображение прикрепленных файлов (pdf, png, jpg) в списках документов, где пользователю нужно быстро просмотреть вложение одним кликом.
Проанализируем использование этого метода. Он позволяет не только скачать файл, но и сразу предложить пользователю его открыть, используя параметры интерактивного взаимодействия.
&НаКлиенте
Процедура ОткрытьФайлСовременно(АдресХранилища, ИмяФайла)
ПараметрыФайла = Новый ПараметрыПолученияФайлаССервера;
ПараметрыФайла.Заголовок = "Открытие документа";
// Указываем, что файл нужно открыть сразу после получения
ПараметрыИнтерактивногоВзаимодействия = Новый ПараметрыИнтерактивногоВзаимодействияПриПолученииФайлов;
ПараметрыИнтерактивногоВзаимодействия.СпособПолученияФайлов = СпособПолученияФайловССервера.Открыть;
ПолучитьФайлССервера(АдресХранилища, ИмяФайла, ПараметрыФайла, ПараметрыИнтерактивногоВзаимодействия);
КонецПроцедуры
В веб-клиенте такой подход инициирует стандартную загрузку файла браузером, что избавляет разработчика от проблем с правами доступа к локальной файловой системе пользователя.
Если вы работаете в УТ 11, то в вашей конфигурации уже есть мощная подсистема "Присоединенные файлы". Использовать "велосипеды" в данном случае — не лучшее решение. К тому же, штатные средства позволяют выполнять анализ прикрепленных файлов для контроля того, кто и когда вносил изменения или захватывал файл для редактирования.
Для того чтобы ваш документ из расширения начал работать с файлами БСП, выполните следующие действия:
ВладелецПрисоединенныхФайлов.ВашДокументПрисоединенныеФайлы) по образцу существующих в системе. Если вам нужна массовая загрузка и выгрузка картинок из базы на основе БСП, лучше использовать универсальные механизмы сопоставления.ПрисоединенныеФайлыПереопределяемый укажите связь вашего документа с созданным справочником.После этого вы сможете вызывать стандартные команды открытия файлов:
ДД = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл);
// Далее используем стандартные процедуры БСП для открытия
РаботаСФайламиКлиент.ОткрытьФайл(ПараметрыФайла);
Одной из самых частых ошибок является ситуация, когда временное хранилище "протухает" (данные исчезают). Посмотрим на причину этой проблемы: данные во временном хранилище живут только до тех пор, пока длится серверный вызов, если они не привязаны к конкретной форме.
Решение: При помещении файла в хранилище (ПоместитьВоВременноеХранилище), вторым параметром всегда передавайте УникальныйИдентификатор вашей управляемой формы. В этом случае данные будут доступны пользователю всё время, пока открыто окно этого документа.
// Правильное помещение в хранилище в модуле формы
Адрес = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
Если вы забудете передать идентификатор формы, то при попытке выполнить ПолучитьИзВременногоХранилища при нажатии на кнопку вы получите Неопределено, так как данные будут очищены платформой сразу после завершения процедуры загрузки.
Если ваша конфигурация используется на мобильных устройствах, стандартный ЗапуститьПриложение может не сработать. В этом случае мы рекомендуем использовать специализированные средства мобильной платформы:
&НаКлиенте
Процедура ОткрытьНаМобильном(АдресХранилища, ИмяФайла)
// Специальный метод для мобильных ОС
СредстваМультимедиа.ОткрытьДокумент(АдресХранилища);
КонецПроцедуры
Этот метод автоматически вызовет системное меню "Открыть с помощью..." на Android или iOS, предложив пользователю подходящие приложения для просмотра файла.
При работе с временными файлами не забывайте о гигиене файловой системы. Если вы сохраняли файл вручную через ДвоичныеДанные.Записать(), хорошей практикой считается удаление этого файла после использования. Однако помните, что вы не сможете удалить файл, пока он открыт во внешнем приложении (например, в Excel). Платформа 1С обычно очищает КаталогВременныхФайлов() при закрытии сеанса, но для высоконагруженных систем ручной контроль лишним не будет.
Подведем итог: для простых задач используйте ПолучитьФайлССервера, а для серьезных корпоративных решений всегда делайте выбор в пользу БСП, так как это обеспечит единообразие интерфейса и надежность хранения данных.