Как программно создать нового пользователя в 1С и синхронизировать его со справочником

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современных конфигурациях 1С на платформе 8.3 (особенно тех, что построены на базе Библиотеки стандартных подсистем — БСП, таких как БП 3.0, ЗУП 3.1, УТ 11) процесс создания пользователя перестал быть простой процедурой добавления записи в список пользователей информационной базы. Теперь это двухэтапный процесс, требующий жесткой синхронизации между системной таблицей пользователей и справочником Пользователи. В этой статье мы подробно разберем, как правильно реализовать этот механизм программно, чтобы избежать ошибок входа и проблем с отображением в списках.

Понимание архитектуры: Пользователь ИБ vs Справочник «Пользователи»

Прежде чем переходить к коду, давайте проанализируем ситуацию. В 1С существует два уровня сущностей:

  1. Пользователь информационной базы (ИБ): Хранится на уровне платформы. Отвечает за аутентификацию (логин, пароль), роли (права доступа) и параметры запуска.
  2. Элемент справочника «Пользователи»: Объект прикладного решения. К нему привязываются настройки отчетов, подразделения, ответственные в документах и прочая бизнес-логика.

Если вы создадите пользователя только в ИБ, программа может не пустить его в интерфейс или «ругаться» на отсутствие записи в справочнике. Если создадите только в справочнике — под этим именем нельзя будет авторизоваться. Наша задача — создать оба объекта и связать их через Уникальный идентификатор (UUID).

Способ 1: Прямое создание через объекты платформы

Рассмотрим по шагам классический метод, который часто используется при миграции данных или загрузке из внешних систем (например, из XML или другой базы). Выясним причину, по которой пользователи могут не отображаться в справочнике после создания.

Сначала создадим пользователя на уровне платформы. Разберем пример кода:


// 1. Создаем пользователя в Информационной Базе
НовыйПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
НовыйПользовательИБ.Имя = "Ivanov_II";
НовыйПользовательИБ.ПолноеИмя = "Иванов Иван Иванович";
НовыйПользовательИБ.АутентификацияСтандартная = Истина;
НовыйПользовательИБ.Пароль = "Qwer123";
НовыйПользовательИБ.ПоказыватьВСпискеВыбора = Истина;
НовыйПользовательИБ.Язык = Метаданные.Языки.Русский;
НовыйПользовательИБ.РежимЗапуска = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение;

// Назначение ролей (необходимо указать объект метаданных)
НовыйПользовательИБ.Роли.Добавить(Метаданные.Роли.ПолныеПрава);

Попытка
    НовыйПользовательИБ.Записать();
Исключение
    Сообщить("Ошибка при записи пользователя ИБ: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Важный момент: После вызова метода Записать() у объекта НовыйПользовательИБ появляется свойство УникальныйИдентификатор. Именно его мы должны использовать для связи со справочником. Проанализируем продолжение процедуры:


// 2. Создаем элемент в справочнике Пользователи
НовыйЭлементСправочника = Справочники.Пользователи.СоздатьЭлемент();
НовыйЭлементСправочника.Наименование = "Иванов Иван Иванович";

// Ключевой реквизит для связи
НовыйЭлементСправочника.ИдентификаторПользователяИБ = НовыйПользовательИБ.УникальныйИдентификатор;

// Дополнительные служебные реквизиты БСП
НовыйЭлементСправочника.Недействителен = Ложь;
НовыйЭлементСправочника.Подготовлен = Истина;

// Использование флага Загрузка позволяет обойти некоторые проверки,
// но будьте осторожны: это может пропустить заполнение важных регистров
НовыйЭлементСправочника.ОбменДанными.Загрузка = Истина;

Попытка
    НовыйЭлементСправочника.Записать();
    Сообщить("Пользователь успешно создан и синхронизирован!");
Исключение
    Сообщить("Ошибка при записи справочника: " + ОписаниеОшибки());
КонецПопытки;

Почему пользователь не отображается в списке?

Многие разработчики сталкиваются с ситуацией: код выполнен без ошибок, пользователь может зайти в базу, но в списке справочника «Пользователи» его нет. Разберем основные причины:

  1. Реквизит «Служебный»: В современных конфигурациях у справочника Пользователи есть реквизит Служебный. Если он заполнен как Истина, пользователь скрывается из стандартных списков. Проверьте его значение.
  2. Состояние «Подготовлен»: Если ваша конфигурация использует механизм одобрения новых пользователей, а реквизит Подготовлен установлен в Ложь, запись может быть отфильтрована в формах списка.
  3. Кэширование и регистры: БСП хранит информацию о пользователях в нескольких вспомогательных регистрах сведений (например, СоставыГруппПользователей). При использовании ОбменДанными.Загрузка = Истина эти регистры не заполняются автоматически.

Способ 2: Использование программного интерфейса БСП (Рекомендуемый)

Рассмотрим более продвинутый и правильный способ для современных конфигураций. Вместо прямого манипулирования объектами ПользователиИнформационнойБазы, мы воспользуемся общим модулем Пользователи. Это гарантирует, что все необходимые связи и записи в регистрах будут созданы корректно.

Посмотрим на пример структуры, которую нужно подготовить для метода ЗаписатьПользователя:


// Подготавливаем описание пользователя
ОписаниеПользователя = Новый Структура;
ОписаниеПользователя.Вставить("Имя", "Petrov_PP");
ОписаниеПользователя.Вставить("ПолноеИмя", "Петров Петр Петрович");
ОписаниеПользователя.Вставить("АутентификацияСтандартная", Истина;
ОписаниеПользователя.Вставить("Пароль", "SafePassword777");
ОписаниеПользователя.Вставить("ПоказыватьВСпискеВыбора", Истина);
ОписаниеПользователя.Вставить("Роли", Новый Массив);
ОписаниеПользователя.Роли.Добавить("Бухгалтер"); // Имя роли строкой

// Вызываем стандартный метод БСП
ПараметрыЗаписи = Новый Структура;
// Ссылка на существующий элемент справочника, если нужно обновить
ПараметрыЗаписи.Вставить("Пользователь", Справочники.Пользователи.ПустаяСсылка()); 

Пользователи.ЗаписатьПользователя(ПараметрыЗаписи.Пользователь, ОписаниеПользователя);

Этот метод самостоятельно выполнит создание пользователя ИБ, создаст элемент справочника, свяжет их по UUID и обновит все зависимые кэши прав доступа. Это избавляет от ошибки «Значение не является значением объектного типа (УникальныйИдентификатор)», которая часто возникает при попытке записи или удаления некорректно созданных вручную пользователей.

Обработка ошибок и нюансы

Проанализируем типичную ошибку при работе в Бухгалтерии Предприятия 3.0, упомянутую в обсуждении. Ошибка в общем модуле при вызове ПередЗаписьюПользователяИБ обычно означает, что платформа пытается найти соответствие между объектом справочника и пользователем системы, но не находит его по идентификатору.

Важные правила при программном создании:

Подводя итог, можно сказать, что для простых баз на обычных формах достаточно первого способа с ручной привязкой UUID. Однако для серьезных решений на базе БСП лучше один раз разобраться в интерфейсе модуля Пользователи, что обеспечит стабильную работу системы и корректное отображение всех созданных учетных записей.

← На главную