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