Как в 1С определить операционную систему для работы с файлами?

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

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

Определение ОС через объект СистемнаяИнформация

В платформе 1С предусмотрен специальный объект СистемнаяИнформация, предоставляющий сведения о среде исполнения. В форуме был предложен базовый вариант получения сведений через свойство ВерсияОС:


СистемИнфо = Новый СистемнаяИнформация;
Сообщить(СистемИнфо.ВерсияОС);

Проанализируем этот способ. Свойство ВерсияОС возвращает текстовую строку, содержащую наименование и сборку операционной системы (например, Windows 10.0 (Build 19045) или строку с версией ядра Linux). Анализировать такую строку с помощью поиска подстрок ненадежно, поскольку формат вывода может различаться от версии к версии и зависеть от конкретного дистрибутива.

Для надежного программного ветвления рекомендуется использовать свойство ТипПлатформы того же объекта. Оно возвращает значение системного перечисления ТипПлатформы, что исключает ошибки при разборе строк. Рассмотрим пример кода:


Информация = Новый СистемнаяИнформация;
ТипПлатф = Информация.ТипПлатформы;

Если ТипПлатф = ТипПлатформы.Windows_x86 Или ТипПлатф = ТипПлатформы.Windows_x86_64 Тогда
    Сообщить("Выполняется в операционной системе Windows");
ИначеЕсли ТипПлатф = ТипПлатформы.Linux_x86 Или ТипПлатф = ТипПлатформы.Linux_x86_64 Тогда
    Сообщить("Выполняется в операционной системе Linux");
ИначеЕсли ТипПлатф = ТипПлатформы.MacOS_x86_64 Тогда
    Сообщить("Выполняется в macOS");
КонецЕсли;

Контекст исполнения: Клиент и Сервер

Важно помнить, где именно выполняется код. Объект СистемнаяИнформация опрашивает именно то окружение, в котором он был вызван:

  1. Если код выполняется в контексте &НаКлиенте, объект вернет параметры рабочего места пользователя.
  2. Если метод вызван в контексте &НаСервере, будут получены данные сервера «1С:Предприятия».

Если вы ищете файлы на сервере, а проверку типа операционной системы выполнили на клиенте, это приведет к логической ошибке, если клиент запущен под Windows, а сервер развернут на Linux. Всегда вызывайте проверку там, где непосредственно выполняются файловые операции.

Использование готовых функций БСП

Если конфигурация создана на основе «Библиотеки стандартных подсистем» (БСП), нет необходимости создавать собственные функции проверки. В библиотеке уже реализован платформонезависимый механизм:

  1. Для клиентского контекста предусмотрены методы общего модуля ОбщегоНазначенияКлиент: ЭтоWindowsКлиент(), ЭтоLinuxКлиент() и ЭтоMacOSКлиент().
  2. Для серверного контекста используются методы модуля ОбщегоНазначения: ЭтоWindowsСервер() и ЭтоLinuxСервер().

Посмотрим на пример проверки на сервере с использованием БСП:


Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
    // Действия, специфичные для Linux-сервера
ИначеЕсли ОбщегоНазначения.ЭтоWindowsСервер() Тогда
    // Действия, специфичные для Windows-сервера
КонецЕсли;

Кроссплатформенная работа с файлами без явного определения ОС

Часто программисты пытаются определить операционную систему только для того, чтобы подставить правильный разделитель пути (обратный слэш \ для Windows или прямой / для Linux). В 1С этого делать вручную не требуется. Платформа предоставляет готовые системные функции:

  1. ПолучитьРазделительПути() — возвращает разделитель каталогов для текущего контекста исполнения.
  2. ПолучитьРазделительПутиКлиента() — возвращает разделитель на стороне клиентского приложения.
  3. ПолучитьРазделительПутиСервера() — возвращает разделитель на стороне сервера 1С.

Кроме того, если в конфигурации доступна БСП, безопасную склейку путей удобно выполнять через функцию ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Путь).

Большинство встроенных объектов платформы (например, Файл, Картинка, процедура НайтиФайлы(), функции КаталогВременныхФайлов() и КаталогДокументов()) являются универсальными и автоматически нормализуют переданные пути.

Особенности файловых систем на разных платформах

При поиске и чтении файлов на разных операционных системах необходимо учитывать важные различия между файловыми системами Windows (NTFS) и Linux (ext4 и аналоги):

  1. Маски поиска файлов. При использовании функции НайтиФайлы() в Windows маска *.* традиционно выбирает абсолютно все файлы. В Linux маска *.* найдет только те файлы, в именах которых есть точка. Чтобы найти все файлы универсально на любой ОС, всегда указывайте маску *.
  2. Чувствительность к регистру (Case Sensitivity). В Linux имена файлов report.txt и Report.txt указывают на два совершенно разных файла, в то время как в Windows файловая система нечувствительна к регистру символов. Формируйте пути и имена с точным соблюдением регистра.
  3. Сетевые каталоги (UNC-пути). Сетевой путь вида \\server\share\file.txt корректно распознается в Windows. В Linux такие пути напрямую не поддерживаются ядром файловой системы: каталог предварительно должен быть смонтирован системным администратором в локальное дерево папок (например, в /mnt/share/file.txt).

Таким образом, для большинства файловых операций достаточно использовать платформенные методы нормализации путей и универсальные маски, а при необходимости жесткого ветвления логики следует применять свойство ТипПлатформы объекта СистемнаяИнформация.

← На главную