1с и Active Directory

Проводя собеседования на должность программиста 1с, часто задавал такой простой вопрос: Каким образом на прошлом месте работы вы создавали пользователей в 1с? Очень немного соискателей упоминали “Active Directory” (далее по тексту AD). Кто-то говорил что всегда создает их руками, кто-то что это делает бизнес аналитик и т.д. Про AD половина из них даже и не слышала. Значит пора сделать заметку и показать простые примеры работы с этим механизмом.
Microsoft Active Directory – простыми словами это пакет средств, позволяющий проводить различные действия с пользователями в сети. Т.е. пользователь, под которым вы авторизуетесь входя в систему – это и есть элемент AD. Обычно этим инструментом владеет системный администратор.
Получается, когда приходит в компанию новый пользователь, то администратор создает для него учетную запись в AD и после этого он сможет войти в систему на компьютере. Мы можем этим воспользоваться, создав загрузку пользователей в базу 1с из этого места.
Рассмотрим для примера простой шаблон загрузки (данный механизм работает в моей сети, для вашей сети возможны какие-то поправки в плане подключения к AD).
Для начала узнаем у системного администратора где находится данные механизм и знакомимся с ним – просмотрев там все что возможно. Из всего этого нам будут интересные только доступные свойства у пользователей:
- name – Имя пользователя: Иванов Чак Норрис;
- samaccountname – Имя авторизация в домене: IChakNorris
- mail – почтовый ящик: IChakNorris@man.ru
- userAccountControl – свойство, отвечающие за активность аккаунта. В моем домене значения: “514” или “66050” говорят о том что пользователь заблокирован. В вашем может быть немного по другому (читай на https://support.microsoft.com/ru-kz/help/305144. или http://jackstromberg.com/2013/01/useraccountcontrol-attributeflag-values/).

Далее с помощью нехитрого кода считываем эти данные из AD (заметьте что отбираем записи только определенной категории (“Person”) и класса “user”):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
АДОКоннектор = Новый COMОбъект("ADODB.Connection"); АДОКоннектор.ConnectionString = "Provider=""ADsDSOObject"""; АДОКоннектор.Open(); КореньDSE = ПолучитьCOMОбъект("LDAP://rootDSE"); ДоменDNS = КореньDSE.Get("defaultNamingContext"); ТекстЗапроса = "select name, samaccountname, mail, userAccountControl from 'LDAP://" + ДоменDNS + "' WHERE objectCategory = 'Person' AND objectClass= 'user' ORDER BY name"; КомандаАДО = Новый COMОбъект("ADODB.Command"); КомандаАДО.ActiveConnection = АДОКоннектор; КомандаАДО.CommandText = ТекстЗапроса; КомандаАДО.Properties("Page Size").Value = 100; КомандаАДО.Properties("Timeout").Value = 30; КомандаАДО.Properties("Cache Results").Value = Ложь; ВыборкаАДО = КомандаАДО.Execute(); Пока НЕ ВыборкаАДО.EOF Цикл ВыборкаАДО.MoveNext(); КонецЦикла; ВыборкаАДО.Close(); АДОКоннектор.Close(); |
Обращение к полям выборки необходимо так ВыборкаАДО.Fields(“name”).Value:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Пока НЕ ВыборкаАДО.EOF Цикл НС = ТЗ_Пользователи.Добавить(); НС.name = ВыборкаАДО.Fields("name").Value; НС.samaccountname = ВыборкаАДО.Fields("samaccountname").Value; НС.mail = ВыборкаАДО.Fields("mail").Value; НС.userAccountControl = ВыборкаАДО.Fields("userAccountControl").Value; //** определяем заблокирована ли учетка пользователя либо активна UserAccess = ВыборкаАДО.Fields("userAccountControl").Value; Blocked = ?(UserAccess = 514 ИЛИ UserAccess = 66050, Истина, Ложь); //** ВыборкаАДО.MoveNext(); КонецЦикла; |
Имея этот мощный инструмент, мы без проблем сможем загружать/блокировать/обновлять любого пользователя системы в базе 1с.
Пример алгоритма загрузки пользователей, реализованный в прикрепленной обработке:
- Загружаем пользователей из AD;
- Далее в “ПользователиИнформационнойБазы” я делаю поиск существующего пользователя по доменному имени и затем если не нашел, то по имени:
- Если пользователь найден, то можно выполнять с ним необходимые действия (обновить информацию, заблокировать);
- Если пользователь не найден, то создаем его:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
Если ЭтоНовыйПользователь Тогда ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); ПользовательИБ.Имя = User; ПользовательИБ.ПолноеИмя = User; ПользовательИБ.АутентификацияОС = Истина; ПользовательИБ.ПользовательОС = Login; ПользовательИБ.АутентификацияСтандартная = Ложь; ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь; ПользовательИБ.ЗапрещеноИзменятьПароль = Ложь; ПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.Авто; Роль = Метаданные.Роли.Найти("БазовыеПрава"); Если НЕ Роль = Неопределено Тогда ПользовательИБ.Роли.Добавить(Роль); КонецЕсли; Сообщить("Новый пользователь ИБ " + Строка(User)); Попытка ПользовательИБ.Записать(); //Если Все норм то затем создаем элемент справочника пользователи, заполняем нужные реквизиты и указываем //в реквизит "ИдентификаторПользователяИБ" значение "УникальныйИдентификатор" пользователя ИБ, для связки этих двух элементов. //*Пример //НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент(); //НовыйПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Сообщить(ИнформацияОбОшибке); КонецПопытки; Прервать; КонецЕсли; |
- Обратите внимание! После того как вы создали нового пользователя ИБ, необходимо так же создать и пользователя в справочнике “Пользователи”. Для привязки этих элементов используйте реквизит справочника “ИдентификаторПользователяИБ“

В этой статье я попытался дать основы работы с AD и 1с. Это лишь малая часть существующих возможностей. Этой базы должно думаю вам хватить, что бы хоть немного быть в теме.
Качаем обработку по ссылке https://yadi.sk/d/oaFq7KgdK4ynOQ. В ней реализована загрузка из AD в таблицу на форме и отдельно описан механизм загрузки пользователей ИБ. Пользуемся, дорабатываем, улучшаем!
П.С. Если у вас подключение к AD происходит другим способом, то просьба написать в комментах – ну очень уж интересны другие варианты.
Спасибо! Ваш Иванов Чак Норрис!