Как программно определить разрядность клиента 1С: 32 или 64 бита?

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

С появлением и распространением 64-разрядного тонкого и толстого клиентов платформы 1С:Предприятие 8.3 разработчики часто сталкиваются с необходимостью выяснить, в каком именно процессе исполняется текущий клиентский код. Разрядность запущенного приложения критически важна при интеграции: подключении внешних компонент (Native API, COM), работе с печатью штрихкодов, сканерами, фискальными регистраторами или криптографией. Попытка загрузить 32-битную библиотеку напрямую в адресное пространство 64-битного клиента неизбежно приведет к ошибке.

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

Способ 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), объект СистемнаяИнформация вернет тип платформы, относящийся именно к текущей активной сессии, из которой выполняется вызов.

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

Способ 2. Автоматический выбор разрядности компоненты через манифест

Зачастую разработчики пытаются узнать разрядность клиента только для того, чтобы в коде выбрать нужный макет и загрузить соответствующую внешнюю библиотеку (например, x86 или x64 DLL). Платформа 1С:Предприятие предоставляет штатный механизм, избавляющий от необходимости писать подобные ветвления вручную.

Разберем по шагам, как настроить автоматический выбор компоненты:

  1. Объединим бинарные файлы внешней компоненты для различных платформ (например, component32.dll и component64.dll) в единый zip-архив.
  2. Поместим в корень архива файл манифеста с именем info.xml.
  3. Опишем в манифесте соответствие файлов компоненты архитектуре процессора: атрибут arch="i386" указывает на 32-битную версию, а arch="x86_64" — на 64-битную.
  4. Поместим полученный zip-архив в общий макет с типом Двоичные данные.
  5. Подключим компонент стандартными методами УстановитьВнешнююКомпоненту() и ПодключитьВнешнююКомпоненту(), передавая путь к макету архива.

При таком подходе платформа 1С самостоятельно прочитает манифест, сопоставит разрядность текущего запущенного клиента и загрузит совместимую библиотеку без дополнительных проверок со стороны разработчика.

Ограничения и ненадежные способы

В процессе поиска решений иногда предлагают альтернативные методы, у которых есть существенные недостатки:

  1. Анализ переменных окружения через WScript.Shell: Использование переменных вроде %PROCESSOR_ARCHITECTURE% может вернуть архитектуру самой операционной системы, а не процесса 1С, либо потребует сложного анализа условий подсистемы WOW64 (переменной %PROCESSOR_ARCHITEW6432%), что не является кроссплатформенным решением и зависит от прав доступа к COM-объектам.
  2. Проверка пути через КаталогПрограммы(): Попытка найти в строке пути подстроку Program Files (x86) не гарантирует корректный результат, так как каталог установки платформы может быть изменен администратором вручную или платформа может запускаться в среде Linux.

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

← На главную