Почему в РИБ 1С пропадают пользователи и «слетают» права доступа после обмена

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

При работе с распределенными информационными базами (РИБ) системные администраторы и программисты иногда сталкиваются с ситуацией, когда после очередного сеанса обмена данными пользователи в дочерних или центральной базах теряют свои права или вовсе лишаются возможности входа в систему. Особенно часто это происходит в конфигурациях на обычных формах, таких как «1С:Комплексная автоматизация 1.1» или «1С:Управление производственным предприятием 1.3», работающих на платформе 8.2 или 8.3.

Рассмотрим детально причины возникновения этой проблемы, проанализируем ошибки при создании узлов РИБ и разберем по шагам, как восстановить корректную работу пользователей и прав доступа.

Причина 1: Нарушение методики создания начального образа

Одной из самых серьезных ошибок при развертывании РИБ является отказ от использования стандартного механизма Создать начальный образ. Когда база создается простым копированием файла 1Cv8.1CD (или бэкапа SQL), в дочернюю базу переносятся абсолютно все данные, включая:

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

Проанализируем ситуацию: когда вы копируете базу, в дочернем узле остаются те же самые ПользователиИнформационнойБазы с теми же уникальными идентификаторами (GUID), что и в центральной. Однако при настройке обмена справочник Пользователи начинает синхронизироваться. Если в одной базе вы изменили права, запись в справочнике помечается как измененная и отправляется в другой узел, затирая локальные настройки.

Причина 2: Конфликт справочника «Пользователи» и списка пользователей ИБ

Важно различать два объекта в системе 1С:

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

В типовых конфигурациях связь между ними осуществляется через уникальный идентификатор (GUID). Если в центральной базе запись справочника Пользователи была обновлена и ушла в «дочку», она приносит с собой GUID учетной записи из центральной базы. Если в «дочке» идентификатор пользователя в Конфигураторе не совпадает с тем, что пришел в справочнике, система «теряет» связь. В результате в справочнике мы видим пользователя, но войти под ним не можем, а система выдает ошибку: «У данного пользователя нет учетной записи в информационной базе».

Решение 1: Настройка состава плана обмена

Чтобы прекратить «войну» за права доступа, первым делом проанализируем состав плана обмена. Выясним, какие объекты отвечают за хранение прав в вашей конфигурации. Обычно это:

Если вы хотите, чтобы в каждой базе были свои уникальные права, необходимо исключить эти объекты из обмена. Для этого в Конфигураторе откройте свойства вашего плана обмена, перейдите на вкладку «Состав» и снимите флажки автоматической регистрации для указанных объектов. Однако помните, что это потребует ручного заведения пользователей в каждом узле.

Решение 2: Очистка регистрации изменений

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


Процедура ОчиститьРегистрациюПользователей(УзелОбмена)
    Выборка = ПланыОбмена.ВыбратьИзменения(УзелОбмена, 100);
    Пока Выборка.Следующий() Цикл
        Объект = Выборка.Данные;
        Если ТипЗнч(Объект) = Тип("СправочникОбъект.Пользователи") Тогда
            ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Объект.Ссылка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Решение 3: Синхронизация GUID пользователей программным способом

Если права «слетают» из-за несовпадения GUID в справочнике и в Конфигураторе, можно воспользоваться программным восстановлением связи. Разберем, как обновить идентификатор пользователя ИБ в справочнике. Проанализируем следующий фрагмент кода:


Процедура ВосстановитьСвязьПользователя(ИмяПользователя)
    // Ищем пользователя в справочнике
    ПользовательСсылка = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя);
    Если ПользовательСсылка.Пустая() Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем объект пользователя ИБ из Конфигуратора
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
    
    Если ПользовательИБ <> Неопределено Тогда
        ОбъектСпр = ПользовательСсылка.ПолучитьОбъект();
        // В КА 1.1 идентификатор обычно хранится в скрытом реквизите или доп. свойствах
        // Предположим, используется стандартный механизм связи по уникальному идентификатору
        ИдентификаторИБ = ПользовательИБ.УникальныйИдентификатор;
        
        // В некоторых версиях БСП или КА 1.1 это поле ИдентификаторПользователяИБ
        Если ОбъектСпр.ИдентификаторПользователяИБ <> ИдентификаторИБ Тогда
            ОбъектСпр.ИдентификаторПользователяИБ = ИдентификаторИБ;
            ОбъектСпр.ОбменДанными.Загрузка = Истина;
            ОбъектСпр.Записать();
            Сообщить("Связь для пользователя " + ИмяПользователя + " восстановлена.");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: при записи объекта обязательно устанавливайте ОбменДанными.Загрузка = Истина. Это предотвратит повторную регистрацию изменений и отправку этого исправления обратно в центральную базу, что могло бы вызвать циклическую перезапись.

Рекомендации по управлению правами в РИБ

Для стабильной работы распределенной системы в 1С:Комплексная автоматизация придерживайтесь следующих правил:

  1. Централизованное управление: Редактируйте список пользователей и их права только в центральной базе. Пусть изменения мигрируют в дочерние узлы естественным путем.
  2. Использование ролей: Старайтесь назначать основные права через роли в Конфигураторе, а в режиме «Предприятие» менять только те настройки, которые действительно должны быть уникальными для каждого узла.
  3. Проверка журнала регистрации: При «исчезновении» прав всегда анализируйте ЖурналРегистрации. Ищите события «Обмен данными», «Изменение» справочника «Пользователи» и смотрите, от какого узла пришло сообщение. Это поможет выяснить, какая база является источником некорректных данных.
  4. Контроль номеров сообщений: Если вы создали базу копированием, убедитесь, что номера сообщений в плане обмена (входящие и исходящие) установлены в 0 или согласованы. В противном случае первый же обмен может либо проигнорировать важные данные, либо затереть актуальные настройки устаревшими.

Подводя итог, можно сказать, что проблема «слетающих» прав в 90% случаев вызвана тем, что при обмене данными объект справочника Пользователи из одной базы заменяет объект в другой, принося с собой неверную ссылку на учетную запись Конфигуратора. Правильная настройка состава плана обмена и корректное сопоставление GUID решают эту задачу раз и навсегда.

← На главную