С появлением и распространением 64-разрядного тонкого и толстого клиентов платформы 1С:Предприятие 8.3 разработчики часто сталкиваются с необходимостью выяснить, в каком именно процессе исполняется текущий клиентский код. Разрядность запущенного приложения критически важна при интеграции: подключении внешних компонент (Native API, COM), работе с печатью штрихкодов, сканерами, фискальными регистраторами или криптографией. Попытка загрузить 32-битную библиотеку напрямую в адресное пространство 64-битного клиента неизбежно приведет к ошибке.
Разберем подробнее, как встроенными средствами платформы 1С однозначно определить архитектуру клиентского процесса, а также какие архитектурные альтернативы существуют для автоматической загрузки нужных компонент.
Наиболее надежный, простой и штатный путь — обратиться к объекту СистемнаяИнформация и его свойству ТипПлатформы. Однако здесь существует принципиально важный нюанс: свойство возвращает архитектуру и операционную систему того процесса, в контексте которого был создан объект.
Если создать объект на стороне сервера (в процедуре с директивой &НаСервере), платформа вернет разрядность рабочего процесса сервера (rphost), которая часто является 64-разрядной даже тогда, когда у пользователя запущен 32-разрядный клиент. Чтобы узнать характеристики именно клиентского приложения, вызов необходимо производить строго на клиенте.
Посмотрим на практический пример кода:
&НаКлиенте
Процедура ОпределитьРазрядностьКлиента()
Инфо = Новый СистемнаяИнформация;
ТипПлатф = Инфо.ТипПлатформы;
Если ТипПлатф = ТипПлатформы.Windows_x86 Тогда
Сообщить("Запущен 32-битный клиент 1С (Windows)");
ИначеЕсли ТипПлатф = ТипПлатформы.Windows_x86_64 Тогда
Сообщить("Запущен 64-битный клиент 1С (Windows)");
ИначеЕсли ТипПлатф = ТипПлатформы.Linux_x86 Тогда
Сообщить("Запущен 32-битный клиент 1С (Linux)");
ИначеЕсли ТипПлатф = ТипПлатформы.Linux_x86_64 Тогда
Сообщить("Запущен 64-битный клиент 1С (Linux)");
Иначе
Сообщить("Другая операционная система или тип платформы: " + Строка(ТипПлатф));
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: если на рабочей станции одновременно установлены обе версии платформы (и x86, и x86-64), объект СистемнаяИнформация вернет тип платформы, относящийся именно к текущей активной сессии, из которой выполняется вызов.
В конфигурациях, использующих Библиотеку стандартных подсистем (БСП), для этих целей также можно использовать готовую функцию клиентского общего модуля ОбщегоНазначенияКлиент.ТипПлатформыКлиента().
Зачастую разработчики пытаются узнать разрядность клиента только для того, чтобы в коде выбрать нужный макет и загрузить соответствующую внешнюю библиотеку (например, x86 или x64 DLL). Платформа 1С:Предприятие предоставляет штатный механизм, избавляющий от необходимости писать подобные ветвления вручную.
Разберем по шагам, как настроить автоматический выбор компоненты:
component32.dll и component64.dll) в единый zip-архив.info.xml.arch="i386" указывает на 32-битную версию, а arch="x86_64" — на 64-битную.УстановитьВнешнююКомпоненту() и ПодключитьВнешнююКомпоненту(), передавая путь к макету архива.При таком подходе платформа 1С самостоятельно прочитает манифест, сопоставит разрядность текущего запущенного клиента и загрузит совместимую библиотеку без дополнительных проверок со стороны разработчика.
В процессе поиска решений иногда предлагают альтернативные методы, у которых есть существенные недостатки:
%PROCESSOR_ARCHITECTURE% может вернуть архитектуру самой операционной системы, а не процесса 1С, либо потребует сложного анализа условий подсистемы WOW64 (переменной %PROCESSOR_ARCHITEW6432%), что не является кроссплатформенным решением и зависит от прав доступа к COM-объектам.Program Files (x86) не гарантирует корректный результат, так как каталог установки платформы может быть изменен администратором вручную или платформа может запускаться в среде Linux.Таким образом, использование свойства ТипПлатформы объекта СистемнаяИнформация на клиенте остается наиболее точным и безопасным способом решения задачи.