При разработке кроссплатформенных решений на платформе 1С:Предприятие часто возникает задача определения операционной системы текущего рабочего места. Рассмотрим типичную ситуацию: клиентское приложение запущено на операционной системе Linux, а сервер 1С работает под управлением Windows. Из интерфейса обычных форм вызывается экспортная функция общего модуля, у которого в свойствах включены флаги Сервер, Клиент (обычное приложение), Внешнее соединение и Вызов сервера.
Разберем подробно, в каком контексте выполнится такой код, что вернет свойство ИнформацияОСистеме.ТипПлатформы и как правильно организовать логику работы с файлами в гетерогенной среде.
Проанализируем правила компиляции и вызова процедур и функций общих модулей платформой 1С:Предприятие:
Таким образом, при вызове функции из обычного приложения под управлением Linux код выполнится на клиентской машине. Объект СистемнаяИнформация вернет параметры клиентской операционной системы (Linux), а не сервера (Windows).
Посмотрим на пример кода получения системной информации и разберем важные нюансы типизации:
ИнформацияОСистеме = Новый СистемнаяИнформация;
Если Найти(ИнформацияОСистеме.ТипПлатформы, "Linux") Тогда
Фильтр = "Все файлы (*.*)|*.*|"
+ "Документ Microsoft Word (*.doc)|*.[Dd][Oo][Cc]|";
КонецЕсли;
Выясним причину возможных скрытых ошибок в данном фрагменте:
ТипПлатформы возвращает не строку, а значение системного перечисления ТипПлатформы (например, ТипПлатформы.Linux_x86, ТипПлатформы.Linux_x86_64, ТипПлатформы.Windows_x86, ТипПлатформы.Windows_x86_64).Найти() с объектом перечисления опирается на неявное преобразование к строке. Для надежного кода рекомендуется использовать прямое сравнение с элементами системного перечисления либо явное преобразование с помощью функции Строка().Рассмотрим пример корректного сравнения системного типа платформы:
ИнформацияОСистеме = Новый СистемнаяИнформация;
Если ИнформацияОСистеме.ТипПлатформы = ТипПлатформы.Linux_x86
Или ИнформацияОСистеме.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
// Формирование фильтра с учетом чувствительности к регистру в Linux
Фильтр = "Документ Microsoft Word (*.doc)|*.[Dd][Oo][Cc]|Все файлы (*.*)|*.*";
Иначе
Фильтр = "Документ Microsoft Word (*.doc)|*.doc|Все файлы (*.*)|*.*";
КонецЕсли;
В операционных системах семейства Linux файловые системы по умолчанию чувствительны к регистру символов (case-sensitive). Если в диалоге выбора файлов указать стандартный фильтр *.doc, файлы с расширениями .DOC или .Doc будут скрыты в проводнике.
Использование шаблона вида *.[Dd][Oo][Cc] или явное перечисление вариантов через точку с запятой (*.doc;*.DOC) обеспечивает корректное отображение файлов с любым регистром расширения при интерактивной работе пользователя через объект ДиалогВыбораФайла.
Для предотвращения путаницы с контекстом выполнения рекомендуется придерживаться следующих правил:
#Если Клиент Тогда, #Если Сервер Тогда или #Если ТолстыйКлиентОбычноеПриложение Тогда.