При работе с распределенными информационными базами (РИБ) одной из самых неприятных проблем является «потеря» связи между элементом справочника Пользователи и реальной учетной записью в списке пользователей информационной базы (ИБ). Это происходит из-за того, что при обмене данными через XML-пакеты реквизит ИдентификаторПользователяИБ в одной базе затирается значением из другой базы. В результате пользователь не может войти в систему или теряет свои настройки и права доступа. Разберем подробно, почему это происходит и как программно предотвратить данную ситуацию.
Для начала проанализируем ситуацию и выясним причину конфликта. В платформе «1С:Предприятие 8» сущность «Пользователь» разделена на две составляющие:
Связующим звеном между ними выступает реквизит ИдентификаторПользователяИБ (тип УникальныйИдентификатор). Когда мы выполняем выгрузку из центрального узла в периферийный, XML-файл содержит GUID пользователя центральной базы. При загрузке в периферийном узле этот GUID записывается в справочник, но в списке пользователей ИБ этой базы такого идентификатора нет. В итоге связь разрывается.
Самый эффективный и простой метод решения — это модификация логики записи справочника Пользователи. Мы должны сказать системе: «Если данные пришли по обмену, не трогай идентификатор пользователя». Рассмотрим, как это реализовать в модуле объекта справочника Пользователи.
Нам необходимо перехватить событие ПередЗаписью. Проанализируем пример кода:
Процедура ПередЗаписью(Отказ)
// Проверяем, что запись инициирована механизмом обмена данными
Если ОбменДанными.Загрузка Тогда
// Нам нужно сохранить текущий идентификатор, который уже есть в этой базе
// Для этого получаем данные из ссылки (из текущей БД до записи)
Если Не ЭтоНовый() Тогда
ТекущийИдентификатор = Ссылка.ИдентификаторПользователяИБ;
// Если пришедший идентификатор отличается от локального, возвращаем локальный
Если ЗначениеЗаполнено(ТекущийИдентификатор)
И ЭтотОбъект.ИдентификаторПользователяИБ <> ТекущийИдентификатор Тогда
ЭтотОбъект.ИдентификаторПользователяИБ = ТекущийИдентификатор;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разберем по шагам, что делает этот код. Сначала мы проверяем свойство ОбменДанными.Загрузка. Это критически важно: если оно равно Истина, значит, объект загружается из XML-пакета обмена. Далее мы проверяем, не является ли элемент новым. Если элемент уже существовал в базе, мы берем его старое значение ИдентификаторПользователяИБ через обращение к Ссылка и принудительно устанавливаем его обратно в записываемый объект. Таким образом, GUID пользователя в локальной базе остается неизменным, и связь с системной учетной записью не теряется.
Если в вашей конфигурации (например, в УПП или самописной базе) используются правила конвертации данных (КД 2.0), можно решить проблему на уровне проектирования обмена. Посмотрим на алгоритм настройки:
ИдентификаторПользователяИБ справочника Пользователи.Отказ = Истина;. В этом случае идентификатор вообще не попадет в файл обмена.Наименование или Код, но ни в коем случае не GUID пользователя ИБ.Этот метод хорош тем, что не требует внесения изменений в сам код конфигурации, если вы используете внешние правила обмена.
Проанализируем ситуацию с доменными пользователями. Если в вашей организации используется авторизация через Active Directory, проблема рассинхронизации становится еще более острой. Когда ИдентификаторПользователяИБ затирается, 1С перестает понимать, что вошедший под доменным именем сотрудник DOMAIN\Ivanov — это тот самый «Иванов Иван» из справочника.
В этом случае при входе пользователя система может:
Важный совет: При использовании РИБ старайтесь создавать пользователей в центральном узле, а в периферийных базах выполнять только их сопоставление или использовать автоматизированные скрипты создания пользователей ИБ на основе данных справочника сразу после загрузки обмена.
В современных конфигурациях (ERP, КА 2.5, УТ 11) механизмы БСП уже содержат встроенную защиту от подобных проблем. Разберем, как это работает в типовых решениях. Подсистема «Пользователи» при обмене данными через РИБ использует регистр сведений Сведения о пользователях.
Если вы столкнулись с проблемой в типовой конфигурации, проверьте:
Подведем итог. Чтобы пользователи не «терялись» после обмена в РИБ, необходимо обеспечить неизменность реквизита ИдентификаторПользователяИБ в каждой локальной базе. Самым надежным способом является вставка программной проверки в событие ПередЗаписью модуля справочника Пользователи. Это гарантирует сохранение связи между справочником и системными таблицами платформы, обеспечивая стабильную работу прав доступа и настроек интерфейса для сотрудников во всех узлах распределенной системы.