Приветствуем вас! Сегодня мы с вами разберем одну из частых и порой непростых задач для разработчиков 1С, работающих в гибридных инфраструктурах или полностью перешедших на Linux: программное сохранение файлов. Если ваш сервер 1С:Предприятия работает под управлением операционной системы Linux, то к привычным для Windows-разработчиков методам и подходам добавляются свои особенности. Мы рассмотрим эти нюансы подробно, чтобы вы могли успешно реализовать функционал сохранения файлов в любой среде.
Прежде чем формировать путь к файлу или выполнять специфичные для ОС действия, нам необходимо точно определить, на какой платформе сейчас работает 1С:Предприятие. Это ключевой момент, поскольку пути к файлам и некоторые другие аспекты кардинально отличаются в Linux и Windows.
Мы используем объект СистемнаяИнформация и его свойство ТипПлатформы. Этот метод позволяет нам надежно определить текущую операционную систему.
Рассмотрим пример кода, который поможет нам выяснить тип платформы:
СистемнаяИнформация = Новый СистемнаяИнформация;
ТипПлатформы = СистемнаяИнформация.ТипПлатформы;
Если ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
// Здесь мы будем выполнять код, специфичный для Linux
Сообщить("Приложение 1С работает на Linux.");
ИначеЕсли ТипПлатформы = ТипПлатформы.Windows Тогда
// Здесь будет код для Windows
Сообщить("Приложение 1С работает на Windows.");
ИначеЕсли ТипПлатформы = ТипПлатформы.MacOS_x86_64 Тогда
// Здесь будет код для macOS
Сообщить("Приложение 1С работает на macOS.");
Иначе
// Если платформа не Linux, не Windows и не macOS, возможно, это какая-то другая
// или неподдерживаемая нами платформа. Важно предусмотреть такую ситуацию.
Сообщить("Неизвестная или неподдерживаемая платформа: " + Строка(ТипПлатформы));
Возврат; // Выходим, так как не можем продолжить
КонецЕсли;
Важно: Как вы могли заметить, не стоит полагаться на то, что в ветке Иначе будет только Windows. Существуют и другие платформы, такие как macOS, или даже будущие версии, которые могут быть добавлены. Всегда лучше явно проверять тип платформы, которая нас интересует.
Теперь, когда мы знаем, на какой операционной системе мы работаем, мы можем правильно сформировать путь к файлу для сохранения. Это один из самых значительных аспектов, требующих внимания. Разберем ключевые отличия:
/). Например: /home/user/documents/report.txt.\). Например: C:\Users\User\Documents\Report.txt./. Точки монтирования для съемных носителей или дополнительных дисков часто располагаются в каталогах /mnt или /media, но могут быть настроены в любом другом месте.Посмотрим на пример формирования пути:
ПолныйПутьКФайлу = "";
ИмяФайла = "ОтчетПоПродажам.xlsx";
ИмяКаталогаДляСохранения = "";
Если ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
// Для Linux: используем прямой слеш и указываем полный путь от корня
// Например, можно сохранять во временную директорию /tmp или в подкаталог
// домашней директории пользователя, от имени которого работает сервер 1С.
// Важно: убедитесь, что у этого пользователя есть права на запись в указанный каталог.
ИмяКаталогаДляСохранения = "/var/lib/1c/temp/"; // Пример общедоступного каталога
// Или, если вы хотите сохранять в домашнюю директорию конкретного пользователя,
// и если сервер 1С имеет к ней доступ: "/home/user1c/docs/"
ПолныйПутьКФайлу = ИмяКаталогаДляСохранения + ИмяФайла;
ИначеЕсли ТипПлатформы = ТипПлатформы.Windows Тогда
// Для Windows: используем обратный слеш и указываем путь с буквой диска
ИмяКаталогаДляСохранения = "C:\1C_Files\";
ПолныйПутьКФайлу = ИмяКаталогаДляСохранения + ИмяФайла;
Иначе
Сообщить("Неподдерживаемая платформа для формирования пути.");
Возврат;
КонецЕсли;
// Перед сохранением файла убедитесь, что каталог существует.
// Если каталог не существует, его необходимо создать.
// Например, используя объект "Файл" или "Каталог".
Попытка
Каталог = Новый Каталог(ИмяКаталогаДляСохранения);
Если НЕ Каталог.Существует() Тогда
Каталог.Создать();
КонецЕсли;
Исключение
Сообщить("Ошибка при создании каталога: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Далее вы можете использовать ПолныйПутьКФайлу для сохранения объекта.
// Например, для табличного документа:
// ТабличныйДокумент.Записать(ПолныйПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
В Linux сетевые ресурсы (например, общие папки SMB/CIFS с Windows-серверов или NFS) обычно монтируются в локальную файловую систему. Это означает, что после монтирования сетевая папка становится доступной как обычный локальный каталог. Например, если сетевая папка //имякомпании/общиедокументы смонтирована в Linux как /mnt/company_share, то для 1С путь к файлу будет выглядеть как /mnt/company_share/документ.txt. Таким образом, программная работа с такими путями не будет отличаться от работы с обычными локальными файлами.
В отличие от Windows, где права доступа часто настраиваются через графический интерфейс и наследуются, в Linux права доступа к файлам и каталогам являются критически важным аспектом и управляются более строго. Если у пользователя, от имени которого работает сервер 1С, нет достаточных прав на запись в целевой каталог, сохранение файла будет невозможно, и вы получите ошибку доступа.
* Пользователь 1С: Сервер 1С:Предприятия обычно запускается от имени специального пользователя (например, usr1cv8 или _usr1cv8). Именно этому пользователю должны быть предоставлены права на запись в каталог, куда вы пытаетесь сохранить файл.
* Команда chmod: Для изменения прав доступа к файлам и каталогам в Linux используется команда chmod. Например:
* sudo chmod 777 /var/lib/1c/temp/ – предоставит полные права (чтение, запись, выполнение) всем пользователям на каталог /var/lib/1c/temp/. Будьте осторожны с 777, так как это снижает безопасность.
* sudo chmod 775 /var/lib/1c/temp/ – предоставит полные права владельцу и группе, и только чтение/выполнение всем остальным.
* sudo chown usr1cv8:grp1cv8 /var/lib/1c/temp/ – изменит владельца каталога на пользователя usr1cv8 и группу grp1cv8.
Мы настоятельно рекомендуем обратиться к системному администратору для корректной настройки прав доступа, чтобы обеспечить безопасность и стабильность работы системы.
Еще одна распространенная проблема при работе с файлами в Linux – это некорректное отображение или невозможность доступа к файлам, имена которых содержат кириллицу. Это связано с различиями в кодировках.
* Кодировка файловой системы: В современных дистрибутивах Linux обычно используется кодировка UTF-8.
* Кодировка 1С: 1С:Предприятие также работает с UTF-8.
Проблема возникает, если файловая система или настройки локали операционной системы используют другую кодировку (например, KOI8-R или CP1251). В таком случае имена файлов с кириллицей могут отображаться как "кракозябры" или быть недоступными.
Решение: Убедитесь, что системная локаль и кодировка файловой системы на сервере Linux настроены на UTF-8. Это можно проверить с помощью команды locale в терминале Linux. Если проблема сохраняется, возможно, потребуется переименовать или создавать файлы, используя только латинские символы, или же обратиться к системному администратору для проверки и корректировки настроек локали сервера.
Мы с вами подробно рассмотрели все ключевые аспекты программного сохранения файлов в 1С, когда сервер работает под управлением Linux. Помните, что определение операционной системы, правильное формирование путей, учет прав доступа и контроль кодировок являются фундаментальными шагами к успешной реализации этой задачи. Следуя нашим рекомендациям, вы сможете создать надежный и кроссплатформенный код для работы с файловой системой. Успехов в разработке!
← К списку