Как перенести список пользователей между идентичными базами 1С без справочника Пользователи

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

При работе с самописными конфигурациями или базами на стадии разработки часто возникает ситуация, когда список пользователей ведется исключительно на уровне платформы (в списке пользователей информационной базы), а привычный справочник Пользователи отсутствует. Когда необходимо перенести этот список в другую, идентичную по структуре базу, простое копирование файлов не поможет. В данной статье мы подробно разберем, как перенести логины, пароли и роли пользователей, сохранив при этом их работоспособность. Для этой задачи также можно использовать обработку для группового переноса пользователей между базами 1С.

Метод 1. Программный перенос через объектную модель 1С

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

Рассмотрим алгоритм действий:

  1. Подключимся к исходной и целевой базе (это можно сделать через COM-соединение или просто выгрузив данные в промежуточный файл XML/JSON).
  2. Проитерируем всех пользователей исходной базы.
  3. Для каждого пользователя получим его свойства: Имя, ПолноеИмя, Роли, АутентификацияСтандартная и хеш пароля.
  4. Создадим аналогичного пользователя в целевой базе и запишем данные.

Посмотрим на пример кода для выгрузки данных:


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

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

Разберем по шагам процесс загрузки:

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


// В целевой базе
Для Каждого ДанныеПользователя Из ЗагруженныйМассивДанных Цикл
    НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
    НовыйПользователь.Имя = ДанныеПользователя.Имя;
    НовыйПользователь.ПолноеИмя = ДанныеПользователя.ПолноеИмя;
    
    // Переносим хеш пароля напрямую
    НовыйПользователь.СохраненноеЗначениеПароля = ДанныеПользователя.ПарольХеш;
    
    // Назначаем роли
    Для Каждого ИмяРоли Из ДанныеПользователя.Роли Цикл
        НайденнаяРоль = Метаданные.Роли.Найти(ИмяРоли);
        Если НайденнаяРоль <> Неопределено Тогда
            НовыйПользователь.Роли.Добавить(НайденнаяРоль);
        КонецЕсли;
    КонецЦикла;
    
    НовыйПользователь.Записать();
КонецЦикла;

Важный момент: При программном создании пользователей в новых версиях платформы (8.3.15+) может сработать ЗащитаОтОпасныхДействий. В некоторых случаях выполнение кода может потребовать подтверждения со стороны администратора или предварительного отключения этой защиты для сеанса.

Метод 2. Прямое копирование через SQL (для клиент-серверного варианта)

Если базы работают под управлением MS SQL Server или PostgreSQL, существует возможность «перебросить» пользователей через системную таблицу v8users. Выясним причину, по которой этот метод считается рискованным: в таблице содержатся уникальные идентификаторы (UUID), которые могут конфликтовать с уже существующими записями в целевой базе.

Проанализируем ситуацию:

Таблица dbo.v8users (в SQL) хранит бинарные данные о настройках пользователей. Если целевая база абсолютно пустая (только что созданная из файла .cf), этот метод сработает максимально быстро.

  1. Остановите службу кластера 1С (это критически важно для очистки серверного кэша).
  2. Средствами SQL выполните очистку таблицы v8users в целевой базе.
  3. Выполните команду INSERT INTO ... SELECT FROM из исходной базы в целевую.
  4. Запустите службу кластера 1С.

Внимание: Если в целевой базе уже созданы пользователи, их GUID могут пересекаться с метаданными. Мы рекомендуем использовать этот метод только в крайнем случае, когда объем данных слишком велик для программного переноса.

Особенности переноса прав и аутентификации ОС

Если ваши пользователи используют авторизацию Windows, обратите внимание на свойство ПользовательОС. Просто перенести строку логина (например, "DOMAIN\User") недостаточно для корректной работы, если базы находятся в разных инфраструктурах. Однако, если домен общий, 1С подхватит SID пользователя автоматически при записи объекта ПользовательИнформационнойБазы.

Рассмотрим нюансы работы с ролями:

При использовании метода Роли.Добавить() платформа проверяет наличие роли в текущих метаданных. Если вы переносите пользователя с ролью, которой нет в целевой конфигурации, выполнение кода прервется с ошибкой. Поэтому всегда используйте проверку Метаданные.Роли.Найти(), как было показано выше.

Использование инструментов администрирования (RAC/RAS)

Для системных администраторов, предпочитающих консольные инструменты, отличным решением станет утилита rac. Она позволяет управлять списком пользователей сервера без захода в конфигуратор.

Посмотрим на пример логики:

Вы можете использовать команду rac user list для получения списка всех пользователей в текстовом формате. С помощью скриптов на Python или PowerShell этот список легко преобразуется в набор команд rac user insert для целевой базы. Это особенно удобно, если нужно автоматизировать процесс развертывания новых инстансов системы.

Критически важный совет:

При любом способе автоматизированной загрузки пользователей всегда проверяйте наличие администратора. Если вы очистите список пользователей в целевой базе и загрузите новых, но забудете назначить кому-то права с ролью ПолныеПрава (или аналогичной), вы рискуете "запереть" базу. После завершения загрузки первым делом попробуйте зайти в целевую базу под самым привилегированным пользователем.

Таким образом, мы рассмотрели три основных подхода к решению задачи. Выбор метода зависит от ваших навыков: программирование через StoredPasswordValue является наиболее универсальным, SQL-запросы — самыми быстрыми для пустых баз, а утилиты администрирования — лучшим выбором для автоматизации процессов.

← На главную