Как программно определить путь и место хранения картинки номенклатуры в 1С

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

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

Разберем детально, как устроена структура хранения изображений и как программно получить путь к файлу или его двоичные данные.

Анализ структуры хранения изображений номенклатуры

В справочнике Номенклатура основное изображение привязывается через реквизит ФайлКартинки. Значением этого реквизита выступает ссылка на подчиненный справочник НоменклатураПрисоединенныеФайлы.

Файлы в системе могут храниться двумя способами:

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

Способ хранения конкретного файла определяется значением реквизита ТипХраненияФайла (значения перечисления: ВИнформационнойБазе или ВТомахНаДиске).

Способ 1. Универсальное получение пути и данных через методы БСП

Рассмотрим наиболее правильный и рекомендуемый подход к получению файлов — использование процедур и функций подсистемы БСП РаботаСФайлами на сервере.

Если нам необходимо получить абсолютный путь к файлу на диске (при хранении в томе):


&НаСервере
Функция ПолучитьПолныйПутьКФайлуНоменклатуры(СсылкаНаНоменклатуру)
    
    СсылкаНаФайл = СсылкаНаНоменклатуру.ФайлКартинки;
    
    Если Не ЗначениеЗаполнено(СсылкаНаФайл) Тогда
        Возврат "";
    КонецЕсли;
    
    // Получаем путь с помощью штатной функции БСП
    ПолныйПуть = РаботаСФайлами.ПолныйПутьКФайлу(СсылкаНаФайл);
    
    Возврат ПолныйПуть;

КонецФункции

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


&НаСервере
Функция СохранитьКартинкуВоВременныйФайл(СсылкаНаНоменклатуру)
    
    СсылкаНаФайл = СсылкаНаНоменклатуру.ФайлКартинки;
    
    Если Не ЗначениеЗаполнено(СсылкаНаФайл) Тогда
        Возврат "";
    КонецЕсли;
    
    // Получаем двоичные данные независимо от способа хранения (база или том)
    ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);
    
    // Формируем путь во временном каталоге
    Расширение = СсылкаНаФайл.Расширение;
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    Возврат ИмяВременногоФайла;

КонецФункции

Способ 2. Формирование пути к файлу вручную через реквизиты справочников

Разберем ситуацию, когда требуется собрать путь напрямую из реквизитов объекта без вызова процедур БСП.

Для этого проанализируем реквизиты элемента НоменклатураПрисоединенныеФайлы:

  1. Том — ссылка на справочник ТомаХраненияФайлов. Содержит пути ПолныйПутьWindows или ПолныйПутьLinux.
  2. ПутьКФайлу — относительный путь к файлу внутри каталога тома.
  3. ИмяФайла и Расширение — имя и расширение присоединенного файла.

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

КонецФункции

Важные особенности и ограничения

При работе с файлами картинок в 1С обратим внимание на следующие технические нюансы:

  1. Контекст выполнения: операции с путями томов и чтением файлов должны выполняться на сервере (в директиве &НаСервере), так как клиентские приложения часто не имеют прямого доступа к сетевым ресурсам кластера серверов 1С.
  2. Права доступа службы 1С: если файлы хранятся в томах на диске или сетевых папках, служба сервера 1С (пользователь операционной системы, под которым запущен процесс rphost) должна иметь полные права на чтение и запись в целевые каталоги.
  3. Устаревшие редакции (1С:УТ 10.3): в старых конфигурациях изображения хранились в справочнике ХранилищеДополнительнойИнформации в реквизите Хранилище (тип ХранилищеЗначения). Извлечение данных там выполнялось вызовом метода Ссылка.Хранилище.Получить().
← На главную