В процессе разработки и администрирования систем на базе «1С:Предприятие» нередко возникает необходимость программно определить, где именно на диске установлена платформа. Это может потребоваться для программного запуска других утилит (например, конфигуратора для обновления, тестирования и исправления, или запуска еще одного сеанса «1С»), работы со служебными файлами или интеграции со сторонним программным обеспечением. В этой статье мы подробно разберем все доступные методы решения этой задачи, особенности их работы в различных контекстах исполнения, а также альтернативные способы поиска компонентов платформы.
Основным и наиболее простым способом решения задачи является использование встроенной функции глобального контекста КаталогПрограммы(). Данный метод возвращает строку, содержащую полный путь к каталогу, в котором расположены исполняемые файлы запущенной в данный момент версии программы (обычно это папка bin конкретного релиза).
Рассмотрим пример использования этой функции:
ПутьККаталогу = КаталогПрограммы();
Сообщить("Исполняемые файлы платформы находятся в: " + ПутьККаталогу);
// Пример возвращаемого значения: C:\Program Files\1cv8\8.3.22.1709\bin\
Разберем важные особенности и нюансы работы этого метода, о которых должен знать каждый разработчик:
КаталогПрограммы() возвращает путь относительно того компьютера, на котором выполняется код.
rphost.exe).1cv8s.exe или ibdiags.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);
Сообщить("Путь к стартеру из реестра: " + ПутьКСтартеру);
КонецЕсли;
Исключение
Сообщить("Не удалось определить путь через реестр: " + ОписаниеОшибки());
КонецПопытки;
#КонецЕсли
---
Иногда задачу поиска каталога программы путают с поиском каталога размещения файлов базы данных (в случае файлового варианта работы). Если ваша цель — узнать, где хранятся файлы текущей базы, используйте функцию СтрокаСоединенияИнформационнойБазы(). Она доступна во всех контекстах выполнения, включая веб-клиент.
Рассмотрим, как правильно обработать возвращаемое значение для файлового режима работы:
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Пример для файловой базы: File="C:\1c_bases\Trade";
// Пример для серверной базы: Srvr="ServerName";Ref="BaseName";
Если Найти(СтрокаСоединения, "File=") > 0 Тогда
// Извлекаем чистый путь к папке базы данных
ПутьКБазе = Сред(СтрокаСоединения, 6); // Убираем 'File="'
ПутьКБазе = Лев(ПутьКБазе, СтрДлина(ПутьКБазе) - 2); // Убираем кавычку и точку с запятой в конце
Сообщить("Каталог файловой базы данных: " + ПутьКБазе);
Иначе
Сообщить("База работает в клиент-серверном режиме. Строка соединения: " + СтрокаСоединения);
КонецЕсли;
---
При написании обработок часто требуется сохранить временные файлы, отчеты или лог-файлы. Запись в каталог программы запрещена операционной системой, поэтому платформа предоставляет другие стандартные методы для работы с путями:
КаталогВременныхФайлов() — возвращает путь к временной папке текущего пользователя операционной системы. Этот каталог гарантированно доступен для записи. Идеально подходит для создания промежуточных файлов (например, при выгрузке в Excel или XML перед отправкой пользователю).РабочийКаталогДанныхПользователя() — возвращает путь к папке хранения персональных настроек, кэша и служебных данных текущего пользователя 1С (обычно располагается по пути ...\AppData\Roaming\1C\...). Папка открыта на запись и чтение в рамках текущей сеанса.Используя комбинацию этих методов, вы сможете решить любые задачи по автоматизации запуска платформы, поиску необходимых утилит и корректному размещению временных файлов в ваших разработках.