Как открыть файл из временного хранилища в 1С:Предприятие 8.3

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 (особенно в конфигурациях на управляемых формах, таких как УТ 11, ERP или КА 2) часто возникает задача: файл уже загружен во временное хранилище, его адрес получен, и теперь нужно предоставить пользователю возможность просмотреть этот файл. Рассмотрим подробнее, как это реализовать максимально эффективно и правильно с точки зрения архитектуры системы.

Метод 1: Классический способ (Сохранение во временный файл)

Проанализируем базовый алгоритм, который использовался программистами долгие годы. Суть его заключается в извлечении бинарных данных из хранилища, записи их на диск локального компьютера и последующем открытии через операционную систему. Если вам требуется не просто открыть один файл, а реализовать копирование файлов и каталогов между Клиентом и Сервером, данный подход ложится в основу таких механизмов.

Разберем по шагам, как это выглядит в коде:

  1. Получаем данные из временного хранилища на стороне сервера.
  2. Передаем эти данные на клиент.
  3. Создаем путь к временному файлу, обязательно указывая правильное расширение.
  4. Записываем данные и вызываем команду открытия.

// Пример на стороне клиента
&НаКлиенте
Процедура ОткрытьФайлИзХранилища(АдресХранилища, ИмяФайлаСРасширением)
    
    // Получаем двоичные данные из хранилища (вызов сервера)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    // Формируем путь во временном каталоге пользователя
    ПутьКФайлу = КаталогВременныхФайлов() + ИмяФайлаСРасширением;
    
    // Записываем данные на диск
    ДвоичныеДанные.Записать(ПутьКФайлу);
    
    // Открываем файл средствами ОС
    ЗапуститьПриложение(ПутьКФайлу);
    
КонецПроцедуры

Важный нюанс: Чтобы метод ЗапуститьПриложение сработал корректно, операционная система должна знать, какой программой открывать файл. Поэтому крайне важно передавать корректное расширение (например, .pdf, .xlsx или .jpg). Для специфических задач, таких как работа с PDF файлами без внешних компонентов (преобразование в картинки, масштабирование), могут потребоваться дополнительные манипуляции с данными перед открытием.

Метод 2: Современный подход через ПолучитьФайлССервера

Начиная с версии платформы 8.3.15, разработчики получили более изящный инструмент. Вместо ручного управления записью файлов, мы можем использовать метод ПолучитьФайлССервера. Выясним причину, почему это лучше: данный метод берет на себя взаимодействие с браузером (в случае веб-клиента) и упрощает код. Это особенно удобно, когда реализовано отображение прикрепленных файлов (pdf, png, jpg) в списках документов, где пользователю нужно быстро просмотреть вложение одним кликом.

Проанализируем использование этого метода. Он позволяет не только скачать файл, но и сразу предложить пользователю его открыть, используя параметры интерактивного взаимодействия.


&НаКлиенте
Процедура ОткрытьФайлСовременно(АдресХранилища, ИмяФайла)
    
    ПараметрыФайла = Новый ПараметрыПолученияФайлаССервера;
    ПараметрыФайла.Заголовок = "Открытие документа";
    
    // Указываем, что файл нужно открыть сразу после получения
    ПараметрыИнтерактивногоВзаимодействия = Новый ПараметрыИнтерактивногоВзаимодействияПриПолученииФайлов;
    ПараметрыИнтерактивногоВзаимодействия.СпособПолученияФайлов = СпособПолученияФайловССервера.Открыть;
    
    ПолучитьФайлССервера(АдресХранилища, ИмяФайла, ПараметрыФайла, ПараметрыИнтерактивногоВзаимодействия);
    
КонецПроцедуры

В веб-клиенте такой подход инициирует стандартную загрузку файла браузером, что избавляет разработчика от проблем с правами доступа к локальной файловой системе пользователя.

Метод 3: Использование Библиотеки Стандартных Подсистем (БСП)

Если вы работаете в УТ 11, то в вашей конфигурации уже есть мощная подсистема "Присоединенные файлы". Использовать "велосипеды" в данном случае — не лучшее решение. К тому же, штатные средства позволяют выполнять анализ прикрепленных файлов для контроля того, кто и когда вносил изменения или захватывал файл для редактирования.

Для того чтобы ваш документ из расширения начал работать с файлами БСП, выполните следующие действия:

  1. Добавьте ваш тип документа в определяемый тип ВладелецПрисоединенныхФайлов.
  2. Создайте справочник для хранения файлов (например, ВашДокументПрисоединенныеФайлы) по образцу существующих в системе. Если вам нужна массовая загрузка и выгрузка картинок из базы на основе БСП, лучше использовать универсальные механизмы сопоставления.
  3. В модуле ПрисоединенныеФайлыПереопределяемый укажите связь вашего документа с созданным справочником.

После этого вы сможете вызывать стандартные команды открытия файлов:


ДД = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаПрисоединенныйФайл);
// Далее используем стандартные процедуры БСП для открытия
РаботаСФайламиКлиент.ОткрытьФайл(ПараметрыФайла);

Критически важная деталь: Жизненный цикл временного хранилища

Одной из самых частых ошибок является ситуация, когда временное хранилище "протухает" (данные исчезают). Посмотрим на причину этой проблемы: данные во временном хранилище живут только до тех пор, пока длится серверный вызов, если они не привязаны к конкретной форме.

Решение: При помещении файла в хранилище (ПоместитьВоВременноеХранилище), вторым параметром всегда передавайте УникальныйИдентификатор вашей управляемой формы. В этом случае данные будут доступны пользователю всё время, пока открыто окно этого документа.


// Правильное помещение в хранилище в модуле формы
Адрес = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);

Если вы забудете передать идентификатор формы, то при попытке выполнить ПолучитьИзВременногоХранилища при нажатии на кнопку вы получите Неопределено, так как данные будут очищены платформой сразу после завершения процедуры загрузки.

Особенности работы в мобильном клиенте

Если ваша конфигурация используется на мобильных устройствах, стандартный ЗапуститьПриложение может не сработать. В этом случае мы рекомендуем использовать специализированные средства мобильной платформы:


&НаКлиенте
Процедура ОткрытьНаМобильном(АдресХранилища, ИмяФайла)
    // Специальный метод для мобильных ОС
    СредстваМультимедиа.ОткрытьДокумент(АдресХранилища);
КонецПроцедуры

Этот метод автоматически вызовет системное меню "Открыть с помощью..." на Android или iOS, предложив пользователю подходящие приложения для просмотра файла.

Резюме и очистка ресурсов

При работе с временными файлами не забывайте о гигиене файловой системы. Если вы сохраняли файл вручную через ДвоичныеДанные.Записать(), хорошей практикой считается удаление этого файла после использования. Однако помните, что вы не сможете удалить файл, пока он открыт во внешнем приложении (например, в Excel). Платформа 1С обычно очищает КаталогВременныхФайлов() при закрытии сеанса, но для высоконагруженных систем ручной контроль лишним не будет.

Подведем итог: для простых задач используйте ПолучитьФайлССервера, а для серьезных корпоративных решений всегда делайте выбор в пользу БСП, так как это обеспечит единообразие интерфейса и надежность хранения данных.

← На главную