При автоматизации администрирования 1С, например, при синхронизации данных между разными базами через COMConnector, программисты часто сталкиваются с проблемой: пользователь в справочнике Пользователи создается, но «галочка» Доступ к информационной базе разрешен на форме не устанавливается. Это происходит из-за того, что в современных конфигурациях на базе БСП (Библиотека стандартных подсистем) связь между элементом справочника и учетной записью платформы реализована через уникальный идентификатор, и последовательность действий при их создании критически важна.
В этой статье мы подробно разберем, как правильно настроить эту связь, почему возникает ошибка записи GUID и как добиться того, чтобы программно созданный пользователь имел доступ к системе.
Проанализируем ситуацию. В типовых конфигурациях (таких как Бухгалтерия предприятия 3.0, ERP или Управление торговлей 11) флажок Доступ к информационной базе разрешен на форме справочника Пользователи часто является «виртуальным». Это означает, что он не привязан к конкретному реквизиту в базе данных. Программа вычисляет его значение при открытии формы, проверяя два условия:
ИдентификаторПользователяИБ.ПользователиИнформационнойБазы запись с таким уникальным идентификатором.Если вы просто создаете элемент справочника и записываете туда произвольный GUID, связи не возникнет, так как платформа 1С не найдет соответствующего пользователя в списке пользователей ИБ. Кроме того, существует техническое ограничение: невозможно программно «назначить» свой УникальныйИдентификатор новому пользователю ИБ — платформа всегда генерирует его самостоятельно в момент записи.
Рассмотрим по шагам корректную последовательность действий, которая позволит избежать ошибок и правильно связать объекты. Вместо того чтобы пытаться установить GUID вручную, мы должны сначала создать «платформенного» пользователя, получить его идентификатор и только потом передать его в справочник.
Выясним, как создать учетную запись на уровне платформы. Для этого используется менеджер ПользователиИнформационнойБазы. Посмотрим на пример кода через COM-объект V8:
// Создаем объект пользователя ИБ в удаленной базе
ПользовательИБ = V8.ПользователиИнформационнойБазы.СоздатьПользователя();
ПользовательИБ.Имя = Результат.Наименование;
ПользовательИБ.АутентификацияСтандартная = Истина;
ПользовательИБ.Пароль = "123";
ПользовательИБ.ПоказыватьВСпискеВыбора = Истина;
// При записи платформа сама сгенерирует новый УникальныйИдентификатор
ПользовательИБ.Записать();
Важный момент: попытка выполнить код ПользовательИБ.УникальныйИдентификатор = НовыйGUID приведет к ошибке «Поле объекта недоступно для записи», так как это свойство только для чтения до момента записи или генерируется системой автоматически.
Теперь, когда у нас есть объект ПользовательИБ, мы можем извлечь его УникальныйИдентификатор и присвоить его реквизиту справочника. Проанализируем, как это реализовать:
// Создаем элемент в справочнике Пользователи
НовыйПользователь = V8.Справочники.Пользователи.СоздатьЭлемент();
// Устанавливаем связь по GUID, который нам выдала платформа
НовыйПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
// Заполняем остальные реквизиты
НовыйПользователь.Наименование = Результат.Наименование;
НовыйПользователь.Служебный = Ложь; // Обязательно Ложь, чтобы пользователь был виден в списках
// Если используется синхронизация по ссылке из другой базы
// СпрСсылка - предварительно полученная ссылка через ПолучитьСсылку(НовыйGUID)
НовыйПользователь.УстановитьСсылкуНового(СпрСсылка);
НовыйПользователь.Записать();
Если вы работаете с современной конфигурацией, просто записи справочника может быть недостаточно для полноценной работы «галочки» доступа. В БСП задействованы дополнительные механизмы. Рассмотрим дополнительные действия, которые стоит выполнить:
1. Использование структуры ОписаниеПользователяИБ
БСП ожидает, что при записи пользователя будут заполнены ДополнительныеСвойства. Это позволяет подсистеме безопасности корректно инициализировать настройки пользователя. Посмотрим, как дополнить код:
ОписаниеПользователяИБ = V8.NewObject("Структура");
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Вставить("Имя", Результат.Наименование);
ОписаниеПользователяИБ.Вставить("АутентификацияСтандартная", Истина);
ОписаниеПользователяИБ.Вставить("ДоступКИнформационнойБазеРазрешен", Истина);
НовыйПользователь.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
2. Роли пользователя
Пользователь без ролей в 1С часто считается «неактивным». Даже если вы создали связь, без назначенных ролей вход в систему может быть невозможен. Не забудьте добавить в структуру ОписаниеПользователяИБ ключ Роли со списком имен ролей из конфигурации.
3. Обновление служебных регистров
В некоторых случаях форма справочника берет данные не напрямую из списка пользователей ИБ, а из регистра сведений СведенияОПользователях. Если вы создаете пользователя напрямую через ПользователиИнформационнойБазы, запись в этом регистре может не создаться автоматически. Для решения этой задачи рекомендуется вызывать программный интерфейс БСП:
V8.Пользователи.ЗаписатьПользователя(НовыйПользователь);
ИдентификаторПользователяИБ записывается либо пустое значение, либо GUID, который еще не существует в системе. Связь не установится.Имя в ПользователиИнформационнойБазы не совпадает с логином, указанным в справочнике, это может запутать администратора, хотя техническая связь по GUID будет работать.Мы выяснили, что для того чтобы «галочка» доступа в справочнике Пользователи установилась программно, необходимо строго соблюдать последовательность: сначала создаем Пользователя ИБ -> получаем его ID -> записываем этот ID в справочник. Использование стандартных механизмов БСП через ДополнительныеСвойства и программный интерфейс Пользователи.ЗаписатьПользователя() является наиболее надежным способом, так как он берет на себя обновление всех сопутствующих регистров сведений и кэшей безопасности.