При интеграции или программной обработке присоединенных файлов в конфигурации «1С:Управление торговлей 11» разработчики часто сталкиваются с вопросом: где именно в информационной базе хранится физический путь к файлу на диске, если включено хранение файлов в томах. Нередко при исследовании реквизитов или отладке на стороне клиента разработчик видит путь к локальным каталогам пользователя (например, в папку AppData), а не к сетевому или локальному тому хранения. Разберем по шагам структуру хранения файлов в типовых конфигурациях и выясним, как правильно программно получать пути и содержимое файлов.
Рассмотрим, как устроена подсистема присоединенных файлов, построенная на базе Библиотеки стандартных подсистем (БСП). В типовой конфигурации абсолютный путь к файлу в томе никогда не хранится в виде одной готовой строки в базе данных. Механизм разделен между двумя основными объектами метаданных:
НоменклатураПрисоединенныеФайлы. В его карточке присутствуют ключевые реквизиты:
ТипХраненияФайла — определяет, где фактически расположен файл (в базе данных или в томе на диске);Том — ссылка на элемент справочника ТомаХраненияФайлов;ПутьКФайлу — относительный путь к файлу внутри тома (как правило, формируется в виде подкаталогов по датам, например, ГГГГ\ММ\ДД\...).ТомаХраненияФайлов, в котором задаются базовые пути к каталогам. В нем содержатся реквизиты ПолныйПутьWindows и ПолныйПутьLinux.Таким образом, полный физический адрес файла на диске формируется динамически путем объединения базового пути из справочника ТомаХраненияФайлов и относительного пути из реквизита ПутьКФайлу справочника НоменклатураПрисоединенныеФайлы.
Выясним причину, почему в интерфейсе или при просмотре переменных на клиенте появляется путь к папке AppData\Local или AppData\Roaming. Тонкий и веб-клиенты платформы 1С не обращаются к файловым томам на сервере напрямую из соображений безопасности и сетевой изоляции. Когда пользователь открывает или просматривает файл, серверная процедура считывает данные из тома и передает их на клиент, где создается временная копия в рабочем каталоге пользователя. Поэтому при отладке на клиенте фиксируется именно локальный кэш, а не оригинальное хранилище тома.
Проанализируем правильные способы программной работы с файлами на стороне сервера. Для работы с присоединенными файлами разработчикам не рекомендуется вручную склеивать строки путей или выполнять прямое чтение с диска. Для этого в БСП предусмотрены типовые методы общего модуля ПрисоединенныеФайлы.
Если для внешних скриптов или систем требуется получить именно физический путь к файлу на сервере, используем метод общего модуля:
// СсылкаНаФайл — ссылка на элемент справочника НоменклатураПрисоединенныеФайлы
ПолныйПуть = ПрисоединенныеФайлы.ПолныйПутьКФайлу(СсылкаНаФайл);
Если же задача состоит в том, чтобы прочитать сам файл (для передачи во внешнюю систему, конвертации или обработки), рекомендуется получать его данные штатным универсальным методом. Этот метод работает одинаково надежно независимо от того, где физически хранится файл — в томе на диске или непосредственно в базе данных:
// Получаем двоичные данные файла независимо от типа хранения
ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(СсылкаНаФайл);
Разберем важные нюансы серверного администрирования при работе с томами:
rphost). Сетевой доступ к папке тома должен быть настроен для учетной записи операционной системы, от имени которой запущена служба сервера 1С (по умолчанию usr1cv8), а не для пользовательских учетных записей.\\server\share. Сетевая папка предварительно монтируется средствами операционной системы (CIFS или NFS) в локальную точку монтирования файловой системы, а в справочнике ТомаХраненияФайлов обязательно заполняется реквизит ПолныйПутьLinux.