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