Импорт и синхронизация учётных записей Active Directory с базой 1С

· 9 мин

Содержание

Получить активных пользователей 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, используется по умолчанию
636LDAP поверх 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С нужны пять-шесть.

Атрибуты Active Directory → пользователь 1С
sAMAccountName→Имя (логин) пользователя ИБ
displayName→Полное имя / наименование в справочнике «Пользователи»
ДОМЕН + sAMAccountName→Пользователь ОС в формате \\CORP\ivanov
mail→Адрес электронной почты (контактная информация)
userPrincipalName→Резервный ключ сопоставления, если логины в 1С другие
objectGUID→Неизменный идентификатор для связи записей при переименовании

Несколько правил, которые избавят от проблем:

  • 🔑 Ключ сопоставления — логин, а не ФИО. Двое «Ивановых А. С.» в компании из 200 человек встречаются чаще, чем кажется.
  • 🔁 Храните objectGUID. Логин меняют при смене фамилии, а GUID у учётки остаётся прежним. Сохраните его в дополнительном реквизите или регистре сведений — тогда переименование не создаст дубль.
  • 🧩 Формат пользователя ОС — с двумя обратными косыми. Платформа ждёт строку \\CORP\ivanov. Запись CORP\ivanov без первой пары косых связь не установит.
  • 📧 mail бывает пустым у сотрудников без почтового ящика. Проверяйте значение на NULL, иначе запись упадёт.

В конфигурациях на БСП не создавайте пользователей ИБ напрямую через ПользователиИнформационнойБазы.СоздатьПользователя(). Такой пользователь не попадёт в справочник «Пользователи» и не получит профилей групп доступа. Правильнее записать элемент справочника, передав параметры пользователя ИБ через дополнительное свойство ОписаниеПользователяИБ:

ОписаниеИБ = Новый Структура;
ОписаниеИБ.Вставить("Действие", "Записать");
ОписаниеИБ.Вставить("Имя", Строка.Логин);
ОписаниеИБ.Вставить("ПолноеИмя", Строка.ФИО);
ОписаниеИБ.Вставить("АутентификацияОС", Истина);
ОписаниеИБ.Вставить("ПользовательОС", "\\CORP\" + Строка.Логин);
ОписаниеИБ.Вставить("АутентификацияСтандартная", Ложь);
ОписаниеИБ.Вставить("ВходВПрограммуРазрешен", Истина);

Пользователь = Справочники.Пользователи.СоздатьЭлемент();
Пользователь.Наименование = Строка.ФИО;
Пользователь.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеИБ);
Пользователь.Записать();

Профили доступа назначайте после записи — через группы доступа. Самый простой подход: новичок получает минимальный профиль, а расширенные права выдаёт администратор по заявке.

Синхронизация: новые, уволенные и конфликтующие записи

Каждый проход синхронизации сравнивает два списка — активных в AD и существующих в 1С — и раскладывает записи по четырём корзинам.

  1. Есть в AD, нет в 1С — создать пользователя с минимальными правами. Если в компании не все работают в 1С, создавайте только членов группы «Пользователи 1С», иначе база наполнится водителями и уборщиками.
  2. Есть в обоих — обновить ФИО и почту, если они изменились. Права не трогать: их выдавали вручную.
  3. Есть в 1С, нет среди активных в AD — запретить вход. В карточке это флажок «Вход в программу разрешён», в коде — ВходВПрограммуРазрешен = Ложь в том же ОписаниеПользователяИБ.
  4. Совпал логин, но другой GUID — конфликт. Значит, логин ушедшего сотрудника отдали новому. Автоматически такую запись не меняйте: отправьте её администратору на ручной разбор.

Никогда не удаляйте пользователей из 1С при синхронизации. Пользователь — это автор документов, ответственный в заказах, подписант в настройках. Удаление ломает ссылки в сотнях объектов. Уволенного достаточно лишить права входа и при желании пометить недействительным.

Служебные учётки не трогайте. Пользователь, под которым работает обмен с сайтом или регламентные задания, в AD может отсутствовать вовсе. Заведите список исключений и пропускайте эти логины при отключении.

Не путайте «активен в AD» и «реально работает». Учётку уволенного иногда забывают отключить в домене. Если нужно ловить и такие случаи, запросите атрибут lastLogonTimestamp и отметьте тех, кто не входил в домен дольше 60 дней. Сам атрибут реплицируется между контроллерами с задержкой до двух недель, поэтому порог меньше 30 дней не ставьте.

Если синхронизация не работает: ошибки и проверки

Большинство сбоев видно по коду ошибки ADODB, который 1С показывает в тексте исключения.

Диагностика: выберите симптом

Ещё две проверки, которые экономят время:

  • 🔍 Проверьте фильтр вне 1С. Выполните Get-ADUser -LDAPFilter "<ваш фильтр>" в PowerShell. Если там пусто, проблема в фильтре, а не в коде.
  • 📜 Смотрите журнал регистрации. Для регламентного задания ошибка видна только там: отберите события по имени задания и уровню «Ошибка».

Если доменных пользователей много, а синхронизация идёт минутами, сузьте область поиска до нужного OU и запрашивайте только те атрибуты, которые реально пишете в 1С. Каждый лишний атрибут увеличивает объём ответа контроллера.

Частые вопросы

Нужен ли платный модуль или отдельная конфигурация для связи 1С с Active Directory?
Нет. Достаточно встроенного в Windows провайдера ADsDSOObject и кода на встроенном языке, обычно в виде расширения или внешней обработки.
Можно ли входить в 1С без пароля под доменной учёткой?
Да. Включите аутентификацию операционной системы и укажите пользователя ОС в формате \ДОМЕН\логин. При запуске 1С с доменного компьютера пароль не спросят.
Как посмотреть, кто сейчас работает в базе, а не кто активен в домене?
В Конфигураторе откройте меню «Администрирование → Активные пользователи». Для клиент-серверной базы полный список сеансов показывает консоль администрирования серверов 1С.
Расходует ли доменный пользователь лицензию, если не заходит в 1С?
Нет. Лицензия занимается только открытым сеансом, а не наличием пользователя в списке.
Что делать, если сотрудник вернулся на работу?
Включите его учётку в AD. При следующей синхронизации разрешите вход в 1С тому же пользователю, найдя его по GUID, — история документов и права сохранятся.