Как программно создать нового пользователя или скопировать настройки существующего? Часто встречаю вопросы касаемые программного создания и настройки прав пользователей.
В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.
В приложении к статье обработки, код которых приведен ниже: Скачать обработки
Обработки были написаны под УТ, но, при необходимости, вы можете их легко доработать под другие конфигурации.
Управляемое приложение: В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.
! В типовых конфигурациях для работы с пользователями активно используется БСП !
В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ , ПрочитатьПользователяИБ , ЗаписатьПользователяИБ иУдалитьПользователяИБ .
Код создания нового пользователя с использованием БСП:
Код 1C v 8.3 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)
Пользователь = Обработки. НастройкиПользователей. ИмяПользователяИБ( ПользовательСсылка) ;
Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей. Колонки. Добавить( "Пользователь" ) ;
ТаблицаПользователей = Обработки. НастройкиПользователей. ПользователиДляКопирования( ПользовательСсылка, ТаблицаПользователей,
ТипЗнч( ПользовательСсылка) = Тип( "СправочникСсылка.ВнешниеПользователи" ) ) ;
Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники. Добавить( ПользовательПриемник) ;
КонецЦикла ;
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки. Добавить( "НастройкиОтчетов" ) ;
КопируемыеНастройки. Добавить( "НастройкиВнешнегоВида" ) ;
КопируемыеНастройки. Добавить( "ПерсональныеНастройки" ) ;
КопируемыеНастройки. Добавить( "Избранное" ) ;
КопируемыеНастройки. Добавить( "НастройкиПечати" ) ;
КопируемыеНастройки. Добавить( "ПрочиеПользовательскиеНастройки" ) ;
НастройкиСкопированы = Обработки. НастройкиПользователей.
КопированиеНастроекПользователей( ПользовательСсылка, Приемники, КопируемыеНастройки) ;
Возврат НастройкиСкопированы;
КонецФункции
Функция СоздатьНовыйУровеньДоступа(ФИО)
Рез = Справочники. CRM_УровниДоступа. НайтиПоНаименованию( ФИО) ;
Если Рез = Неопределено ИЛИ Рез = Справочники. CRM_УровниДоступа. ПустаяСсылка( ) Тогда
НовыйОбъект = Справочники. CRM_УровниДоступа. СоздатьЭлемент( ) ;
НовыйОбъект. Наименование = ФИО;
НовыйОбъект. Записать( ) ;
возврат НовыйОбъект. Ссылка;
КонецЕсли ;
КонецФункции
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( Объект. ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Наименование) ) ;
ОписаниеПользователяИБ = Пользователи. НовоеОписаниеПользователяИБ( ) ;
ПользовательИБСуществует = Ложь ;
ДоступКИнформационнойБазеРазрешен = Ложь ;
Если ОбщегоНазначенияПовтИсп. РазделениеВключено( ) Тогда
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора = Ложь ;
Иначе
ОписаниеПользователяИБ. ПоказыватьВСпискеВыбора =
НЕ Константы. ИспользоватьВнешнихПользователей. Получить( ) ;
КонецЕсли ;
ОписаниеПользователяИБ. АутентификацияСтандартная = Истина ;
ОписаниеПользователяИБ. Роли = Новый Массив;
ПрочитанныеСвойства = Неопределено ;
Если Пользователи. ПрочитатьПользователяИБ(
ПользовательНастроек. ИдентификаторПользователяИБ, ПрочитанныеСвойства
) Тогда
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли" ) ;
КонецЕсли ;
ОписаниеПользователяИБ. Вставить( "Действие" , "Записать" ) ;
ОписаниеПользователяИБ. Вставить( "Имя" , Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Наименование = Объект. ФИОСоздаваемогоПользователя;
НовыйПользователь. ТекущееПодразделение = ПользовательНастроек. ТекущееПодразделение;
НовыйПользователь. CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа( Объект. ФИОСоздаваемогоПользователя) ;
НовыйПользователь. Недействителен = ложь ;
НовыйПользователь. ДополнительныеСвойства. Вставить(
"ОписаниеПользователяИБ" , ОписаниеПользователяИБ) ;
НовыйПользователь. Записать( ) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Состав. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. Пользователи. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
КопированиеВсехНастроек( ПользовательНастроек, НовыйПользователь. Ссылка) ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура СоздатьПользователяНаСервере()
Если НЕ ЗначениеЗаполнено( Объект. ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( Объект. ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
тИзменяемыйПользователь = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ИзменяемыйПользователь. Наименование) ) ;
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ШаблонПользователяДляКопирования. Наименование) ) ;
тИзменяемыйПользователь. Роли. Очистить( ) ;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
тИзменяемыйПользователь. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
тИзменяемыйПользователь. Записать( ) ;
КопированиеВсехНастроек( ШаблонПользователяДляКопирования, ИзменяемыйПользователь) ;
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере( Объект. ИзменяемыйПользователь, Объект. ШаблонПользователяДляКопирования) ;
КонецПроцедуры
Обычное приложение: В обычном все проще:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено( ШаблонПользователяДляСозданияНового) Тогда
Возврат ;
КонецЕсли ;
ОбновитьДанныеПользователяИБ( ШаблонПользователяДляСозданияНового, Ложь ) ;
КонецПроцедуры
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат ;
КонецЕсли ;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы. НайтиПоИмени( ФИОСоздаваемогоПользователя) ;
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы. НайтиПоИмени( сокрлп( ПользовательНастроек. Код) ) ;
ПользовательИБ = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
ПользовательИБ. Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ. АутентификацияСтандартная = Истина ;
ПользовательИБ. Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ. ПолноеИмя = ФИОСоздаваемогоПользователя;
ПользовательИБ. ПоказыватьВСпискеВыбора = Истина ;
ПользовательИБ. ОсновнойИнтерфейс = Пользователь_Шаблон. ОсновнойИнтерфейс;
ПользовательИБ. Язык = Пользователь_Шаблон. Язык;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные. Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ. Добавить( ) ;
СтрокаСписокаДоступныхРолей. Представление = мРоль. Представление( ) ;
СтрокаСписокаДоступныхРолей. Значение = мРоль;
КонецЦикла ;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон. Роли. Содержит( СтрокаСпискаДоступныхРолей. Значение) Тогда
ПользовательИБ. Роли. Добавить( СтрокаСпискаДоступныхРолей. Значение) ;
КонецЕсли ;
КонецЦикла ;
ПользовательИБ. Записать( ) ;
НовыйПользователь = Справочники. Пользователи. СоздатьЭлемент( ) ;
НовыйПользователь. Код = ФИОСоздаваемогоПользователя;
НовыйПользователь. Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь. Родитель = ПользовательНастроек. Родитель;
НовыйПользователь. Подразделение = ПользовательНастроек. Подразделение;
НовыйПользователь. Категория = ПользовательНастроек. Категория;
НовыйПользователь. Руководитель = ПользовательНастроек. Руководитель;
НовыйПользователь. Действует = ПользовательНастроек. Действует;
НовыйПользователь. Записать( ) ;
НаборПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборПользователя. Отбор. Пользователь. Установить( ПользовательНастроек) ;
НаборПользователя. Прочитать( ) ;
НаборНовогоПользователя = РегистрыСведений. НастройкиПользователей. СоздатьНаборЗаписей( ) ;
НаборНовогоПользователя. Отбор. Пользователь. Установить( НовыйПользователь. Ссылка) ;
Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя. Добавить( ) ;
ЗаполнитьЗначенияСвойств( НоваяСтрокаНастроек, СтрокаНастроек) ;
НоваяСтрокаНастроек. Пользователь = НовыйПользователь. Ссылка;
Если Найти( СтрокаНастроек. Настройка. Наименование, "Основной ответственный" ) Тогда
НоваяСтрокаНастроек. Значение = НовыйПользователь. Ссылка;
КонецЕсли ;
КонецЦикла ;
Если НаборНовогоПользователя. Количество( ) > 0 Тогда
НаборНовогоПользователя. Записать( ) ;
КонецЕсли ;
сообщить( "Создан пользователь " + ФИОСоздаваемогоПользователя) ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка" ;
Запрос. УстановитьПараметр( "Пользователь" , ПользовательНастроек) ;
РезультатЗапроса = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = РезультатЗапроса. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
объ = ВыборкаДетальныеЗаписи. Ссылка. ПолучитьОбъект( ) ;
НоваяСтрока = объ. ПользователиГруппы. Добавить( ) ;
НоваяСтрока. Пользователь = НовыйПользователь. Ссылка;
объ. Записать( ) ;
КонецЦикла ;
Иначе
сообщить( "Указанное ФИО Пользователя уже используется !!! " ) ;
КонецЕсли ;
КонецПроцедуры
еще пример:
Код 1C v 8.х Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
Пользователь = ПользователиИнформационнойБазы. НайтиПоИмени( ИмяПользователя) ;
Если Пользователь = Неопределено Тогда
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы. ПолучитьПользователей( ) Цикл
Если ТекущийПользователь. ПользовательОС = ДоменноеИмя Тогда
Пользователь = ТекущийПользователь;
Прервать ;
Конецесли ;
КонецЦикла ;
КонецЕсли ;
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
КонецЕсли ;
Пользователь. АутентификацияОС = АутентификацияОС;
Пользователь. АутентификацияСтандартная = Авторизация1 СПредприятия;
Пользователь. ЗапрещеноИзменятьПароль = Истина ;
Пользователь. Имя = ИмяПользователя;
Пользователь. ПолноеИмя = ИмяПользователя;
Пользователь. ПоказыватьВСпискеВыбора = Ложь ;
Пользователь. ПользовательОС = ДоменноеИмя;
Пользователь. Роли. Очистить( ) ;
МассивИменРолей = Новый Массив( ) ;
Для Каждого Роль Из МассивРолей. Role Цикл
МассивИменРолей. Добавить( Роль) ;
КонецЦикла ;
ТекстЗапроса = "ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|ГДЕ
| ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)" ;
Запрос = Новый Запрос( ТекстЗапроса) ;
Запрос. УстановитьПараметр( "МассивИменРолей" , МассивИменРолей) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) ;
Для Каждого Роль Из Результат Цикл
НайденнаяРоль = Метаданные. Роли. Найти( Роль. Имя) ;
Если НайденнаяРоль < > Неопределено Тогда
Пользователь. Роли. Добавить( НайденнаяРоль) ;
КонецЕсли ;
КонецЦикла ;
Пользователь. Записать( ) ;
Если Не ПользовательАктивен Тогда
ДективироватьПользователя( Пользователь) ;
КонецЕсли ;
ЗаполнитьСправочникПользователя( Пользователь) ;
Возврат Истина ;
КонецФункции
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ИСТИНА КАК ЕстьПользователь,
| Пользователи.Ссылка КАК Пользователь
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЛОЖЬ,
| NULL" ;
Запрос = Новый Запрос( ТекстЗапроса) ;
Запрос. УстановитьПараметр( "ИдентификаторПользователяИБ" , ПользовательИБ. УникальныйИдентификатор) ;
Результат = Запрос. Выполнить( ) . Выгрузить( ) [0 ];
ОписаниеПользователя = Пользователи. НовоеОписаниеПользователяИБ( ) ;
Если Результат. ЕстьПользователь Тогда
ПользовательОбъект = Результат. Пользователь. ПолучитьОбъект( ) ;
Иначе
ПользовательОбъект = Справочники. Пользователи. СоздатьЭлемент( ) ;
ПользовательОбъект. ИдентификаторПользователяИБ = ПользовательИБ. УникальныйИдентификатор;
ПользовательОбъект. Наименование = ПользовательИБ. Имя;
ОписаниеПользователя. Вставить( "Действие" , "Записать" ) ;
ПользовательОбъект. ДополнительныеСвойства. Вставить( "ОписаниеПользователяИБ" , ОписаниеПользователя) ;
КонецЕсли ;
ЗаполнитьЗначенияСвойств( ОписаниеПользователя, ПользовательИБ) ;
Для Каждого Элемент Из ОписаниеПользователя Цикл
ПользовательОбъект. ДополнительныеСвойства. Вставить( Элемент. Ключ, Элемент. Значение) ;
КонецЦикла ;
ПользовательОбъект. ДополнительныеСвойства. Удалить( "Роли" ) ;
ПользовательОбъект. Записать( ) ;
КонецПроцедуры
Категория:
Пользователь, роль доступа, интерфейс Некоторые особенности работы с настройками прав доступа пользователей в типовых конфигурациях на УФ Разработчики в управляемых приложениях применили новый механизм настройки прав доступа, о которых и пойдет речь.
Будут перечислены все те грабли, которые собрал автор, чтобы вы о них знали.
Наверняка, уже все знают, что из себя представляет новая система, поэтому предистория вкрадце:
Как было раньше( в обычном приложении):
Есть документ. Есть Роли - ПолныеПрава, ДокументНетДоступа, ДокументТолькоЧтение, ДокументЧтениеИРедактирование. В конфигураторе(аналогичный механизм в реж предприятия) вы выставляете пользователям эти роли и у них появляются соответствующие права доступа на документ. Все просто и скучно и даже зевать хочется.
С введением управляемого приложения разработчики решили усложнить(читается как расширить) настройки прав доступа.
Теперь:
Вводная та же. Чтобы дать пользователю какие-то права на документ - сначала вам необходимо создать элемент справочника Профили групп доступа. Это некий агрегирующий(суммирующий значения) объект, который объединяет роли в группы ролей. Теоритически таких профилей можно создать сколько угодно много с различным набором ролей( N*(n-1), где N - количество ролей), но на практике количество профилей определяется количеством должностных обязанностей пользователей в организации и их гораздо меньше, чем ролей.
Создаем профили Бесправный(с ролью ДокументНетДоступа), Аудитор(с ролью ДокументТолькоЧтение), Бухгалтер(с ролью ДокументЧтениеИРедактирование).
Чтобы "привязать" эти профили к пользователям - нужно создать элементы справочника ГруппыДоступа. В типовых они создаются автоматически, когда вы отмечаете галочками профили для пользователя. Этот справочник соединяет профиль и пользователя(или нескольких пользователей).
При записи этого элемента справочника система автоматически добавляет роли (из профиля) в роли пользователя. Поэтому не стоит напрямую редактировать роли в конфигураторе, как раньше - при редактировании прав в Предприятии все роли в конфигураторе будут обновлены на роли из профилей пользователя. Кроме того, будет наблюдаться явное противоречение между набором профилей с ролями и ролями, установленными в конфигураторе.
Как хранятся роли в Профиле групп доступа, спросите вы. Ведь роли - это объекты МД, это не ссылочные типы. Отвечаю - для этого(и не только) разработчики создали служебный справочник ИдентификаторыОбъектовМетаданных, в котором хранится( в иерархии!) имена, синонимы, значения пустых ссылок всех объектов МД. Если вы хотите создать Профиль программно и добавить в него роль, то код примерно будет таким:
Код 1C v 8.2 УП РодительРоли = Справочники. ИдентификаторыОбъектовМетаданных. НайтиПоНаименованию( "Роли" ) ;
ИдентификаторМоейРоли = Справочники. ИдентификаторыОбъектовМетаданных. НайтиПоРеквизиту( "Имя" , "МояРоль" , РодительРоли) ;
Если ЗначениеЗаполнено( ИдентификаторМоейРоли) Тогда
НайденныйИдентификаторМоейРоли = МойПрофиль. Роли. Найти( ИдентификаторМоейРоли ) ;
Если НайденныйИдентификаторМоейРоли= неопределено тогда
НовСтрока = МойПрофиль. Роли. Добавить( ) ;
НовСтрока. Роль = ИдентификаторМоейРоли;
КонецЕсли ;
КонецЕсли ;
Но если мы добавили новую роль в конфигурации, то как она попадет в справочник? Хороший вопрос. У справочника ИдентификаторыОбъектовМетаданных есть метод, позволяющий обновлять его данные. это:
Код 1C v 8.2 УП Справочники. ИдентификаторыОбъектовМетаданных. ОбновитьДанныеСправочника( ИСТИНА , ЛОЖЬ , ЛОЖЬ ) ;
Процедуру следует запускать каждый раз, когда вы вносите изменения в метаданные, особенно когда изменяете роли, объекты, связанные с новыми ролями.
Отлично. Роль добавили, идентификаторы обновили.
Но обратная связь не работает - вы в режиме предприятия назначили пользователю профиль( с созданием группы доступа), а роль у пользователя в конфигураторе не добавилась! Что делать?
За синхронизацию ролей/профилей отвечает константа ПараметрыРаботыПользователей. Если роли не обновляются в конфигураторе, следует обновить её значение:
Код 1C v 8.2 УП Константы. ПараметрыРаботыПользователей. СоздатьМенеджерЗначения( ) . ОбновитьОбщиеПараметры( ) ;
Хорошо, скажите вы. А как быть, если я хочу создать группы доступа программно? Да не вопрос. Единственное ограничение - не допускаются дубли связок Профиль-Пользоваль в группах доступа. Примерный код будет таким:
Код 1C v 8.2 УП
Если МойПрофиль = Справочники. ПрофилиГруппДоступа. Администратор Тогда
ГруппаДоступаАдм = Справочники. ГруппыДоступа. Администраторы;
Если ГруппаДоступаАдм. Пользователи. Найти( МойПользователь) = неопределено Тогда
ГруппаДоступаАдмОб= ГруппаДоступаАдм. ПолучитьОбъект( ) ;
НовСтрока = ГруппаДоступаАдмОб. Пользователи. Добавить( ) ;
НовСтрока. Пользователь = МойПользователь;
ГруппаДоступаАдмОб. Записать( ) ;
КонецЕсли ;
Иначе
Запрос = новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
|ГруппыДоступа.Ссылка
|ИЗ
|Справочник.ГруппыДоступа КАК ГруппыДоступа
|ГДЕ
|ГруппыДоступа.Профиль = &Профиль
|И (ГруппыДоступа.Пользователь = &Пользователь
|ИЛИ ГруппыДоступа.Пользователи.Пользователь = &Пользователь)
|И НЕ ГруппыДоступа.ПометкаУдаления " ;
Запрос. УстановитьПараметр( "Профиль" , МойПрофиль) ;
Запрос. УстановитьПараметр( "Пользователь" , МойПользователь) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если НЕ Выборка. Следующий( ) тогда
МояГруппаДоступаОб = справочники. ГруппыДоступа. СоздатьЭлемент( ) ;
МояГруппаДоступаОб. Наименование = Строка( МойПрофиль) ;
МояГруппаДоступаОб. Пользователь = мойПользователь;
Нов = МояГруппаДоступаОб. Пользователи. Добавить( ) ;
Нов. Пользователь = МойПользователь;
МояГруппаДоступаОб. Профиль = МойПрофиль;
МояГруппаДоступаОб. Записать( ) ;
КонецЕсли ;
КонецЕсли ;
После выполнения этого кода, если все, что нужно обновлено - типовая конфигурация добавит пользователю роли.
Раз уж пошли по программному пути, вот код, который добавляет пользователя в справочник Пользователи и ПользователяИБ в ПользователиИнформационнойБазы:
Код 1C v 8.2 УП ПользовательИБ = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
ПользовательИБ. имя = "Иванов" ;
ПользовательИБ. ПолноеИмя = "Иванов Иван Иванович" ;
ПользовательИБ. АутентификацияСтандартная = ИСТИНА ;
ПользовательИБ. Пароль = "" ;
ПользовательИБ. записать( ) ;
Пользователь = Справочники. Пользователи. НайтиПоРеквизиту( "ИдентификаторПользователяИБ" , ПользовательИБ. УникальныйИдентификатор) ) ;
если Пользователь. Наименование = "" Тогда
ПользовательОб = Справочники. Пользователи. СоздатьЭлемент( ) ;
ОписаниеПользователяИБ = Пользователи. НовоеОписаниеПользователяИБ( ) ;
ЗаполнитьЗначенияСвойств( ОписаниеПользователяИБ, ПользовательИБ) ;
ОписаниеПользователяИБ. УникальныйИдентификатор = Соединение. NewObject( "УникальныйИдентификатор" , ПользовательИБ. УникальныйИдентификатор) ;
ПользовательОб. Наименование = ОписаниеПользователяИБ. ПолноеИмя;
ОписаниеПользователяИБ. Вставить( "Действие" , "Записать" ) ;
ПользовательОб. ДополнительныеСвойства. Вставить( "ОписаниеПользователяИБ" , ОписаниеПользователяИБ) ;
ПользовательОб. записать( ) ;
КонецЕсли ;
Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользовательИБ у вас сам создатся.
И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователемИБ, которого нет в справочнике Пользователи.
Автор: Stim - Источник
Категория:
Управляемое приложение, Тонкий клиент Как ограничить пользователя только одним сеансом В восьмой версии 1С нет штатного способа ограничить пользователя использованием только одного сеанса, это сделано потому что теперь при необходимости система может создавать от имени пользователя дополнительные сеансы в которых выполняются какие-то вспомогательные обработки. Например, когда формируется отчет, обработка данных происходит в фоновом задании, которое видно в списке активных пользователей отдельной строкой. С другой стороны это дает возможность пользователям открывать окно приложения несколько раз, на одном или разных компьютерах. Чтобы бороться с этим нужно применять программные методы.
С помощью функции ПолучитьСоединенияИнформационнойБазы() можно получить массив, который будет содержать информацию о всех подключениях, активных на момент обращения к функции, т.е. каждый элемент массива будет соответствовать одному соединению. Получается, что задача сводится к перебору элементов массива и подсчету количества сеансов открытых текущим пользователем.
Вот пример функции, которая возвращает Истина, если количество сеансов больше одного. Нужно обратить внимание, что подсчитываются только сеансы, у которых имя приложения равно 1CV8 (толстый клиент) или 1CV8C (тонкий клиент). Другие возможные имена приложений: Designer (конфигуратор), BackgroundJob (фоновое задание).
Код 1C v 8.х Функция ПроверкаОткрытогоСеансаТекушегоПользователя() Экспорт
ТекущийПользовательИБ = ПользователиИнформационнойБазы. ТекущийПользователь( ) ;
СоединенияИБ = ПолучитьСоединенияИнформационнойБазы( ) ;
СеансОткрыт = Ложь ;
Для каждого СоединениеИБ Из СоединенияИБ Цикл
Если Найти( СоединениеИБ. ИмяПриложения, "1CV8" ) = О Тогда
Продолжить; КонецЕсли ;
Если СоединениеИБ. Пользователь. УникальныйИдентификатор = ТекушийПользовательИБ. УникальныйИдентификатор Тогда
Если СеансОткрыт Тогда
Возврат Истина ;
Иначе
СеансОткрыт = Истина ;
КонецЕсли ;
КонецЕсли ;
КокецЦикла;
Возврат Ложь ;
КокецФуккции
Еще замечание — эта функция должна выполняться на сервере, пользователь, для которого выполняется проверка, от имени которого выполняется функция, должен иметь доступ к просмотру активных соединений.
Категория:
Администрирование Как получить основной интерфейс пользователя? Список текущий интефейсов:
Код 1C v 8.х Для каждого Интерфейс Из Метаданные. Интерфейсы Цикл
Если ГлавныйИнтерфейс[Интерфейс. Имя]. Видимость Тогда
КонецЕсли ;
КонецЦикла ;
Код 1C v 8.х
ПользователиИнформационнойБазы. ТекущийПользователь( ) . ОсновнойИнтерфейс
ПользователиИнформационнойБазы. Пользователь. ОсновнойИнтерфейс
Категория:
Пользователь, роль доступа, интерфейс Форма ~ Отбор, Группировка, Порядок и Условное оформление через компоновку данных Выполним отбор по подразделению, если основной интерфейс пользователя кассир.
Код 1C v 8.х Если ПользователиИнформационнойБазы. ТекущийПользователь( ) . ОсновнойИнтерфейс. Имя = "ИнтерфейсКассира" Тогда
ДокументСписок. Отбор. Сбросить( ) ;
ДокументСписок. Отбор. Подразделение. ВидСравнения= ВидСравнения. Равно;
ДокументСписок. Отбор. Подразделение. Значение= ПараметрыСеанса. ТекущийПользователь. Подразделение;
ДокументСписок. Отбор. Подразделение. Установить( ) ;
Элементыформы. Список. НастройкаОтбора. Подразделение. Доступность = Ложь ;
КонецЕсли ;
Выполним отбор по дате в форме списка документа.
Код 1C v 8.2 УП ЭлементОтбора = Список. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "Дата" ) ;
ЭлементОтбора. Использование = Истина ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. БольшеИлиРавно;
ЭлементОтбора. ПравоеЗначение = Дата1 ;
ЭлементОтбора. РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Обычный;
Элементы. Список. Обновить( ) ;
Группировка. Сгруппируем список документов по полю Клиент.
Код 1C v 8.2 УП ЭлементГруппировки = Список. Группировка. Элементы. Добавить( Тип( "ПолеГруппировкиКомпоновкиДанных" ) ) ;
ЭлементГруппировки. Использование = Истина ;
ЭлементГруппировки. Поле = Новый ПолеКомпоновкиДанных( "Клиент" ) ;
Элементы. Список. Обновить( ) ;
Порядок. Отсортируем список документов по полю ПлановаяДатаПоставки.
Код 1C v 8.2 УП Список. Порядок. Элементы. Очистить( ) ;
НовыйПорядок = Список. Порядок. Элементы. Добавить( Тип( "ЭлементПорядкаКомпоновкиДанных" ) ) ;
НовыйПорядок. Поле = Новый ПолеКомпоновкиДанных( "Список.ПлановаяДатаПоставки" ) ;
НовыйПорядок. Использование = Истина ;
НовыйПорядок. РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Обычный;
НовыйПорядок. ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных. Возр;
Элементы. Список. Обновить( ) ;
Условное оформление. Покрасим в красный цвет строки списка документов с незаполненной датой согласования счета.
Код 1C v 8.2 УП ЭлементОформления = Список. УсловноеОформление. Элементы. Добавить( ) ;
ЭлементОтбора = ЭлементОформления. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "ДатаСогласованияСчета" ) ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. НеЗаполнено;
ЭлементОтбора. Использование = Истина ;
Элемент = ЭлементОформления. Оформление. Элементы[1 ];
Элемент. Использование = Истина ;
Элемент. Значение = Новый Цвет( 255 , 0 , 0 ) ;
Категория:
Работа с Формой (Диалог) и её элементами Принудительная установка пароля пользователям, работающим без пароля! Чтоб заставить всех, кто работает без пароля, установить пароль. Можно применить программный ограничитель. Для этого в модуле приложения добавляем функцию:
Код 1C v 8.х
Функция ПроверитьИзменитьПарольПользователя()
ТекПользовательИБ = ПользователиИнформационнойБазы. ТекущийПользователь( ) ;
Если Не ТекПользовательИБ. ПарольУстановлен Тогда
ФВП = ПолучитьОбщуюФорму( "ФормаВводаПароля" ) ;
ФВП. Заголовок = "Установите пароль на вход в 1С (не менее 6 симв.)" ;
ФВП. ОткрытьМодально( ) ;
Если ЗначениеЗаполнено( ФВП. Пароль) Тогда
Пароль1 = ФВП. Пароль;
Если СтрДлина( Пароль1 ) < 6 Тогда
Предупреждение( "Длина пароля должна быть не менее 6 символов!" ) ;
Возврат Ложь ;
КонецЕсли ;
ФВП = ПолучитьОбщуюФорму( "ФормаВводаПароля" ) ;
ФВП. Заголовок = "Повторите новый пароль" ;
ФВП. ОткрытьМодально( ) ;
Если ЗначениеЗаполнено( ФВП. Пароль) Тогда
Пароль2 = ФВП. Пароль;
Если Пароль1 < > Пароль2 Тогда
Предупреждение( "Не совпадают пароли!" ) ;
Возврат Ложь ;
Иначе
ТекПользовательИБ. Пароль = Пароль1 ;
ТекПользовательИБ. Записать( ) ;
Возврат Истина ;
КонецЕсли ;
Иначе
Возврат Ложь ;
КонецЕсли ;
Иначе
Возврат Ложь ;
КонецЕсли ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
и в предопредленной процедуре ПриНачалеРаботыСистемы (мы не можем использовать ПередНачаломРаботыСистемы т.к. в ней еще не существует окна программы и нет возможности открыть общую форму ввода пароля) делаем вызов
Код 1C v 8.х
Если Не ПроверитьИзменитьПарольПользователя( ) Тогда
ЗавершитьРаботуСистемы( Ложь ) ;
Возврат ;
КонецЕсли ;
источник Категория:
Администрирование Как выгрузить журнал регистрации в XML-формате? Код 1C v 8.х ВыгрузитьЖурналРегистрации( "C:\log.xml" ) ;
Пользователи = ПользователиИнформационнойБазы. ПолучитьПользователей( ) ;
Для Каждого Пользователь из Пользователи Цикл
НовыйЭлемент = СписокПользователей. Добавить( ) ;
НовыйЭлемент. Пометка = Истина ;
НовыйЭлемент. Значение = Пользователь;
НовыйЭлемент. Представление = Пользователь. Имя;
КонецЦикла ;
Массив = Новый Массив;
Для Каждого Пользователь Из СписокПользователей Цикл
Если Пользователь. Пометка Тогда
Массив. Добавить( Пользователь) ;
КонецЕсли ;
КонецЦикла ;
СтруктураФильтра = Новый Структура;
СтруктураФильтра. Вставить( "Пользователь" , Массив) ;
ВыгрузитьЖурналРегистрации( "C:\log.xml" , СтруктураФильтра, "Дата, Пользователь, ПредставлениеСобытия" ) ;
Категория:
Встроенные Функции Смена пароля у всех пользователей, у которых отсутствует пароль Код 1C v 8.х Пользователи = ПользователиИнформационнойБазы. ПолучитьПользователей( ) ;
Для Каждого Пользователь Из Пользователи Цикл
Если НЕ Пользователь. ПарольУстановлен Тогда
Пользователь. АутентификацияСтандартная = Истина ;
Пользователь. Пароль = "НужныйПароль" ;
Пользователь. Записать( ) ;
КонецЕсли ;
КонецЦикла ;
Категория:
Пользователь, роль доступа, интерфейс Полезные процедуры работы с Active Directory (AD) Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка objNameSpace = ПолучитьCOMОбъект( "WinNT:" ) ;
м = Новый Массив( ) ; м. Добавить( "domain" ) ;
м2 = Новый COMSafeArray( м, "VT_VARIANT" ) ;
objNameSpace. Filter = м2 ;
Для каждого item Из objNameSpace Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "GlobalGroup" ) Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка objNameSpace = ПолучитьCOMОбъект( "WinNT://" + СокрЛП( ИмяДомена) ) ;
м = Новый Массив( ) ;
м. Добавить( ТипГрупп) ;
м2 = Новый COMSafeArray( м, "VT_VARIANT" ) ;
objNameSpace. Filter = м2 ;
Для каждого item Из objNameSpace Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
Результат = Новый Массив( ) ;
objNameSpace = "" ;
Попытка
objNameSpace = ПолучитьCOMОбъект( "WinNT://" + СокрЛП( ИмяДомена) + "/" + СокрЛП( ИмяГруппы) + ", Group" ) ;
Для каждого item Из objNameSpace. Members( ) Цикл
Результат. Добавить( item. Name) ;
КонецЦикла ;
Исключение
Результат. Очистить( ) ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
Массив = ПолучитьСписокПользователейВГруппеДомена ( СокрЛП( ИмяДомена) , ИмяГруппы) ;
Для каждого элМассив из Массив Цикл
Если ВРег( элМассив) = ВРег( СокрЛП( ИмяПользователя) ) Тогда
Результат = Истина ;
Прервать ;
КонецЕсли ;
КонецЦикла ;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
element_user = "" ;
element_group = "" ;
Попытка
element_user = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user" ) ;
element_group = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group" ) ;
element_group. Add( element_user. ADsPath) ; element_group. SetInfo( ) ;
Результат = Истина ;
Исключение
Результат = Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь ;
element_user = "" ;
element_group = "" ;
Попытка element_user = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user" ) ;
element_group = ПолучитьCOMОбъект( "WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group" ) ;
element_group. Remove( element_user. ADsPath) ;
element_group. SetInfo( ) ;
Результат = Истина ;
Исключение
Результат = Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект( "" , "ADODB.Connection" ) ;
conn. Provider = "ADSDSOObject" ;
conn. Open( "Active Directory Provider" ) ;
Исключение Предупреждение( "Ошибка подключения к Active Directory!" ) ;
Возврат ;
КонецПопытки ;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока( Стр. Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC=" + СокрЛП( Домен. Код) + "' WHERE SAMAccountName='" + Стр. Логин+ "'" ;
rs = conn. Execute( query) ;
Пока НЕ rs. EOF( ) Цикл
obj = ПолучитьCOMОбъект( rs. Fields( 0 ) . Value) ;
Если obj. Class= "user" Тогда
Стр. НоваяПочта= СокрЛП( obj. EmailAddress) ;
Если Стр. НоваяПочта< > Стр. СтараяПочта Тогда
Стр. Установить= Истина ;
КонецЕсли ;
КонецЕсли ;
rs. MoveNext( ) ;
КонецЦикла ;
Исключение
Сообщить( "Ошибка получения почты для логина :" + Стр. Логин) ;
КонецПопытки ;
КонецЕсли ;
КонецЦикла ;
conn. Close( ) ;
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ( "WbemScripting.SWbemLocator" ) ;
Серв = COM. ConnectServer( СокрЛп( ИмяКомпьютера) , "\root\cimv2" , СокрЛП( Логин) , СокрЛП( Пароль) ) ;
СписокПроцессов = Серв. execQuery( "Sel ect * fr om Win32_Process Where Name = '" + СокрЛП( НазваниеПроцесса) + "'" ) ;
Для каждого item Из СписокПроцессов Цикл
item. Terminate( ) ;
КонецЦикла ;
Исключение
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
Код 1C v 8.х
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес= "" ;
ПользовательИБ= ПользователиИнформационнойБазы. НайтиПоИмени( СокрЛП( СсылкаПользователь. Код) ) ;
Если ПользовательИБ< > Неопределено Тогда
Если ПользовательИБ. АутентификацияОС Тогда
ПользовательОС= СтрЗаменить( ПользовательИБ. ПользовательОС, "\" , "/" ) ;
Попытка
ЮзерАД= ПолучитьCOMОбъект( "WinNT:" + ПользовательОС+ ",user" ) ;
LDAP= ПолучитьCOMОбъект( "LDAP://CN=" + ЮзерАД. FullName+ ",OU=Common Users,OU=Regular Users,DC=" + Домен+ ",DC=local" ) ;
Адрес= LDAP. Mail;
Исключение
КонецПопытки ;
КонецЕсли ;
КонецЕсли ;
Возврат Адрес;
КонецФункции
Категория:
COM-объекты, WMI, WSH Как получить Имя Пользователя? Код 1C v 8.2 УП &НаКлиенте
Процедура СообщитьИмяПользователя(Команда)
Сообщить( ПолучитьПользователя( ) ) ;
КонецПроцедуры
&НаСервере
Функция ПолучитьПользователя()
Перем ВыбПользователь;
ВыбПользователь = ПользователиИнформационнойБазы. ТекущийПользователь( ) ;
Возврат ВыбПользователь. Имя;
КонецФункции ;
Сообщить( ИмяПользователя( ) ) ;
Сообщить( ПолноеИмяПользователя( ) ) ;
Код 1C v 8.х ИмяПользователя = ИмяПользователя( ) ;
Если ПустаяСтрока( ИмяПользователя) Тогда
ИмяПользователя = "НеАвторизован" ;
Иначе
ИмяПользователя = ПолноеИмяПользователя( ) ;
КонецЕсли ;
Код 1C v 7.x Сообщить( ИмяПользователя( ) )
Сообщить( ПолноеИмяПользователя( ) )
Категория:
Пользователь, роль доступа, интерфейс Сохранение рабочей конфигурации в файл средствами встроенного языка Как сохранить рабочую конфигурацию из конфигуратора знают все, но это не всегда удобно. Мне понадобилось сохранять рабочую конфигурацию и тут-же этот файл обрабатывать. Предлагаю простую процедуру:
Код 1C v 8.х
функция СохранитьТекущуюКонфигурацию (Логин, Пароль, ИмяФайла="" ) экспорт
результат = Ложь ;
Если ИмяФайла = "" Тогда
ИмяФайла = КаталогВременныхФайлов( ) + "1Cv8.cf" ;
КонецЕсли ;
СтрокаБазы = СтрокаСоединенияИнформационнойБазы( ) ;
Если Лев( СтрокаБазы, 5 ) = "File=" Тогда
СтрокаБазы = Сред( СтрокаБазы, 6 , СтрДлина( СтрокаБазы) - 6 ) ;
Иначе
возврат Ложь ;
КонецЕсли ;
ВыбФайл = Новый Файл( ИмяФайла) ;
Если ВыбФайл. Существует( ) Тогда
Сигнатура = Строка( ВыбФайл. Размер( ) ) + Строка( ВыбФайл. ПолучитьВремяИзменения( ) ) ;
Иначе
Сигнатура = "" ;
КонецЕсли ;
СтрокаЗапуска = """ " + КаталогПрограммы( ) + "1cv8.exe"" CONFIG /F " + СтрокаБазы
+ ? ( Логин = "" , "" , " /N " + Логин)
+ ? ( Пароль = "" , "" , " /P " + Пароль) + " /DumpDBCfg "" " + ИмяФайла + """ " ;
WshShell = Новый COMОбъект( "WScript.Shell" ) ;
WshShell. Run( СтрокаЗапуска, 0 , Истина ) ;
ВыбФайл = Новый Файл( ИмяФайла) ;
Если ВыбФайл. Существует( ) Тогда
НоваяСигнатура = Строка( ВыбФайл. Размер( ) ) + Строка( ВыбФайл. ПолучитьВремяИзменения( ) ) ;
Если Сигнатура < > НоваяСигнатура Тогда
Результат = Истина ;
КонецЕсли ;
КонецЕсли ;
Возврат Результат;
КонецФункции
ну и пример использования (работает если нет пароля):
Код 1C v 8.х Функция ЗаписатьКонфигурациюВФайл(ИмяФайла="" )
Результат = Ложь ;
ВыбФайл = Новый Файл( ИмяФайла) ;
Если ВыбФайл. Существует( ) Тогда
Если ВыбФайл. ЭтоКаталог( ) Тогда
ИмяФайла= "" ;
КонецЕсли ;
КонецЕсли ;
Попытка
Массив = ПользователиИнформационнойБазы. ПолучитьПользователей( ) ;
Логин = "" ;
Пароль = "" ;
Если Массив. Количество( ) > 0 тогда
Пользователь = ПользователиИнформационнойБазы. ТекущийПользователь( ) ;
Логин = Пользователь. Имя;
Если Пользователь. ПарольУстановлен Тогда
Предупреждение( "У Вас установлен пароль, этот режим сейчас не доступен" ) ;
Возврат Ложь ;
КонецЕсли
КонецЕсли ;
Результат = СохранитьТекущуюКонфигурацию( Логин, Пароль, ИмяФайла) ;
Если не Результат Тогда
Предупреждение( "Конфигурация не сохранена" ) ;
Иначе
Сообщить( "Конфигурация успешно сохранена в файл: " + ИмяФайла) ;
КонецЕсли ;
Исключение
Предупреждение( "У Вас не достаточно прав для сохранения конфигурации" ) ;
Возврат Ложь ;
КонецПопытки ;
Возврат Результат;
КонецФункции
Автор статьи: vde69 Категория:
Полезные, Универсальные Функции Как программно добавить пользователя в информационную базу? При переносе данных из одной информационной базы в другую может возникнуть необходимость перенести и пользователей информационной базы. Для этого можно воспользоваться свойством глобального контекста ПользователиИнформационнойБазы
Добавление пользователя информационной базы
Код 1C v 8.х НовыйПользователь = ПользователиИнформационнойБазы. СоздатьПользователя( ) ;
НовыйПользователь. Имя = "Имя" ;
НовыйПользователь. ПолноеИмя = "Фамилия Имя Отчество" ;
НовыйПользователь. АутентификацияСтандартная = Истина ;
НовыйПользователь. ОсновнойИнтерфейс = Метаданные. Интерфейсы. Администратор;
НовыйПользователь. Пароль = "пароль" ;
НовыйПользователь. Роли. Добавить( Метаданные. Роли. Администратор) ;
НовыйПользователь. ПоказыватьВСпискеВыбора = Ложь ;
НовыйПользователь. Язык = Метаданные. Языки. Русский;
НовыйПользователь. Записать( ) ;
Следует отметить, что в свойство Пароль можно только записать новый пароль, прочитать записанный (определенный) ранее нет возможности.
Добавление новых пользователей в информационную базу может осуществлять пользователь, обладающий административными правами. Если административные права у пользователя отсутствуют, он может изменить только ограниченный набор сведений о себе.
Для того чтобы предоставить, например, менеджеру, не имеющему административных прав, возможность добавления новых пользователей с правами менеджера, можно поступить следующим образом.
Создать обработку, с помощью которой менеджер будет задавать имя, пароль, набор ролей и другие свойства нового пользователя. Однако запись нового пользователя выполнять не на клиенте, а на сервере, передав нового пользователя в качестве параметра в процедуру привилегированного модуля.
Вызов процедуры привилегированного модуля
Код 1C v 8.х ЗаписатьНовогоПользователя( НовыйПользователь) ;
В этом случае система не будет выполнять проверку прав пользователя, поэтому о проверке необходимых прав нужно позаботиться самостоятельно. Например, процедура привилегированного модуля может выглядеть следующим образом.
Текст процедуры привилегированного модуля
Код 1C v 8.х Процедура ЗаписатьНовогоПользователя(НовыйПользователь) Экспорт
РольАдминистратор = Метаданные. Роли. Администратор;
Если НовыйПользователь. Роли. Содержит( РольАдминистратор) Тогда
Сообщить( "Добавление пользователя с административными правами запрещено" ) ;
Иначе
Если РольДоступна( РольАдминистратор) ИЛИ РольДоступна( Метаданные. Роли. Менеджер) Тогда
НовыйПользователь. Записать( ) ;
Иначе
Сообщить( "Недостаточно прав доступа для добавления пользователя" ) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
Если выполняется попытка добавить нового пользователя с административными правами, выдается запрет. Если набор ролей нового пользователя не содержит роль Администратор, проверяется, является ли текущий пользователь менеджером или администратором, и если это так, то выполняется запись нового пользователя. В противном случае выдается сообщение об отсутствии прав доступа.
Категория:
Пользователь, роль доступа, интерфейс Как получить данные о зарегистрированных пользователях информационной базы? Получение данных о пользователях
Код 1C v 8.х Выборка = ПользователиИнформационнойБазы. ПолучитьПользователей( ) ;
Для Каждого ЭлементМассива Из Выборка Цикл
ИмяПользователя = ЭлементМассива. Имя;
ПолноеИмяПользователя = ЭлементМассива. ПолноеИмя;
ЕстьПароль = ЭлементМассива. ПарольУстановлен;
Роли = ЭлементМассива. Роли;
Для Каждого Роль Из Роли Цикл
ИмяРоли = Роль. Имя;
КонецЦикла ;
КонецЦикла ;
В указанной процедуре работа по получению списка пользователей начинается с обращения к свойству глобального контекста ПользователиИнформационнойБазы. Метод ПолучитьПользователей() возвращает массив объектов ПользовательИнформационнойБазы, который обходится потом в цикле.
Для 1С 7.7 посмотрите Пример получения списка пользователей из файла users.usr Категория:
Пользователь, роль доступа, интерфейс Как получить список зарегистрированных пользователей базы 1С Код 1C v 8.х Выборка = ПользователиИнформационнойБазы. ПолучитьПользователей( ) ;
Для Каждого ЭлементМассива Из Выборка Цикл
ИмяПользователя = ЭлементМассива. Имя;
ПолноеИмяПользователя = ЭлементМассива. ПолноеИмя;
ЕстьПароль = ЭлементМассива. ПарольУстановлен;
Роли = ЭлементМассива. Роли;
Для Каждого Роль Из Роли Цикл
ИмяРоли = Роль. Имя;
КонецЦикла ;
КонецЦикла ;
Код 1C v 7.x
функция сзПолучитьПользователей(стрПутьКБазе)
Ответ = создатьобъект( "СписокЗначений" ) ;
стрИмяФайла = стрПутьКБазе + "\UsrDEF\Users.USR" ;
если фс. СуществуетФайл( стрИмяФайла) > 0 тогда
обФСО = создатьобъект( "Scripting.FileSystemObject" ) ;
тхтФайл = обФСО. OpenTextFile( стрИмяФайла) ;
стрБуфер = "" ;
чисПозиция = 0 ;
пока тхтФайл. AtEndOfStream = 0 цикл
чисПозиция = чисПозиция + 1 ;
стрСимв = тхтФайл. Read( 1 ) ;
если кодсимв( стрСимв) > 31 тогда
стрБуфер = стрБуфер + стрСимв;
конецесли ;
конеццикла ;
стрПоиска = "{"" UserItemType"" ,"" Page." ;
чисПозиция = найти( стрБуфер, стрПоиска) ;
если чисПозиция > 0 тогда
стрБуфер = сред( стрБуфер, чисПозиция) ;
чисПозиция = 1 ;
конецесли ;
пока чисПозиция > 0 цикл
стрБуфер = сред( стрБуфер, чисПозиция + 22 ) ;
чисСмещение = найти( стрБуфер, """ ,"" " ) + 3 ;
стрБуфер = сред( стрБуфер, чисСмещение) ;
стрИмяПользователя = лев( стрБуфер, найти( стрБуфер, """ ,"" " ) - 1 ) ;
Ответ. ДобавитьЗначение( стрИмяПользователя) ;
чисПозиция = найти( стрБуфер, стрПоиска) ;
конеццикла ;
конецесли ;
возврат Ответ;
конецфункции
еще Пример получения списка пользователей из файла users.usr Категория:
Полезные, Универсальные Функции Запись файла в каталог, проверка существования каталога, имя - Уникальный идентификатор пользователя Код 1C v 8.х ЮзерИД= ПользователиИнформационнойБазы. ТекущийПользователь( ) . УникальныйИдентификатор;
КаталогЗаметок = "С:\note\" ;
КаталогНаДиске = Новый Файл( КаталогЗаметок) ;
Если Не КаталогНаДиске. Существует( ) Тогда
СоздатьКаталог( КаталогЗаметок) ;
КонецЕсли ;
ТекстЗаметки. Записать( КаталогЗаметок+ строка( ЮзерИД) + ".txt" ) ;
Категория:
Работа с Файлами и Каталогами