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

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

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

Проблема: Ссылки и Пользователи ИБ

Сначала проанализируем ситуацию. Пользователи в 1С представлены на двух уровнях: элементы справочника Пользователи (то, что мы видим в пользовательском режиме) и объекты ПользователиИнформационнойБазы (системные пользователи, которые видны в Конфигураторе). Если мы делаем запрос к базе данных, например, к регистру сведений СоставыГруппПользователей, мы получаем ссылки на элементы справочника. Напрямую изменить системные настройки у ссылки нельзя — нам необходимо сопоставить справочник с пользователем информационной базы (ИБ).

Посмотрим на начальный запрос, которым мы собираем нужных пользователей:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    СоставыГруппПользователей.Пользователь КАК Пользователь
|ИЗ
|    РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
|ГДЕ
|    СоставыГруппПользователей.ГруппаПользователей = &ГруппаПользователей";

Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаДоступаАдминистраторТБ);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

В переменной РезультатЗапроса мы получили таблицу значений со ссылками. Теперь нам предстоит организовать цикл и найти каждого системного пользователя.

Поиск системного пользователя в цикле

Для сопоставления элемента справочника и пользователя ИБ в современных конфигурациях, построенных на базе БСП (Библиотека стандартных подсистем), используется уникальный идентификатор (GUID). У ссылки справочника есть свойство (или реквизит) ИдентификаторПользователяИБ. Используя менеджер ПользователиИнформационнойБазы, мы воспользуемся функцией НайтиПоУникальномуИдентификатору.

Рассмотрим, как будет выглядеть цикл:


Для Каждого СтрокаТаблицы Из РезультатЗапроса Цикл
    УИД_Пользователя = СтрокаТаблицы.Пользователь.ИдентификаторПользователяИБ;
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УИД_Пользователя);
    
    Если ПользовательИБ <> Неопределено Тогда
        // Здесь мы будем менять настройки
    КонецЕсли;
КонецЦикла;

Правильное отключение защиты от опасных действий

Платформа 1С версии 8.3.8 и выше включает механизм защиты, который выводит окно с предупреждением при попытке открыть внешнюю обработку, загрузить внешнюю компоненту или выполнить команду системы. Нам требуется установить свойство ПредупреждатьОбОпасныхДействиях в значение Ложь.

Важный нюанс: нельзя просто написать ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;. Это приведет к ошибке или не даст результата. Правильный подход — создать новый объект ОписаниеЗащитыОтОпасныхДействий, настроить его и присвоить пользователю целиком. Разберем итоговый и правильный код:


Для Каждого СтрокаТаблицы Из РезультатЗапроса Цикл
    УИД_Пользователя = СтрокаТаблицы.Пользователь.ИдентификаторПользователяИБ;
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УИД_Пользователя);
    
    Если ПользовательИБ <> Неопределено Тогда
        // Создаем новый объект описания защиты
        НастройкиЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
        НастройкиЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
        
        // Присваиваем настройки пользователю
        ПользовательИБ.ЗащитаОтОпасныхДействий = НастройкиЗащиты;
        
        // Обязательно записываем изменения
        ПользовательИБ.Записать();
    КонецЕсли;
КонецЦикла;

Этот скрипт отлично подходит для использования в обработках, которые запускаются после восстановления тестовых баз данных, где ручные правки быстро затираются.

Альтернативные способы отключения защиты

Проанализируем другие, зачастую более удобные варианты решения проблемы с предупреждениями об опасных действиях, если вам не хочется программно перебирать пользователей.

  1. Глобальное отключение через файл conf.cfg. Вы можете отключить защиту на уровне всего кластера серверов 1С. Откройте файл конфигурации conf.cfg, расположенный в директории bin\conf сервера. Добавьте параметр DisableUnsafeActionProtection=.* (чтобы отключить для всех баз) или укажите регулярное выражение с именем конкретной базы (например, DisableUnsafeActionProtection=test_.*;). Для надежности параметр иногда прописывают и на клиентских машинах.
  2. Отключение при программном открытии внешних обработок. Если проблема возникает при вызове обработки из кода, отключите защиту локально. В методы ВнешниеОбработки.Подключить() или ВнешниеОбработки.Создать() можно третьим параметром передать сформированный объект ОписаниеЗащитыОтОпасныхДействий со снятым флагом.
  3. Защита в фоновых заданиях. В фоновых заданиях окно предупреждения вывести невозможно, и задание просто падает с ошибкой. В таких случаях отключение защиты у служебного пользователя, от имени которого работает регламентное задание, является обязательным требованием.
  4. Расширения конфигурации. При программной установке расширений они также подвергаются проверке. Вы можете отключить защиту перед записью расширения, обратившись к его свойству: РасширениеКонфигурации.ЗащитаОтОпасныхДействий.

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

← На главную