При разработке прикладных решений на платформе 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С:Предприятия».Если вы ищете файлы на сервере, а проверку типа операционной системы выполнили на клиенте, это приведет к логической ошибке, если клиент запущен под Windows, а сервер развернут на Linux. Всегда вызывайте проверку там, где непосредственно выполняются файловые операции.
Если конфигурация создана на основе «Библиотеки стандартных подсистем» (БСП), нет необходимости создавать собственные функции проверки. В библиотеке уже реализован платформонезависимый механизм:
ОбщегоНазначенияКлиент: ЭтоWindowsКлиент(), ЭтоLinuxКлиент() и ЭтоMacOSКлиент().ОбщегоНазначения: ЭтоWindowsСервер() и ЭтоLinuxСервер().Посмотрим на пример проверки на сервере с использованием БСП:
Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
// Действия, специфичные для Linux-сервера
ИначеЕсли ОбщегоНазначения.ЭтоWindowsСервер() Тогда
// Действия, специфичные для Windows-сервера
КонецЕсли;
Часто программисты пытаются определить операционную систему только для того, чтобы подставить правильный разделитель пути (обратный слэш \ для Windows или прямой / для Linux). В 1С этого делать вручную не требуется. Платформа предоставляет готовые системные функции:
ПолучитьРазделительПути() — возвращает разделитель каталогов для текущего контекста исполнения.ПолучитьРазделительПутиКлиента() — возвращает разделитель на стороне клиентского приложения.ПолучитьРазделительПутиСервера() — возвращает разделитель на стороне сервера 1С.Кроме того, если в конфигурации доступна БСП, безопасную склейку путей удобно выполнять через функцию ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Путь).
Большинство встроенных объектов платформы (например, Файл, Картинка, процедура НайтиФайлы(), функции КаталогВременныхФайлов() и КаталогДокументов()) являются универсальными и автоматически нормализуют переданные пути.
При поиске и чтении файлов на разных операционных системах необходимо учитывать важные различия между файловыми системами Windows (NTFS) и Linux (ext4 и аналоги):
НайтиФайлы() в Windows маска *.* традиционно выбирает абсолютно все файлы. В Linux маска *.* найдет только те файлы, в именах которых есть точка. Чтобы найти все файлы универсально на любой ОС, всегда указывайте маску *.report.txt и Report.txt указывают на два совершенно разных файла, в то время как в Windows файловая система нечувствительна к регистру символов. Формируйте пути и имена с точным соблюдением регистра.\\server\share\file.txt корректно распознается в Windows. В Linux такие пути напрямую не поддерживаются ядром файловой системы: каталог предварительно должен быть смонтирован системным администратором в локальное дерево папок (например, в /mnt/share/file.txt).Таким образом, для большинства файловых операций достаточно использовать платформенные методы нормализации путей и универсальные маски, а при необходимости жесткого ветвления логики следует применять свойство ТипПлатформы объекта СистемнаяИнформация.