В процессе системного администрирования и сопровождения баз 1С мы часто сталкиваемся с ситуацией, когда автоматическое резервное копирование завершается с ошибкой или создает некорректные архивы. Одной из наиболее коварных причин является ограничение операционной системы Windows на максимальную длину пути (MAX_PATH), которое по умолчанию составляет 260 символов (из которых 256 отведено под сам путь). Проанализируем, почему это происходит и как мы можем обойти это ограничение различными методами.
Важно понимать различие между файловой системой и программным интерфейсом. Файловая система NTFS теоретически поддерживает пути длиной до 32 767 символов. Однако библиотека Win32 API, которую использует большинство приложений (включая многие архиваторы и стандартный Проводник), накладывает ограничение в 256–260 символов. Когда дерево папок пользователя 1С или структура документов становится слишком глубокой, функции копирования просто перестают видеть файл или возвращают ошибку доступа. Выясним, как бороться с этой ситуаций комплексно.
Начиная с Windows 10 (версия 1607) и Windows Server 2016, разработчики Microsoft добавили возможность снять это ограничение на уровне системы. Рассмотрим, как это сделать через редактор реестра. Выполним следующие шаги:
regedit.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem.DWORD (32 бита) с таким именем.Важное примечание: включение этой опции в реестре не гарантирует мгновенного исправления для всех программ. Чтобы архиватор или платформа 1С начали поддерживать длинные пути, они должны содержать специальный манифест (application manifest) с параметром longPathAware. Если программа старая, она продолжит выдавать ошибку даже после правки реестра.
Если мы не можем изменить настройки системы или обновить программное обеспечение, воспользуемся проверенным методом "сокращения" пути. Разберем ситуацию: у нас есть папка C:\Users\Admin\Documents\Backups\Companies\VeryLongCompanyName\Accounting\Base1C\. Путь уже занимает около 100 символов. Мы можем "подменить" глубокую папку буквой диска.
Используем команду subst в командной строке:
subst X: "C:\Users\Admin\Documents\Backups\Companies\VeryLongCompanyName\Accounting"
Теперь для архиватора путь к базе будет выглядеть как X:\Base1C\. Это позволяет выиграть десятки символов и успешно выполнить резервное копирование. После завершения операции диск можно отключить командой subst X: /d.
Стандартные средства копирования Windows часто пасуют перед длинными путями, но встроенная утилита Robocopy (Robust File Copy) лишена этого недостатка. Она умеет работать с путями любой сложности. Проанализируем сценарий, при котором мы сначала копируем данные в промежуточную папку с коротким именем, а затем архивируем ее.
Пример команды для копирования структуры с длинными путями:
robocopy "C:\Источник_с_очень_длинным_путем" "C:\Temp\Backup" /E /ZB /R:5 /W:5 /LOG:C:\temp\backup_log.txt
Параметры команды означают:
/E — копировать все подпапки, включая пустые./ZB — режим архивации (позволяет обходить некоторые ограничения прав доступа)./R:5 — количество попыток при ошибке./W:5 — время ожидания между попытками.Прежде чем исправлять проблему, нам нужно понять масштаб бедствия. Выясним, какие именно файлы превышают лимит в 250 символов (оставим небольшой запас). Для этого идеально подходит PowerShell. Разберем скрипт, который выведет нам список проблемных объектов:
Get-ChildItem -Path "C:\Data" -Recurse |
Where-Object { $_.FullName.Length -gt 250 } |
Select-Object FullName, @{Name="Length"; Expression={$_.FullName.Length}} |
Export-Csv -Path "C:\LongPaths.csv" -NoTypeInformation -Encoding UTF8
Этот скрипт просканирует указанную директорию и сохранит отчет в CSV-файл. На основе этого списка мы можем попросить пользователей переименовать слишком длинные вложения или вложенные папки (например, "Договор_купли_продажи_номер_123_от_2023_года_со всеми_дополнениями_и_приложениями.pdf").
Для некоторых современных приложений (например, 7-Zip) можно попробовать указать путь в формате UNC с использованием префикса \\?\. Это сообщает Win32 API, что нужно отключить проверку MAX_PATH и передать путь напрямую в файловую систему. Рассмотрим пример указания пути:
Вместо C:\MyData\VeryLongPath... укажем \\?\C:\MyData\VeryLongPath...
Вместо сетевого пути \\Server\Share\Path... укажем \\?\UNC\Server\Share\Path...
Однако помните, что этот метод работает не везде. Если ваш архиватор вызывает стандартное окно выбора файлов Windows, этот префикс может быть проигнорирован.
В контексте 1С проблема часто возникает из-за того, что платформа хранит временные файлы и кэш в профиле пользователя: C:\Users\ИмяПользователя\AppData\Local\1C\1cv8\.... Если имя пользователя длинное, а внутри кэша создаются вложенные папки с GUID-именами, лимит превышается мгновенно. Проанализируем возможность переноса временных файлов.
Мы можем изменить переменные окружения TEMP и TMP для пользователя, под которым запускается служба или сеанс архивации. Установим их в C:\Temp. Это значительно сократит базовую часть пути для всех временных операций платформы.
Посмотрим на ситуацию со стороны программного обеспечения. Если ваш текущий архиватор не справляется, рекомендуем использовать последнюю версию 7-Zip. При работе через командную строку (7z.exe) он отлично поддерживает длинные пути. Также хорошим инструментом является Total Commander, в настройках которого можно включить опцию "Использовать функции для работы с длинными именами".
Подведем итог:
Проблема длинных путей решается комбинацией административных и технических мер. Оптимальным алгоритмом будет:
LongPathsEnabled в реестре.subst или robocopy для работы с критически длинными структурами.