Почему в 1С на Linux не удаляются файлы из сетевых томов и как настроить шары?

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

При организации хранения файлов вне информационной базы часто используются сетевые тома на базе протокола SMB/CIFS (сетевые папки Windows или отдельные NAS-устройства). Однако при работе кластера серверов 1С под управлением Linux (Ubuntu) в связке с сетевыми ресурсами разработчики и системные администраторы нередко сталкиваются с нетипичным поведением: файлы физически создаются, но платформа сообщает об ошибке, либо процедура очистки и удаления файлов отрабатывает без исключений, но сами файлы остаются на диске. Разберем по шагам причины такого поведения и способы решения проблемы.

Анализ проблемы: ошибки при создании и удалении файлов

Проанализируем типовую ситуацию. Имеется сервер 1С:Предприятия под управлением Linux (например, Ubuntu), информационная база с внедренной Библиотекой стандартных подсистем (БСП) и сетевой ресурс, смонтированный в локальную файловую систему сервера. При этом наблюдаются две разные проблемы:

  1. При подключении старого сетевого хранилища (NAS) папки и файлы фактически создаются на диске, но встроенные функции платформы 1С или методы БСП возвращают ошибку подключения и сбоя записи.
  2. При подключении Windows-шары создание каталогов и файлов проходит штатно, проверка тома выполняется успешно, однако при вызове типовой команды «Удалить лишние файлы» или при вызове метода УдалитьФайлы файлы физически не удаляются, хотя ошибок не генерируется.

Причина 1: Несоответствие клиент-серверного контекста в БСП

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

В подсистеме работы с файлами обработка проверки тома и поиск неиспользуемых файлов могут выполняться на сервере, где путь к файлам формируется в соответствии с путями Linux, например: /home/usr1cv8/volumes1c/UprHR/. Однако сама обработка команды удаления в некоторых версиях подсистемы вызывается в контексте клиента:


&НаКлиенте
Процедура УдалитьЛишниеФайлы(Команда)
    // Полученный с сервера список файлов передается клиентской процедуре
    // Клиент запущен под Windows и пытается выполнить УдалитьФайлы по путям Linux
    УдалитьЛишниеФайлыНаКлиенте();
КонецПроцедуры

Когда клиентское приложение под управлением Windows получает путь вида /home/usr1cv8/..., метод платформы УдалитьФайлы не может сопоставить его с локальной файловой структурой Windows. В ряде релизов платформы такой вызов завершается штатно, не вызывая исключения, но и не производя реального удаления файла на диске.

Посмотрим на пример серверного кода, который доказывает, что при выполнении непосредственно на сервере 1С под Linux удаление отрабатывает корректно:


&НаСервереБезКонтекста
Процедура ТестНаСервере()
    СпрТома = Справочники.ТомаХраненияФайлов.Выбрать();
    Пока СпрТома.Следующий() Цикл
        ПутьЛ = СпрТома.ПолныйПутьLinux;
        ТХТ = Новый ТекстовыйДокумент;
        ТХТ.УстановитьТекст("Тестовая строка");
        ТХТ.Записать(ПутьЛ + "tst.txt");
        
        // Метод на стороне сервера успешно удаляет файл
        УдалитьФайлы(ПутьЛ + "tst.txt");
    КонецЦикла;
КонецПроцедуры

Чтобы исключить данную проблему, операции по удалению и очистке файлов из томов всегда должны выполняться в контексте &НаСервере или &НаСервереБезКонтекста. Также необходимо убедиться, что в элементе справочника ТомаХраненияФайлов корректно заполнены оба реквизита: «Полный путь для Windows» (UNC-формат вида \\server\share\) и «Полный путь для Linux» (локальная точка монтирования вида /home/usr1cv8/volumes1c/).

Причина 2: Специфика синтаксиса путей в Linux

Обратим внимание на форматирование пути к точке монтирования в операционной системе Linux. В пути недопустимо использовать двойной начальный прямой слэш, например: //home/usr1cv8/volumes1c/. В стандарте POSIX путь с двойным слэшем в начале может интерпретироваться особым системным образом (как сетевой домен корневого уровня), из-за чего часть методов платформы 1С и системных библиотек теряют возможность правильно адресовать относительные файлы. Путь для операционной системы Linux должен обязательно начинаться с одного прямого слэша и завершаться им: /home/usr1cv8/volumes1c/.

Причина 3: Параметры монтирования CIFS и устаревшие NAS

Разберем ситуацию со старыми сетевыми накопителями (например, D-Link DNS-323 или старые версии Samba), когда папка и файл создаются, но платформа 1С падает с ошибкой доступа или дескриптора. Сервер Linux взаимодействует с сетевой шарой через модуль cifs. Старые реализации SMB некорректно передают 64-битные номера файловых дескрипторов (inode). В момент записи файла ядро Linux запрашивает параметры созданного объекта, получает дублирующийся или неверный номер inode от хранилища и возвращает ошибку ввода-вывода (I/O error), хотя на сам диск файл уже успел записаться.

Кроме того, механизм блокировок диапазонов байтов (byte-range locking) и кэширование атрибутов могут препятствовать повторному обращению к файлу сразу после его записи.

Для гарантированной и стабильной работы томов 1С через CIFS скорректируем строку монтирования в файле /etc/fstab на стороне Ubuntu, добавив критически важные опции:

  1. noserverino — отключает чтение номеров inode с сервера. Ядро Linux начинает генерировать номера inode самостоятельно на стороне клиента. Это полностью решает проблему ошибок записи на NAS-устройствах.
  2. nobrl — отключает отправку запросов на блокировку байтовых диапазонов на удаленный сервер. Предотвращает ложные ошибки доступа при операциях с файлами.
  3. actimeo=0 — сбрасывает кэш атрибутов файлов, за счет чего платформа 1С всегда сразу видит актуальные изменения и удаленные объекты.
  4. vers=... — явное указание версии SMB. Для старых NAS используется vers=1.0, для современных серверов Windows — vers=2.0, vers=2.1 или vers=3.0.

Посмотрим на пример правильной строки монтирования в /etc/fstab:


//10.0.8.6/volumes1c /home/usr1cv8/volumes1c cifs user=User1c,password=Pass1C,uid=usr1cv8,gid=grp1cv8,file_mode=0777,dir_mode=0777,iocharset=utf8,noserverino,nobrl,vers=2.0 0 0

Альтернативные архитектурные решения

Рассмотрим альтернативные способы организации томов, если проблемы с CIFS/SMB на уровне операционной системы сохраняются:

  1. Переход на протокол NFS. Если сетевое хранилище поддерживает работу по NFSv3 или NFSv4, подключение сетевого тома к серверу 1С на Linux через нативный протокол NFS работает существенно производительнее и полностью исключает проблемы с правами Windows и блокировками SMB.
  2. Подключение блочного устройства iSCSI. Выделение дискового пространства на NAS в виде iSCSI LUN с последующим монтированием и форматированием в файловые системы ext4 или XFS прямо на сервере 1С. Для сервера 1С это будет обычный локальный диск.
  3. Использование объектных хранилищ S3. В современных версиях платформы 1С и БСП поддержана интеграция с S3-совместимыми хранилищами (MinIO, Ceph, облачные провайдеры), что избавляет от необходимости монтирования сетевых дисков на уровне операционной системы.
← На главную