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

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

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

Анализ стандартных механизмов БСП

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

Ключевая функция, которая нас интересует — ОтносительныйПутьНовогоФайла(). Именно она определяет, в какую подпапку внутри тома попадет новый файл. В стандартном исполнении она возвращает строку, состоящую из фрагментов даты создания. Наша задача — переопределить этот механизм, не нарушая целостности конфигурации.

Реализация решения через расширение конфигурации

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

  1. Создадим новое расширение и добавим в него общий модуль РаботаСФайламиВТомахСлужебный.
  2. Для функции ОтносительныйПутьНовогоФайла установим аннотацию &Вместо.
  3. Внутри функции реализуем получение данных о владельце файла.

Посмотрим на пример программного кода, который формирует путь на основе данных справочника «Договоры»:


&Вместо("ОтносительныйПутьНовогоФайла")
Функция Инд_ОтносительныйПутьНовогоФайла(Знач ВладелецФайла, Знач ИмяФайла)
    
    // Получаем ссылку на сам объект (например, на Договор)
    // В БСП ВладелецФайла в справочниках "ПрисоединенныеФайлы" — это ссылка на основной объект
    ОбъектВладелец = ВладелецФайла.ВладелецФайла;
    
    Если ТипЗнч(ОбъектВладелец) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
        
        // Извлекаем нужные реквизиты
        КонтрагентНаименование = Строка(ОбъектВладелец.Владелец);
        ДоговорНомер = ОбъектВладелец.Код;
        ИмяСправочника = "Договоры";
        
        // Обязательно очищаем строки от недопустимых символов для файловой системы
        КонтрагентНаименование = ОчиститьИмяОтЗапрещенныхСимволов(КонтрагентНаименование);
        ДоговорНомер = ОчиститьИмяОтЗапрещенныхСимволов(ДоговорНомер);
        
        // Формируем итоговый путь
        ОтносительныйПуть = ИмяСправочника + "\" + КонтрагентНаименование + "\" + ДоговорНомер + "\" + ИмяФайла;
        
        Возврат ОтносительныйПуть;
    Иначе
        // Если это другой справочник, можно оставить стандартную логику или прописать свою
        Возврат ПродолжитьВызов(ВладелецФайла, ИмяФайла);
    КонецЕсли;
    
КонецФункции

Важность очистки имен от спецсимволов

Обратим внимание на критический момент: названия контрагентов в базе 1С часто содержат кавычки, слеши, двоеточия и другие символы, которые запрещены правилами файловой системы (Windows или Linux). Если попытаться создать папку с именем ООО "Ромашка" / Филиал, система выдаст ошибку записи.

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


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

Риски и ограничения новой структуры

Прежде чем внедрять подобную структуру в рабочую базу, выясним причину, почему 1С по умолчанию использует даты, а не смысловые имена. Существует несколько серьезных рисков, которые нужно учитывать при проектировании:

  1. Статичность пути: В 1С путь к файлу в томе записывается в базу в момент создания файла. Если пользователь переименует контрагента или изменит номер договора в интерфейсе 1С, файл на диске не переместится автоматически. Ссылка в базе будет по-прежнему указывать на старую папку. Это приведет к рассинхронизации данных в 1С и структуры папок на диске.
  2. Длина пути (MAX_PATH): В операционных системах семейства Windows существует ограничение на длину пути (обычно 260 символов). Если у вас глубокая вложенность (Том\Справочник\Контрагент\Договор\Файл), а наименования контрагентов длинные, вы легко можете выйти за этот лимит, что вызовет фатальные ошибки при сохранении файлов.
  3. Уникальность имен: При использовании дат коллизии маловероятны. При использовании номеров договоров нужно быть уверенным, что в пределах одного контрагента номера не дублируются, иначе файлы разных объектов могут попасть в одну директорию.

Работа с существующими файлами

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

Во-первых, новый алгоритм будет применяться только к вновь создаваемым записям. Старые файлы останутся лежать в папках 2023\01\01....

Во-вторых, если стоит задача привести всё к единому виду, вам потребуется написать обработку, которая:

Итоги

Мы проанализировали способ кастомизации хранения файлов в томах 1С. Переопределение функции ОтносительныйПутьНовогоФайла в расширении позволяет создать прозрачную и понятную структуру папок для внешних потребителей. Однако помните, что такая реализация требует дополнительного контроля за спецсимволами, длиной пути и готовности к тому, что при изменении данных в 1С структура папок на диске останется прежней без дополнительных доработок механизмов обновления путей.

← На главную