Как программно изменить параметры информационной базы на сервере 1С?

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

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

Анализ проблемы: почему возникает ошибка «Информационная база не зарегистрирована»?

Типичная ситуация: программист пишет код, который успешно находит базу в кластере, но при вызове метода UpdateInfoBase система выдает исключение. Проанализируем ситуацию: это происходит из-за того, что интерфейс администрирования 1С разделен на несколько уровней. Когда мы подключаемся через рабочий процесс (ConnectWorkingProcess), мы получаем доступ к управлению текущими сеансами и некоторыми свойствами базы. Однако такие параметры, как Descr (описание), хранятся непосредственно в реестре кластера (файл 1CV8Reg.lst).

Выясним причину: рабочий процесс (rphost) не всегда имеет полномочия на обновление «статических» метаданных регистрации базы в кластере «на лету». Если свойства SessionsDenied или DeniedMessage могут быть изменены через рабочий процесс, то попытка смены Descr часто приводит к тому, что менеджер кластера (rmngr) отвергает изменения, сообщая, что база якобы не зарегистрирована (так как она не найдена в контексте текущего редактируемого объекта рабочего процесса).

Решение №1: Программное редактирование через COM-соединение

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


Процедура ИзменитьПараметрыИБНаСервере(ИмяБазыВКластере, НовоеОписание)
    
    // 1. Инициализируем COM-соединитель. 
    // Для версии 8.3 используем V83.COMConnector
    Попытка
        COMСоединитель = Новый COMОбъект("V83.COMConnector");
    Исключение
        Сообщить("Ошибка создания COM-объекта: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 2. Подключаемся к агенту сервера
    // Обычно используется порт 1540
    ИмяСервера = "ИмяВашегоСервера";
    СоединениеСАгентом = COMСоединитель.ConnectAgent(ИмяСервера);
    
    // 3. Получаем список кластеров и выбираем нужный
    МассивКластеров = СоединениеСАгентом.GetClusters();
    // Предположим, что на сервере один кластер
    НужныйКластер = МассивКластеров.GetValue(0);
    
    // 4. Аутентификация в кластере (если установлены логин/пароль администратора кластера)
    СоединениеСАгентом.Authenticate(НужныйКластер, "admin", "password");
    
    // 5. Получаем список всех баз в кластере
    МассивБаз = СоединениеСАгентом.GetInfoBases(НужныйКластер);
    
    ИнформационнаяБазаОбъект = Неопределено;
    Для Каждого ТекущаяБаза Из МассивБаз Цикл
        Если ВРег(ТекущаяБаза.Name) = ВРег(ИмяБазыВКластере) Тогда
            ИнформационнаяБазаОбъект = ТекущаяБаза;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если ИнформационнаяБазаОбъект = Неопределено Тогда
        Сообщить("База не найдена в кластере.");
        Возврат;
    КонецЕсли;
    
    // 6. Модифицируем свойства
    ИнформационнаяБазаОбъект.Descr = НовоеОписание;
    ИнформационнаяБазаОбъект.ScheduledJobsDenied = Истина; // Блокировка регламентных заданий
    
    // 7. ЗАПИСЬ ИЗМЕНЕНИЙ
    // Важно: вызываем UpdateInfoBase именно у СоединенияСАгентом, передавая кластер и объект ИБ
    СоединениеСАгентом.UpdateInfoBase(НужныйКластер, ИнформационнаяБазаОбъект);
    
    Сообщить("Параметры базы успешно обновлены!");
    
КонецПроцедуры

Обратите внимание на важный момент: в коде выше мы используем СоединениеСАгентом.UpdateInfoBase. Это позволяет избежать проблем с правами рабочего процесса, так как команда идет напрямую через менеджера кластера.

Решение №2: Использование утилиты RAC и сервера RAS

Рассмотрим альтернативный, более современный подход. Начиная с версии 8.3, компания 1С рекомендует использовать сервер администрирования ras и консольную утилиту rac. Этот способ избавляет от проблем с разрядностью COM-объектов (32/64 бит) и позволяет управлять сервером даже из скриптов на Python или командной строки Windows/Linux.

Проанализируем преимущества этого метода: отсутствие зависимости от Windows-компонентов COM+. Если ваша информационная база развернута на Linux-сервере 1С, это единственный штатный способ автоматизации. Для автоматического управления доступом к базам в этой среде подойдёт обработка для установки и снятия блокировок на сервере под Linux.

Для изменения описания базы через rac выполните следующие шаги:

  1. Убедитесь, что служба ras запущена на сервере (по умолчанию порт 1545).
  2. Используйте команду для получения идентификатора (UUID) вашей базы: rac infobase --cluster=<ID_кластера> summary list
  3. Выполните команду обновления: rac infobase --cluster=<ID_кластера> update --infobase=<ID_базы> --descr="Новое описание" --scheduled-jobs-deny=on

Этот метод считается более стабильным для высоконагруженных систем, так как он работает через сетевой протокол и не блокирует ресурсы сервера так, как это может делать «тяжелый» COM-объект. Для визуального взаимодействия с кластером через данный протокол можно использовать консоль администрирования серверов 1С на базе ras.

Важные нюансы и рекомендации

Посмотрим на примеры наиболее частых ошибок, которые допускают разработчики при выполнении подобных задач:

1. Параметры аутентификации. Если в информационной базе создан хотя бы один пользователь с правами администратора, вы обязаны предоставить данные этого пользователя перед вызовом UpdateInfoBase. В противном случае сервер вернет ошибку доступа. Для этого используется метод AddAuthentication у объекта рабочего процесса или соответствующие параметры в rac.

2. Разрядность библиотек. Если ваш код выполняется в 32-битном клиенте 1С, он пытается инициализировать 32-битный COMConnector. Если сервер 1С 64-битный, могут возникнуть конфликты версий. Рекомендуется выполнять подобный код строго &НаСервере, чтобы разрядность процесса соответствовала разрядности установленного сервера приложений.

3. Права учетной записи службы. Проверьте, под каким пользователем запущена служба 1C:Enterprise Server Agent. Если у этого пользователя (например, USR1CV8) нет прав на изменение файлов в каталоге srvinfo, никакие программные методы не смогут обновить настройки базы, так как физическая запись в файл реестра будет заблокирована операционной системой.

В завершение подчеркнем: если вам нужно изменить простые параметры блокировки сеансов, можно ограничиться WorkingProcessConnection. Но если задача стоит шире (изменение имени базы, описания, параметров СУБД), всегда используйте соединение через Агента сервера или инструменты RAC/RAS. Это обеспечит надежность работы вашего кода и отсутствие труднообъяснимых ошибок в будущем.

← На главную