Как открыть файл, сохраненный в хранилище значений в 1С?

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

При разработке подсистем хранения документов и прикрепленных файлов в 1С часто возникает задача: данные файла сохранены в реквизите типа ХранилищеЗначения, и их требуется извлечь и открыть пользователю во внешней программе (например, Word, Excel или просмотрщике PDF). Разберем по шагам, как правильно извлечь данные, сохранить файл на диск и запустить его открытие.

Базовый механизм извлечения и открытия файла

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

Рассмотрим пример обработки события выбора строки в табличном поле (для обычных форм):


Процедура РегистрСведенийСписокВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // 1. Извлекаем двоичные данные из хранилища значений
    Двоичные = Элемент.ТекущиеДанные.Файл.Получить();
    
    // 2. Формируем путь для сохранения временного файла
    ПутьКФайлу = КаталогВременныхФайлов() + Элемент.ТекущиеДанные.ИмяФайла;
    
    // 3. Сохраняем двоичные данные в файл на диске
    Двоичные.Записать(ПутьКФайлу);
    
    // 4. Открываем файл приложением по умолчанию в ОС
    ЗапуститьПриложение(ПутьКФайлу);
КонецПроцедуры

Разбор критически важных нюансов и доработка кода

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

  1. Корректное формирование пути к файлу: Метод КаталогВременныхФайлов() в зависимости от операционной системы и версии платформы не всегда оканчивается системным разделителем. Для корректной склейки безопаснее учитывать системный разделитель (метод ПолучитьРазделительПути()) или использовать функцию ПолучитьИмяВременногоФайла().
  2. Конфликты имен и блокировки: Если файл с таким же именем уже был ранее открыт в стороннем приложении и заблокирован им, вызов метода Записать() вызовет ошибку доступа к файлу. Для предотвращения этого лучше генерировать уникальное имя файла во временном каталоге.
  3. Проверка типа данных в хранилище: Перед вызовом метода Записать() следует убедиться, что из хранилища извлечен объект типа ДвоичныеДанные, а не Неопределено или другой тип данных.

Безопасный вариант кода с проверками

Рассмотрим улучшенный вариант процедуры, содержащий необходимые проверки типов и обработку ошибок:


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

Особенности работы в управляемых формах и Тонком клиенте

Выясним особенности работы в управляемом приложении (Тонкий и Веб-клиент). В клиент-серверной архитектуре объект ХранилищеЗначения непосредственно недоступен в контексте тонкого клиента. Схема взаимодействия разделяется на серверную и клиентскую части:

  1. На сервере: Извлекаем двоичные данные из хранилища и помещаем их во временное хранилище платформы методом ПоместитьВоВременноеХранилище(). Возвращаем полученный адрес на клиент.
  2. На клиенте: Извлекаем объект типа ДвоичныеДанные по адресу временного хранилища методом ПолучитьИзВременногоХранилища(), сохраняем его на локальный диск и запускаем через ЗапуститьПриложение().

В типовых конфигурациях 1С на базе Библиотеки Стандартных Подсистем (БСП) рекомендуется избегать прямого низкоуровневого кода и использовать встроенный функционал подсистемы «Работа с файлами» (например, клиентский модуль РаботаСФайламиКлиент), который автоматически берет на себя очистку временных папок, кэширование и безопасный запуск приложений.

← На главную