Как программно определить путь к каталогу установки платформы 1С:Предприятие

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

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

Способ 1. Использование стандартной функции КаталогПрограммы()

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

Рассмотрим пример использования этой функции:


ПутьККаталогу = КаталогПрограммы();
Сообщить("Исполняемые файлы платформы находятся в: " + ПутьККаталогу);
// Пример возвращаемого значения: C:\Program Files\1cv8\8.3.22.1709\bin\

Разберем важные особенности и нюансы работы этого метода, о которых должен знать каждый разработчик:

  1. Различие контекстов «Клиент — Сервер»: Функция КаталогПрограммы() возвращает путь относительно того компьютера, на котором выполняется код.
    • Если код выполняется на стороне клиента (в тонком или толстом клиенте), функция вернет локальный путь установки на компьютере пользователя.
    • Если код выполняется на сервере (в серверном модуле, фоновом или регламентном задании), функция вернет путь к каталогу исполняемых файлов на самом сервере приложений 1С (там, где запущен рабочий процесс rphost.exe).
  2. Ограничение работы в веб-клиенте: Данный метод абсолютно недоступен в веб-клиенте. Так как веб-клиент запускается в браузере и не имеет прямого доступа к локальной файловой системе и исполняемым файлам 1С на клиентском ПК, вызов функции в этом контексте приведет к ошибке компиляции.
  3. Права доступа: Каталог, возвращаемый функцией, предназначен исключительно для чтения. Платформа блокирует любые попытки записи или создания файлов внутри этой директории из соображений безопасности. Используйте ее только для запуска исполняемых файлов (например, 1cv8s.exe или ibdiags.exe).

Для безопасного вызова функции в кроссплатформенном коде рекомендуется использовать инструкции препроцессора или обработку исключений:


ПутьКПлатформе = "";
#Если Не ВебКлиент Тогда
    Попытка
        ПутьКПлатформе = КаталогПрограммы();
    Исключение
        ЗаписьЖурналаРегистрации("ПолучениеПутиПлатформы", УровеньЖурналаРегистрации.Предупреждение, , , ОписаниеОшибки());
    КонецПопытки;
#КонецЕсли

Если ЗначениеЗаполнено(ПутьКПлатформе) Тогда
    // Выполняем действия с полученным путем
КонецЕсли;

---

Способ 2. Поиск общей программы запуска (1cestart.exe)

Зачастую разработчикам требуется определить не каталог конкретной запущенной версии (например, 8.3.22.1709), а расположение программы запуска — стартера 1cestart.exe, который автоматически анализирует требования базы и запускает нужный релиз. Найти его через КаталогПрограммы() напрямую не получится, так как она возвращает путь к конкретной версии. Рассмотрим, как решить эту задачу в операционной системе Windows.

Вариант А. Анализ конфигурационного файла 1CEStart.cfg

При установке платформы создается общий конфигурационный файл 1CEStart.cfg, в котором фиксируется параметр InstalledLocation, указывающий на корневую папку со всеми версиями 1С. Проанализируем, как программно прочитать этот файл:


// Определяем стандартный путь к общему файлу конфигурации стартера
ПутьККонфигу = "C:\ProgramData\1C\1CEStart\1CEStart.cfg";
ФайлКонфигурации = Новый Файл(ПутьККонфигу);

Если ФайлКонфигурации.Существует() Тогда
    ТекстДок = Новый ТекстовыйДокумент;
    ТекстДок.Прочитать(ПутьККонфигу, КодировкаТекста.UTF8);
    
    Для НомерСтроки = 1 По ТекстДок.КоличествоСтрок() Цикл
        ТекущаяСтрока = ТекстДок.ПолучитьСтроку(НомерСтроки);
        // Ищем параметр каталога установки
        Если Найти(ТекущаяСтрока, "InstalledLocation") > 0 Тогда
            МассивЧастей = СтрРазделить(ТекущаяСтрока, "=");
            Если МассивЧастей.Количество() > 1 Тогда
                КорневойКаталог = СокрЛП(МассивЧастей[1]);
                КорневойКаталог = СтрЗаменить(КорневойКаталог, """", ""); // Очищаем от кавычек
                
                // Путь к стартеру формируется добавлением относительного пути common\1cestart.exe
                ПутьКСтартеру = КорневойКаталог + "\common\1cestart.exe";
                Сообщить("Найден путь к стартеру: " + ПутьКСтартеру);
                Прервать;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Вариант Б. Чтение системного реестра Windows через COM

Еще один надежный способ быстро найти стартер на клиенте под управлением ОС Windows — обратиться к системному реестру, где зарегистрированы ассоциации исполняемых файлов платформы. Для этого мы можем использовать COM-объект WScript.Shell:


#Если Клиент Тогда
    Попытка
        Шелл = Новый COMОбъект("WScript.Shell");
        // Читаем ветку реестра, отвечающую за команду запуска стартера
        ПутьРеестра = "HKEY_CLASSES_ROOT\Applications\1cestart.exe\shell\open\command\";
        ЗначениеРеестра = Шелл.RegRead(ПутьРеестра);
        
        // Извлекаем чистый путь из строки запуска (убираем аргументы запуска типа "%1")
        ПозицияКавычки = Найти(ЗначениеРеестра, """");
        Если ПозицияКавычки > 0 Тогда
            ВтораяКавычка = Найти(Сред(ЗначениеРеестра, ПозицияКавычки + 1), """");
            ПутьКСтартеру = Сред(ЗначениеРеестра, ПозицияКавычки + 1, ВтораяКавычка - 1);
            Сообщить("Путь к стартеру из реестра: " + ПутьКСтартеру);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось определить путь через реестр: " + ОписаниеОшибки());
    КонецПопытки;
#КонецЕсли

---

Способ 3. Определение пути к самой информационной базе

Иногда задачу поиска каталога программы путают с поиском каталога размещения файлов базы данных (в случае файлового варианта работы). Если ваша цель — узнать, где хранятся файлы текущей базы, используйте функцию СтрокаСоединенияИнформационнойБазы(). Она доступна во всех контекстах выполнения, включая веб-клиент.

Рассмотрим, как правильно обработать возвращаемое значение для файлового режима работы:


СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Пример для файловой базы: File="C:\1c_bases\Trade";
// Пример для серверной базы: Srvr="ServerName";Ref="BaseName";

Если Найти(СтрокаСоединения, "File=") > 0 Тогда
    // Извлекаем чистый путь к папке базы данных
    ПутьКБазе = Сред(СтрокаСоединения, 6); // Убираем 'File="'
    ПутьКБазе = Лев(ПутьКБазе, СтрДлина(ПутьКБазе) - 2); // Убираем кавычку и точку с запятой в конце
    Сообщить("Каталог файловой базы данных: " + ПутьКБазе);
Иначе
    Сообщить("База работает в клиент-серверном режиме. Строка соединения: " + СтрокаСоединения);
КонецЕсли;

---

Другие полезные системные каталоги 1С

При написании обработок часто требуется сохранить временные файлы, отчеты или лог-файлы. Запись в каталог программы запрещена операционной системой, поэтому платформа предоставляет другие стандартные методы для работы с путями:

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

← На главную