При работе с распределенными информационными базами (РИБ) системные администраторы и программисты иногда сталкиваются с ситуацией, когда после очередного сеанса обмена данными пользователи в дочерних или центральной базах теряют свои права или вовсе лишаются возможности входа в систему. Особенно часто это происходит в конфигурациях на обычных формах, таких как «1С:Комплексная автоматизация 1.1» или «1С:Управление производственным предприятием 1.3», работающих на платформе 8.2 или 8.3.
Рассмотрим детально причины возникновения этой проблемы, проанализируем ошибки при создании узлов РИБ и разберем по шагам, как восстановить корректную работу пользователей и прав доступа.
Одной из самых серьезных ошибок при развертывании РИБ является отказ от использования стандартного механизма Создать начальный образ. Когда база создается простым копированием файла 1Cv8.1CD (или бэкапа SQL), в дочернюю базу переносятся абсолютно все данные, включая:
ЭтотУзел.Проанализируем ситуацию: когда вы копируете базу, в дочернем узле остаются те же самые ПользователиИнформационнойБазы с теми же уникальными идентификаторами (GUID), что и в центральной. Однако при настройке обмена справочник Пользователи начинает синхронизироваться. Если в одной базе вы изменили права, запись в справочнике помечается как измененная и отправляется в другой узел, затирая локальные настройки.
Важно различать два объекта в системе 1С:
Пользователи: Это объект метаданных, который мы видим в режиме «Предприятие». Он мигрирует между базами по правилам обмена.В типовых конфигурациях связь между ними осуществляется через уникальный идентификатор (GUID). Если в центральной базе запись справочника Пользователи была обновлена и ушла в «дочку», она приносит с собой GUID учетной записи из центральной базы. Если в «дочке» идентификатор пользователя в Конфигураторе не совпадает с тем, что пришел в справочнике, система «теряет» связь. В результате в справочнике мы видим пользователя, но войти под ним не можем, а система выдает ошибку: «У данного пользователя нет учетной записи в информационной базе».
Чтобы прекратить «войну» за права доступа, первым делом проанализируем состав плана обмена. Выясним, какие объекты отвечают за хранение прав в вашей конфигурации. Обычно это:
ПользователиГруппыПользователейНастройкиПользователейПраваПользователей (или аналогичные в зависимости от версии КА)Если вы хотите, чтобы в каждой базе были свои уникальные права, необходимо исключить эти объекты из обмена. Для этого в Конфигураторе откройте свойства вашего плана обмена, перейдите на вкладку «Состав» и снимите флажки автоматической регистрации для указанных объектов. Однако помните, что это потребует ручного заведения пользователей в каждом узле.
Если базы уже созданы копированием и обмен идет некорректно, нужно очистить «мусорную» регистрацию изменений. Рассмотрим пример кода, который позволяет удалить регистрацию всех объектов справочника Пользователи для конкретного узла:
Процедура ОчиститьРегистрациюПользователей(УзелОбмена)
Выборка = ПланыОбмена.ВыбратьИзменения(УзелОбмена, 100);
Пока Выборка.Следующий() Цикл
Объект = Выборка.Данные;
Если ТипЗнч(Объект) = Тип("СправочникОбъект.Пользователи") Тогда
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Объект.Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выполните подобную очистку во всех узлах (и в центральном, и в дочерних), чтобы остановить неконтролируемую перезапись прав при ближайшем обмене.
Если права «слетают» из-за несовпадения GUID в справочнике и в Конфигураторе, можно воспользоваться программным восстановлением связи. Разберем, как обновить идентификатор пользователя ИБ в справочнике. Проанализируем следующий фрагмент кода:
Процедура ВосстановитьСвязьПользователя(ИмяПользователя)
// Ищем пользователя в справочнике
ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя);
Если ПользовательСсылка.Пустая() Тогда
Возврат;
КонецЕсли;
// Получаем объект пользователя ИБ из Конфигуратора
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ <> Неопределено Тогда
ОбъектСпр = ПользовательСсылка.ПолучитьОбъект();
// В КА 1.1 идентификатор обычно хранится в скрытом реквизите или доп. свойствах
// Предположим, используется стандартный механизм связи по уникальному идентификатору
ИдентификаторИБ = ПользовательИБ.УникальныйИдентификатор;
// В некоторых версиях БСП или КА 1.1 это поле ИдентификаторПользователяИБ
Если ОбъектСпр.ИдентификаторПользователяИБ <> ИдентификаторИБ Тогда
ОбъектСпр.ИдентификаторПользователяИБ = ИдентификаторИБ;
ОбъектСпр.ОбменДанными.Загрузка = Истина;
ОбъектСпр.Записать();
Сообщить("Связь для пользователя " + ИмяПользователя + " восстановлена.");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при записи объекта обязательно устанавливайте ОбменДанными.Загрузка = Истина. Это предотвратит повторную регистрацию изменений и отправку этого исправления обратно в центральную базу, что могло бы вызвать циклическую перезапись.
Для стабильной работы распределенной системы в 1С:Комплексная автоматизация придерживайтесь следующих правил:
ЖурналРегистрации. Ищите события «Обмен данными», «Изменение» справочника «Пользователи» и смотрите, от какого узла пришло сообщение. Это поможет выяснить, какая база является источником некорректных данных.Подводя итог, можно сказать, что проблема «слетающих» прав в 90% случаев вызвана тем, что при обмене данными объект справочника Пользователи из одной базы заменяет объект в другой, принося с собой неверную ссылку на учетную запись Конфигуратора. Правильная настройка состава плана обмена и корректное сопоставление GUID решают эту задачу раз и навсегда.