Как программно получить каталоги обмена УРБД в 1С:Предприятии 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При администрировании и автоматизации распределенных информационных баз (УРБД) в 1С:Предприятии 7.7 часто возникает необходимость программно определить, в какие именно папки выгружаются файлы обмена. Это может потребоваться для создания внешних скриптов автоматической отправки почты, мониторинга активности периферийных узлов или интеграции со сторонними транспортными службами (например, FTP-клиентами).

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

Развеиваем мифы: что хранится в 1SDBSET.DBF?

Среди разработчиков 1С "старой школы" существует популярное заблуждение, что все настройки распределенной базы данных хранятся непосредственно внутри файлов самой ИБ. Первым делом под подозрение попадает служебная таблица 1SDBSET.DBF, отвечающая за параметры обмена. Проанализируем структуру этого файла, чтобы понять, какую информацию мы действительно можем из него извлечь:

Как мы видим, в файле 1SDBSET.DBF хранятся только имена файлов обмена (например, CP001.zip), но физических путей к каталогам выгрузки и загрузки там нет. Платформа 1С 7.7 хранит эти настройки локально для каждого пользователя операционной системы.

Где на самом деле лежат каталоги обмена УРБД?

Если для информационной базы заданы индивидуальные каталоги обмена, эти настройки записываются в системный реестр Windows под учетной записью текущего пользователя (ветка HKEY_CURRENT_USER). Путь к заветному ключу выглядит следующим образом:

HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<Имя базы в окне запуска>\Config\Upload/Download directories

Этот параметр имеет строковый тип (REG_SZ) и содержит полные пути к каталогам обмена. Однако здесь разработчика подстерегает главная трудность: реестр привязывает настройки к Имени базы в окне запуска 1С, в то время как программно в коде конфигурации мы можем легко получить только ее физический путь на диске с помощью стандартной функции КаталогИБ().

Выясним причину и разберем алгоритм связи физического пути с логическим именем базы в реестре:

  1. Сначала мы считываем физический путь к текущей базе данных через КаталогИБ().
  2. Затем обращаемся к ветке реестра HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles. В этой ветке в качестве названий параметров выступают физические пути к базам, а в качестве значений — их имена из окна запуска.
  3. Сопоставляем наш физический путь со списком параметров в Titles и получаем точное имя базы.
  4. Используя полученное имя, считываем параметр Upload/Download directories из соответствующей ветки конфигурации базы.

Важное примечание: Если в реестре отсутствует параметр каталогов обмена, это означает, что используются настройки по умолчанию. В таком случае каталогами обмена выступают папки CP (Central to Peripheral) и PC (Peripheral to Central), расположенные непосредственно внутри каталога информационной базы (например, C:\1C_Bases\DB\CP\).

Решение 1: Программное получение каталогов через WScript.Shell

Рассмотрим самый надежный способ реализации нашей задачи, который не требует установки никаких внешних компонент. Мы будем использовать встроенный в Windows объект работы с системным окружением WScript.Shell через механизм COM-соединения.

Ниже представлен готовый к интеграции код функции на языке 1С:Предприятие 7.7:


Функция ПолучитьКаталогиОбменаУРБД() Экспорт
    // Инициализируем объект для работы с системным реестром Windows
    Попытка
        Шелл = СоздатьОбъект("WScript.Shell");
    Исключение
        Сообщить("Ошибка инициализации WScript.Shell. Программный доступ к реестру невозможен!", "!");
        Возврат "";
    КонецПопытки;

    // Шаг 1. Получаем физический путь к текущей базе
    ПутьКБазе = КаталогИБ();
    
    // Приводим путь к единому стандарту реестра (всегда с закрывающим слэшем)
    Если Прав(ПутьКБазе, 1) <> "\" Тогда
        ПутьКБазе = ПутьКБазе + "\";
    КонецЕсли;

    РеестрTitles = "HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles\";
    ИмяБазыВРеестре = "";

    // Шаг 2. Ищем имя базы в ветке зарегистрированных баз
    Попытка
        ИмяБазыВРеестре = Шелл.RegRead(РеестрTitles + ПутьКБазе);
    Исключение
        // Если база зарегистрирована по пути без закрывающего слэша
        Попытка
            ПутьБезСлэша = Лев(ПутьКБазе, СтрДлина(ПутьКБазе) - 1);
            ИмяБазыВРеестре = Шелл.RegRead(РеестрTitles + ПутьБезСлэша);
        Исключение
            Сообщить("Предупреждение: база не найдена в списке зарегистрированных баз текущего пользователя.", "I");
        КонецПопытки;
    КонецПопытки;

    // Если сопоставить имя базы не удалось, ориентируемся на каталоги по умолчанию
    Если ПустаяСтрока(ИмяБазыВРеестре) = 1 Тогда
        КаталогЗагрузки = ПутьКБазе + "CP\";
        КаталогВыгрузки = ПутьКБазе + "PC\";
        Возврат "Каталоги по умолчанию: " + КаталогЗагрузки + " и " + КаталогВыгрузки;
    КонецЕсли;

    // Шаг 3. Считываем настроенные каталоги обмена
    РеестрНастроек = "HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\" + ИмяБазыВРеестре + "\Config\Upload/Download directories";
    СтрокаКаталогов = "";
    
    Попытка
        СтрокаКаталогов = Шелл.RegRead(РеестрНастроек);
    Исключение
        // Параметр отсутствует в реестре, если каталоги индивидуально не переназначались
    КонецПопытки;

    Если ПустаяСтрока(СтрокаКаталогов) = 1 Тогда
        // Возвращаем стандартные пути платформы
        КаталогЗагрузки = ПутьКБазе + "CP\";
        КаталогВыгрузки = ПутьКБазе + "PC\";
        Возврат "Используются каталоги по умолчанию: Загрузка = " + КаталогЗагрузки + ", Выгрузка = " + КаталогВыгрузки;
    Иначе
        Возврат "Индивидуальные настройки обмена: " + СтрокаКаталогов;
    КонецЕсли;
КонецФункции

Решение 2: Использование внешних компонент (1С++ или AddReg.dll)

Если в вашей конфигурации уже активно используется популярная библиотека 1С++, процесс можно упростить и сделать его более устойчивым к системным блокировкам скриптов (некоторые строгие политики безопасности и антивирусы блокируют создание WScript.Shell).

Для чтения реестра через 1С++ задействуем специализированный класс реестра. Разберем по шагам, как это реализовать:


// Пример использования внешней компоненты 1С++ для работы с реестром
Функция ПолучитьКаталогиЧерез1СПП()
    Попытка
        ЗагрузитьВнешнююКомпоненту("1cpp.dll");
        Реестр = СоздатьОбъект("Реестр");
    Исключение
        Сообщить("Компонента 1С++ не установлена или не может быть загружена!", "!");
        Возврат "";
    КонецПопытки;

    ПутьКБазе = КаталогИБ();
    
    // Открываем ветку со списком баз
    Реестр.ОткрытьКлюч("HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles");
    
    // Получаем имя нашей базы из списка зарегистрированных в системе
    ИмяБазы = Реестр.ПолучитьЗначение(ПутьКБазе);
    
    Если ПустаяСтрока(ИмяБазы) = 1 Тогда
        Возврат "Используются стандартные папки CP и PC в каталоге ИБ";
    КонецЕсли;
    
    // Переходим в ветку настроек конкретной информационной базы
    Реестр.ОткрытьКлюч("HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\" + ИмяБазы + "\Config");
    СтрокаКаталогов = Реестр.ПолучитьЗначение("Upload/Download directories");
    
    Если ПустаяСтрока(СтрокаКаталогов) = 1 Тогда
        Возврат "Используются стандартные папки CP и PC в каталоге ИБ";
    КонецЕсли;
    
    Возврат "Найдены пути: " + СтрокаКаталогов;
КонецФункции

Резюме и рекомендации

Мы проанализировали внутреннее устройство распределенных баз данных 1С 7.7 и выяснили, как работает механизм сохранения настроек обмена. Подводя итог, выделим несколько важных правил для разработчика:

← На главную