Импорт и синхронизация учётных записей Active Directory с базой 1С
Содержание
Получить активных пользователей Active Directory в 1С можно запросом к LDAP через COM-объект ADODB.Connection с провайдером ADsDSOObject. Активными считаются учётные записи без флага «отключена»: в фильтре это условие (!(userAccountControl:1.2.840.113556.1.4.803:=2)). Полученный список вы записываете в справочник «Пользователи» и включаете каждому аутентификацию операционной системы с именем вида \\ДОМЕН\логин.
Типичная ситуация: в компании 80 сотрудников, половина работает в 1С, кадровик каждую неделю просит завести новичка и закрыть доступ уволенному. Администратор делает это руками и раз в квартал находит в базе пользователей, которые ушли полгода назад. Интеграция с AD убирает эту рутину: база сама узнаёт, кто в домене активен, а кто отключён.
Механизм общий для платформы 8.3 и не зависит от конфигурации. Различается только место, куда записывать пользователей: в типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, ERP) это справочник «Пользователи», в самописных — напрямую список пользователей информационной базы.
Подготовка: права в 1С и учётная запись для чтения домена
До первого запроса к LDAP проверьте три вещи. Если пропустить любую, код упадёт на первой строке или вернёт пустой список.
Права в базе. Создавать и менять пользователей ИБ может только сеанс с правом «Администрирование». В типовых конфигурациях это профиль «Администратор» с ролью «Полные права». Обычному пользователю обработка синхронизации выдаст ошибку записи.
Где выполняется код. От этого зависит, под чьим именем 1С пойдёт в домен:
| Режим | Кто обращается к AD | Что нужно |
|---|---|---|
| Файловая база, код на клиенте | Пользователь Windows, запустивший 1С | Обычная доменная учётка, прав на чтение хватает |
| Клиент-серверная база, код на сервере | Учётная запись службы «Агент сервера 1С:Предприятия» | Служба под доменной учёткой или явный логин/пароль в строке подключения |
| Регламентное задание | Тоже учётная запись службы | Как в предыдущей строке |
По умолчанию служба сервера 1С часто работает под локальным пользователем USR1CV8. Такой пользователь в домене не существует, и анонимный запрос к контроллеру домена отклоняется.
Для синхронизации заведите в AD отдельную сервисную учётку, например svc-1c-ldap. Ей достаточно прав чтения, которые в домене по умолчанию есть у любого пользователя. Пароль не должен истекать, иначе синхронизация однажды молча остановится.
Платформа сервера. COMОбъект работает только на Windows. Если сервер 1С стоит на Linux, COM недоступен: выгружайте список из AD внешним скриптом в файл, а 1С пусть читает файл. Этот вариант разобран ниже, в разделе про стратегию импорта.
Строка подключения к LDAP и фильтр активных учётных записей
Подключение собирается из трёх частей: провайдер, путь к контейнеру и LDAP-фильтр.
Путь к контейнеру. Для домена corp.local путь ко всему домену — LDAP://DC=corp,DC=local. Если сотрудники лежат в отдельном подразделении, сузьте поиск: LDAP://OU=Staff,DC=corp,DC=local. Можно указать конкретный контроллер: LDAP://dc01.corp.local/DC=corp,DC=local.
| Порт | Назначение |
|---|---|
| 389 | Обычный LDAP, используется по умолчанию |
| 636 | LDAP поверх TLS (LDAPS) |
| 3268 | Глобальный каталог, если пользователи в нескольких доменах леса |
Фильтр. Чтобы отобрать именно людей, а не компьютеры и служебные объекты, и при этом только включённые учётки, используйте:
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Последнее условие — побитовая проверка атрибута userAccountControl. Бит со значением 2 означает «учётная запись отключена». Знак ! отбрасывает такие записи.
Чтобы получить только сотрудников из определённой группы, например «Пользователи 1С», добавьте условие членства:
(memberOf=CN=Users-1C,OU=Groups,DC=corp,DC=local)
Учтите: memberOf видит прямое членство. Если человек входит во вложенную группу, используйте правило memberOf:1.2.840.113556.1.4.1941:= — оно раскрывает вложенность.
Код получения списка. Пример для серверного модуля или обработки, выполняемой на Windows:
Функция АктивныеПользователиAD(ПутьLDAP) Экспорт
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("Логин");
Результат.Колонки.Добавить("ФИО");
Результат.Колонки.Добавить("Почта");
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Provider = "ADsDSOObject";
Соединение.Open("Active Directory Provider");
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = Соединение;
Команда.Properties("Page Size").Value = 500;
Фильтр = "(&(objectCategory=person)(objectClass=user)"
+ "(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";
Команда.CommandText = "<" + ПутьLDAP + ">;" + Фильтр
+ ";sAMAccountName,displayName,mail;subtree";
Набор = Команда.Execute();
Пока Не Набор.EOF Цикл
Строка = Результат.Добавить();
Строка.Логин = Набор.Fields("sAMAccountName").Value;
Строка.ФИО = Набор.Fields("displayName").Value;
Строка.Почта = Набор.Fields("mail").Value;
Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();
Возврат Результат;
КонецФункции
Вызов: Таблица = АктивныеПользователиAD("LDAP://DC=corp,DC=local");.
Строка Page Size обязательна. Без неё контроллер домена отдаёт не больше 1000 записей, и в крупном домене часть сотрудников просто не попадёт в 1С без всякой ошибки.
Если служба 1С работает не под доменной учёткой, перед Open задайте логин и пароль явно: Соединение.Properties("User ID").Value = "CORP\svc-1c-ldap" и аналогично Password. Пароль в коде не храните — держите его в защищённых настройках конфигурации или в безопасном хранилище БСП.
Стратегия импорта: разово, по расписанию или через файл
Выбор зависит от размера компании и того, кто отвечает за кадровые изменения.
| Стратегия | Когда подходит | Риски |
|---|---|---|
| Разовый импорт обработкой | Первичное заполнение базы, до 50 человек | Через месяц список устаревает |
| Регламентное задание раз в сутки | Компания от 30 человек, текучка каждую неделю | Нужна служба под доменной учёткой и Windows-сервер |
| Выгрузка из AD в CSV + загрузка в 1С | Сервер 1С на Linux, запрет COM политикой безопасности | Две точки отказа: скрипт и загрузка |
| Ручной выбор в карточке пользователя | Новички по одному, без программирования | Не отключает уволенных |
Регламентное задание — самый удобный вариант. Создайте его в расширении конфигурации, чтобы не снимать типовую с поддержки. Ночной запуск, например в 03:00, не мешает работе. Если задание найдёт ошибку, пусть пишет её в журнал регистрации, а не падает молча.
Выгрузка в файл нужна, когда COM недоступен. На любом компьютере домена с модулем ActiveDirectory для PowerShell выполните:
Get-ADUser -Filter 'Enabled -eq $true' -SearchBase "OU=Staff,DC=corp,DC=local" `
-Properties displayName,mail |
Select-Object SamAccountName,displayName,mail |
Export-Csv C:\Exchange\ad_users.csv -NoTypeInformation -Encoding UTF8
Скрипт кладут в планировщик Windows, а 1С по расписанию читает CSV из общей папки. На Linux ту же выборку делает ldapsearch с фильтром из предыдущего раздела.
Ручной выбор встроен в платформу. В карточке пользователя включите аутентификацию операционной системы и нажмите кнопку выбора рядом с полем пользователя: откроется список доменов и учётных записей. Для пяти новичков в месяц этого хватает.
Какие поля AD соответствуют реквизитам пользователя 1С
Атрибутов у учётной записи в AD больше сотни, но для 1С нужны пять-шесть.
Несколько правил, которые избавят от проблем:
- 🔑 Ключ сопоставления — логин, а не ФИО. Двое «Ивановых А. С.» в компании из 200 человек встречаются чаще, чем кажется.
- 🔁 Храните
objectGUID. Логин меняют при смене фамилии, а GUID у учётки остаётся прежним. Сохраните его в дополнительном реквизите или регистре сведений — тогда переименование не создаст дубль. - 🧩 Формат пользователя ОС — с двумя обратными косыми. Платформа ждёт строку
\\CORP\ivanov. ЗаписьCORP\ivanovбез первой пары косых связь не установит. - 📧
mailбывает пустым у сотрудников без почтового ящика. Проверяйте значение наNULL, иначе запись упадёт.
В конфигурациях на БСП не создавайте пользователей ИБ напрямую через ПользователиИнформационнойБазы.СоздатьПользователя(). Такой пользователь не попадёт в справочник «Пользователи» и не получит профилей групп доступа. Правильнее записать элемент справочника, передав параметры пользователя ИБ через дополнительное свойство ОписаниеПользователяИБ:
ОписаниеИБ = Новый Структура;
ОписаниеИБ.Вставить("Действие", "Записать");
ОписаниеИБ.Вставить("Имя", Строка.Логин);
ОписаниеИБ.Вставить("ПолноеИмя", Строка.ФИО);
ОписаниеИБ.Вставить("АутентификацияОС", Истина);
ОписаниеИБ.Вставить("ПользовательОС", "\\CORP\" + Строка.Логин);
ОписаниеИБ.Вставить("АутентификацияСтандартная", Ложь);
ОписаниеИБ.Вставить("ВходВПрограммуРазрешен", Истина);
Пользователь = Справочники.Пользователи.СоздатьЭлемент();
Пользователь.Наименование = Строка.ФИО;
Пользователь.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеИБ);
Пользователь.Записать();
Профили доступа назначайте после записи — через группы доступа. Самый простой подход: новичок получает минимальный профиль, а расширенные права выдаёт администратор по заявке.
Синхронизация: новые, уволенные и конфликтующие записи
Каждый проход синхронизации сравнивает два списка — активных в AD и существующих в 1С — и раскладывает записи по четырём корзинам.
- Есть в AD, нет в 1С — создать пользователя с минимальными правами. Если в компании не все работают в 1С, создавайте только членов группы «Пользователи 1С», иначе база наполнится водителями и уборщиками.
- Есть в обоих — обновить ФИО и почту, если они изменились. Права не трогать: их выдавали вручную.
- Есть в 1С, нет среди активных в AD — запретить вход. В карточке это флажок «Вход в программу разрешён», в коде —
ВходВПрограммуРазрешен = Ложьв том жеОписаниеПользователяИБ. - Совпал логин, но другой GUID — конфликт. Значит, логин ушедшего сотрудника отдали новому. Автоматически такую запись не меняйте: отправьте её администратору на ручной разбор.
Никогда не удаляйте пользователей из 1С при синхронизации. Пользователь — это автор документов, ответственный в заказах, подписант в настройках. Удаление ломает ссылки в сотнях объектов. Уволенного достаточно лишить права входа и при желании пометить недействительным.
Служебные учётки не трогайте. Пользователь, под которым работает обмен с сайтом или регламентные задания, в AD может отсутствовать вовсе. Заведите список исключений и пропускайте эти логины при отключении.
Не путайте «активен в AD» и «реально работает». Учётку уволенного иногда забывают отключить в домене. Если нужно ловить и такие случаи, запросите атрибут lastLogonTimestamp и отметьте тех, кто не входил в домен дольше 60 дней. Сам атрибут реплицируется между контроллерами с задержкой до двух недель, поэтому порог меньше 30 дней не ставьте.
Если синхронизация не работает: ошибки и проверки
Большинство сбоев видно по коду ошибки ADODB, который 1С показывает в тексте исключения.
Ещё две проверки, которые экономят время:
- 🔍 Проверьте фильтр вне 1С. Выполните
Get-ADUser -LDAPFilter "<ваш фильтр>"в PowerShell. Если там пусто, проблема в фильтре, а не в коде. - 📜 Смотрите журнал регистрации. Для регламентного задания ошибка видна только там: отберите события по имени задания и уровню «Ошибка».
Если доменных пользователей много, а синхронизация идёт минутами, сузьте область поиска до нужного OU и запрашивайте только те атрибуты, которые реально пишете в 1С. Каждый лишний атрибут увеличивает объём ответа контроллера.