При организации хранения файлов вне информационной базы часто используются сетевые тома на базе протокола SMB/CIFS (сетевые папки Windows или отдельные NAS-устройства). Однако при работе кластера серверов 1С под управлением Linux (Ubuntu) в связке с сетевыми ресурсами разработчики и системные администраторы нередко сталкиваются с нетипичным поведением: файлы физически создаются, но платформа сообщает об ошибке, либо процедура очистки и удаления файлов отрабатывает без исключений, но сами файлы остаются на диске. Разберем по шагам причины такого поведения и способы решения проблемы.
Проанализируем типовую ситуацию. Имеется сервер 1С:Предприятия под управлением Linux (например, Ubuntu), информационная база с внедренной Библиотекой стандартных подсистем (БСП) и сетевой ресурс, смонтированный в локальную файловую систему сервера. При этом наблюдаются две разные проблемы:
УдалитьФайлы файлы физически не удаляются, хотя ошибок не генерируется.Выясним причину, по которой метод удаления файлов может не срабатывать при работе с сетевыми томами в конфигурациях на базе БСП. В гетерогенных средах рабочие места пользователей часто функционируют под управлением 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/).
Обратим внимание на форматирование пути к точке монтирования в операционной системе Linux. В пути недопустимо использовать двойной начальный прямой слэш, например: //home/usr1cv8/volumes1c/. В стандарте POSIX путь с двойным слэшем в начале может интерпретироваться особым системным образом (как сетевой домен корневого уровня), из-за чего часть методов платформы 1С и системных библиотек теряют возможность правильно адресовать относительные файлы. Путь для операционной системы Linux должен обязательно начинаться с одного прямого слэша и завершаться им: /home/usr1cv8/volumes1c/.
Разберем ситуацию со старыми сетевыми накопителями (например, D-Link DNS-323 или старые версии Samba), когда папка и файл создаются, но платформа 1С падает с ошибкой доступа или дескриптора. Сервер Linux взаимодействует с сетевой шарой через модуль cifs. Старые реализации SMB некорректно передают 64-битные номера файловых дескрипторов (inode). В момент записи файла ядро Linux запрашивает параметры созданного объекта, получает дублирующийся или неверный номер inode от хранилища и возвращает ошибку ввода-вывода (I/O error), хотя на сам диск файл уже успел записаться.
Кроме того, механизм блокировок диапазонов байтов (byte-range locking) и кэширование атрибутов могут препятствовать повторному обращению к файлу сразу после его записи.
Для гарантированной и стабильной работы томов 1С через CIFS скорректируем строку монтирования в файле /etc/fstab на стороне Ubuntu, добавив критически важные опции:
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 на уровне операционной системы сохраняются: