Часто в процессе разработки или администрирования баз 1С (особенно тестовых, которые регулярно перезаливаются) возникает задача массового изменения настроек пользователей информационной базы. Например, нам требуется программно получить список пользователей определенной группы и отключить для них механизм предупреждения об опасных действиях. Разберем по шагам, как правильно реализовать эту задачу, какие объекты 1С нам потребуются и на что обратить внимание при написании кода.
Сначала проанализируем ситуацию. Пользователи в 1С представлены на двух уровнях: элементы справочника Пользователи (то, что мы видим в пользовательском режиме) и объекты ПользователиИнформационнойБазы (системные пользователи, которые видны в Конфигураторе). Если мы делаем запрос к базе данных, например, к регистру сведений СоставыГруппПользователей, мы получаем ссылки на элементы справочника. Напрямую изменить системные настройки у ссылки нельзя — нам необходимо сопоставить справочник с пользователем информационной базы (ИБ).
Посмотрим на начальный запрос, которым мы собираем нужных пользователей:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СоставыГруппПользователей.Пользователь КАК Пользователь
|ИЗ
| РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
|ГДЕ
| СоставыГруппПользователей.ГруппаПользователей = &ГруппаПользователей";
Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаДоступаАдминистраторТБ);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
В переменной РезультатЗапроса мы получили таблицу значений со ссылками. Теперь нам предстоит организовать цикл и найти каждого системного пользователя.
Для сопоставления элемента справочника и пользователя ИБ в современных конфигурациях, построенных на базе БСП (Библиотека стандартных подсистем), используется уникальный идентификатор (GUID). У ссылки справочника есть свойство (или реквизит) ИдентификаторПользователяИБ. Используя менеджер ПользователиИнформационнойБазы, мы воспользуемся функцией НайтиПоУникальномуИдентификатору.
Рассмотрим, как будет выглядеть цикл:
Для Каждого СтрокаТаблицы Из РезультатЗапроса Цикл
УИД_Пользователя = СтрокаТаблицы.Пользователь.ИдентификаторПользователяИБ;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УИД_Пользователя);
Если ПользовательИБ <> Неопределено Тогда
// Здесь мы будем менять настройки
КонецЕсли;
КонецЦикла;
Платформа 1С версии 8.3.8 и выше включает механизм защиты, который выводит окно с предупреждением при попытке открыть внешнюю обработку, загрузить внешнюю компоненту или выполнить команду системы. Нам требуется установить свойство ПредупреждатьОбОпасныхДействиях в значение Ложь.
Важный нюанс: нельзя просто написать ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;. Это приведет к ошибке или не даст результата. Правильный подход — создать новый объект ОписаниеЗащитыОтОпасныхДействий, настроить его и присвоить пользователю целиком. Разберем итоговый и правильный код:
Для Каждого СтрокаТаблицы Из РезультатЗапроса Цикл
УИД_Пользователя = СтрокаТаблицы.Пользователь.ИдентификаторПользователяИБ;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УИД_Пользователя);
Если ПользовательИБ <> Неопределено Тогда
// Создаем новый объект описания защиты
НастройкиЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
НастройкиЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Присваиваем настройки пользователю
ПользовательИБ.ЗащитаОтОпасныхДействий = НастройкиЗащиты;
// Обязательно записываем изменения
ПользовательИБ.Записать();
КонецЕсли;
КонецЦикла;
Этот скрипт отлично подходит для использования в обработках, которые запускаются после восстановления тестовых баз данных, где ручные правки быстро затираются.
Проанализируем другие, зачастую более удобные варианты решения проблемы с предупреждениями об опасных действиях, если вам не хочется программно перебирать пользователей.
conf.cfg, расположенный в директории bin\conf сервера. Добавьте параметр DisableUnsafeActionProtection=.* (чтобы отключить для всех баз) или укажите регулярное выражение с именем конкретной базы (например, DisableUnsafeActionProtection=test_.*;). Для надежности параметр иногда прописывают и на клиентских машинах.ВнешниеОбработки.Подключить() или ВнешниеОбработки.Создать() можно третьим параметром передать сформированный объект ОписаниеЗащитыОтОпасныхДействий со снятым флагом.РасширениеКонфигурации.ЗащитаОтОпасныхДействий.Мы подробно рассмотрели, как программно связывать справочник пользователей с конфигуратором, грамотно перебирать их в цикле и модифицировать системные настройки безопасности. Используйте этот подход для автоматизации рутинных задач администрирования ваших баз 1С.