Как изменить структуру хранения файлов в томах 1С и программно подключить существующие файлы

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

При использовании Библиотеки стандартных подсистем (БСП) в 1С:Предприятии стандартная логика хранения файлов в томах на диске предполагает автоматическое создание подпапок на основе даты (формат ГГГГММДД). Однако в крупных компаниях или при интеграции нескольких систем администраторам и пользователям часто требуется более прозрачная структура, например: Том\НаименованиеСправочника\Контрагент\НомерДоговора\Файл.pdf. Это упрощает поиск файлов напрямую через файловую систему и позволяет организовать совместный доступ к данным из разных конфигураций.

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

Анализ стандартного механизма формирования путей

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

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

Изменение алгоритма формирования каталогов

Чтобы реализовать структуру Том\Справочник\Контрагент\Договор, нам потребуется кастомизировать функцию получения пути. Выясним причину, по которой нельзя просто записывать строки «как есть»: файловые системы (особенно Windows) накладывают ограничения на символы в именах папок. Кавычки, слеши, двоеточия и другие спецсимволы в наименованиях контрагентов приведут к ошибкам записи.

Посмотрим на пример функции, которую необходимо внедрить или использовать для очистки строк перед формированием пути:


Функция ОчиститьИмяДляФайловойСистемы(Знач Имя) Экспорт
    ЗапрещенныеСимволы = "/\:*?""<>|";
    Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
        Символ = Сред(ЗапрещенныеСимволы, Индекс, 1);
        Имя = СтрЗаменить(Имя, Символ, "_");
    КонецЦикла;
    Возврат СокрЛП(Имя);
КонецФункции

Теперь разберем по шагам, как переопределить логику в модуле ПрисоединенныеФайлыСлужебный (или через расширение в методе ПутьКФайлуВТоме):

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

Программное подключение существующих файлов

Часто возникает задача: файлы уже лежат на сервере в красивой структуре, и их нужно «показать» в 1С без физического перемещения или дублирования. Рассмотрим подробнее, какие поля справочника ДоговорыПрисоединенныеФайлы (или аналогичного) необходимо заполнить программно.

Важно: Просто создать запись в справочнике недостаточно. Система должна знать, что файл находится именно в томе.

Проанализируем обязательные поля:

Пример программного создания карточки файла:


НовыйФайл = Справочники.ДоговорыПрисоединенныеФайлы.СоздатьЭлемент();
НовыйФайл.Наименование = "Договор_скан.pdf";
НовыйФайл.ВладелецФайла = СсылкаНаДоговор;
НовыйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске;
НовыйФайл.Том = СсылкаНаТом;
НовыйФайл.ПутьКФайлу = "Договоры\Контрагент_А\Дог_001\Договор_скан.pdf";
НовыйФайл.Расширение = "pdf";
// Рассчитаем размер для корректного отображения в интерфейсе
ФайлНаДиске = Новый Файл(ПутьКТому + НовыйФайл.ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
    НовыйФайл.Размер = ФайлНаДиске.Размер();
КонецЕсли;
НовыйФайл.Записать();

Синхронизация данных и регистры сведений

Для того чтобы подсистема работы с файлами считала объект валидным, необходимо также учитывать регистры сведений. В зависимости от версии БСП, это может быть ПараметрыРаботыФайлов или ХранимыеФайлыВерсий. Если не внести туда соответствующие записи, пользователь может увидеть ошибку «Файл не найден» при попытке открытия, даже если путь в справочнике указан верно.

Также рекомендуется программно рассчитывать хеш-сумму файла (MD5). Это позволит системе проверять целостность файла и понимать, был ли он изменен внешними средствами. В БСП для этого существуют встроенные функции в модуле РаботаСФайлами.

Риски совместного использования одного тома двумя конфигурациями

Разберем ситуацию, когда две разные базы 1С (например, УТ и Бухгалтерия) смотрят в одну и ту же папку. Это «тонкий лед», и здесь нужно учитывать несколько критических факторов:

  1. Конфликты имен: Стандартно 1С добавляет уникальные идентификаторы к именам файлов в томах, чтобы избежать коллизий. Если вы будете использовать «красивые» имена, есть риск, что при случайном совпадении имен файлов (например, два пользователя в разных базах прикрепят scan.jpg) файл будет перезаписан.
  2. Кеширование: 1С хранит метаданные файла в базе. Если База №1 изменит содержимое файла на диске, База №2 об этом не узнает. Пользователь во второй базе будет видеть старый размер и старую версию, пока метаданные не будут обновлены.
  3. Монопольный доступ: Когда файл открыт на редактирование в одной базе, он может быть заблокирован операционной системой, что вызовет ошибки во второй конфигурации.

Рекомендация: Если ваша цель — предоставить доступ пользователям Базы №2 к файлам из Базы №1, рассмотрите вариант использования HTTP-сервисов. База №2 может запрашивать файл у Базы №1 через API. Это избавит вас от проблем с правами доступа к сетевым папкам и конфликтов файловой системы.

Заключение

Мы выяснили, что реализовать произвольную структуру хранения вполне реально, однако это требует аккуратности при работе с именами файлов и понимания внутренней архитектуры БСП. Основные усилия должны быть направлены на модификацию метода ПутьКФайлуВТоме и корректное заполнение реквизитов ТипХраненияФайла и ПутьКФайлу при регистрации объектов. Помните о безопасности: доступ пользователей к томам напрямую должен быть ограничен правами «только чтение», чтобы централизованное управление файлами из 1С оставалось надежным.

← На главную