При использовании Библиотеки стандартных подсистем (БСП) для хранения присоединенных файлов в томах на диске, система по умолчанию создает структуру папок по датам: ГГГГ\ММ\ДД\ИмяФайла. Это удобно для автоматизации, но совершенно нечитаемо для системных администраторов или пользователей, которым требуется прямой доступ к каталогам сервера. В данной статье мы рассмотрим, как программно изменить этот алгоритм и реализовать логичную структуру вида: Том\НаименованиеСправочника\НаименованиеКонтрагента\НомерДоговора.
Для начала проанализируем, где именно в коде заложена логика формирования пути. В типовых конфигурациях, использующих БСП, основным "центром управления" файлами в томах является общий модуль РаботаСФайламиВТомахСлужебный.
Ключевая функция, которая нас интересует — ОтносительныйПутьНовогоФайла(). Именно она определяет, в какую подпапку внутри тома попадет новый файл. В стандартном исполнении она возвращает строку, состоящую из фрагментов даты создания. Наша задача — переопределить этот механизм, не нарушая целостности конфигурации.
Чтобы сохранить конфигурацию на поддержке и обеспечить корректное обновление, воспользуемся механизмом расширений. Это позволит нам точечно заменить логику формирования пути. Выполним следующие шаги:
РаботаСФайламиВТомахСлужебный.ОтносительныйПутьНовогоФайла установим аннотацию &Вместо.Посмотрим на пример программного кода, который формирует путь на основе данных справочника «Договоры»:
&Вместо("ОтносительныйПутьНовогоФайла")
Функция Инд_ОтносительныйПутьНовогоФайла(Знач ВладелецФайла, Знач ИмяФайла)
// Получаем ссылку на сам объект (например, на Договор)
// В БСП ВладелецФайла в справочниках "ПрисоединенныеФайлы" — это ссылка на основной объект
ОбъектВладелец = ВладелецФайла.ВладелецФайла;
Если ТипЗнч(ОбъектВладелец) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда
// Извлекаем нужные реквизиты
КонтрагентНаименование = Строка(ОбъектВладелец.Владелец);
ДоговорНомер = ОбъектВладелец.Код;
ИмяСправочника = "Договоры";
// Обязательно очищаем строки от недопустимых символов для файловой системы
КонтрагентНаименование = ОчиститьИмяОтЗапрещенныхСимволов(КонтрагентНаименование);
ДоговорНомер = ОчиститьИмяОтЗапрещенныхСимволов(ДоговорНомер);
// Формируем итоговый путь
ОтносительныйПуть = ИмяСправочника + "\" + КонтрагентНаименование + "\" + ДоговорНомер + "\" + ИмяФайла;
Возврат ОтносительныйПуть;
Иначе
// Если это другой справочник, можно оставить стандартную логику или прописать свою
Возврат ПродолжитьВызов(ВладелецФайла, ИмяФайла);
КонецЕсли;
КонецФункции
Обратим внимание на критический момент: названия контрагентов в базе 1С часто содержат кавычки, слеши, двоеточия и другие символы, которые запрещены правилами файловой системы (Windows или Linux). Если попытаться создать папку с именем ООО "Ромашка" / Филиал, система выдаст ошибку записи.
Для решения этой проблемы рекомендуется использовать встроенные средства БСП. В модуле ОбщегоНазначения или РаботаСФайлами часто присутствуют функции очистки строк. Если их нет под рукой, проанализируем простейший способ замены:
Функция ОчиститьИмяОтЗапрещенныхСимволов(ИмяСтрокой)
ЗапрещенныеСимволы = "/\:*?""<>|";
Результат = ИмяСтрокой;
Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
Символ = Сред(ЗапрещенныеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, Символ, "_");
КонецЦикла;
Возврат Результат;
КонецФункции
Прежде чем внедрять подобную структуру в рабочую базу, выясним причину, почему 1С по умолчанию использует даты, а не смысловые имена. Существует несколько серьезных рисков, которые нужно учитывать при проектировании:
Том\Справочник\Контрагент\Договор\Файл), а наименования контрагентов длинные, вы легко можете выйти за этот лимит, что вызовет фатальные ошибки при сохранении файлов.Если в вашей базе уже накоплено большое количество файлов, простое изменение кода не заставит старые файлы переместиться в новые папки. Рассмотрим подробнее план миграции:
Во-первых, новый алгоритм будет применяться только к вновь создаваемым записям. Старые файлы останутся лежать в папках 2023\01\01....
Во-вторых, если стоит задача привести всё к единому виду, вам потребуется написать обработку, которая:
ПутьКФайлу в справочнике присоединенных файлов (или в регистре сведений, в зависимости от версии БСП).Мы проанализировали способ кастомизации хранения файлов в томах 1С. Переопределение функции ОтносительныйПутьНовогоФайла в расширении позволяет создать прозрачную и понятную структуру папок для внешних потребителей. Однако помните, что такая реализация требует дополнительного контроля за спецсимволами, длиной пути и готовности к тому, что при изменении данных в 1С структура папок на диске останется прежней без дополнительных доработок механизмов обновления путей.