Перенос списка пользователей между информационными базами 1С — задача, которая кажется простой только на первый взгляд. Многие технические специалисты пытаются решить её «в лоб», манипулируя таблицами на уровне СУБД, однако часто сталкиваются с тем, что пользователи либо не появляются в списке, либо теряют связь со своими данными в справочниках. В этой статье мы подробно разберем, почему прямая правка SQL-таблиц — это плохая идея, и рассмотрим надежные способы переноса учетных записей с сохранением паролей и прав доступа.
Рассмотрим типичную ситуацию: системный администратор пытается перенести данные из таблицы Params, удаляя строку с FileName = 'users.usr' в целевой базе и вставляя аналогичную строку из исходной базы. Несмотря на то, что данные (включая размер DataSize) идентичны, список пользователей в Конфигураторе остается пустым. Проанализируем причины этого явления:
rmngr.users.usr, но при этом в самой базе уже существуют ссылки на пользователей в документах (поле Автор, Ответственный), возникнет конфликт идентификаторов. Объекты превратятся в «Объект не найден», так как GUID старых пользователей не совпадут с новыми.Самый простой и рекомендуемый фирмой 1С способ — это использование специализированных обработок. На портале ИТС (Информационно-технологического сопровождения) существует решение для выгрузки и загрузки пользователей. Главное преимущество этого метода в том, что он работает через программный интерфейс платформы (объект ПользователиИнформационнойБазы), что гарантирует целостность данных.
Важный нюанс: Данные обработки часто написаны с использованием управляемых форм. Если ваша конфигурация работает на обычных формах (как это часто бывает в 1С 8.2), вы можете столкнуться с ошибкой запуска. Рассмотрим, как это обойти:
Истина.Если готовые инструменты недоступны, мы можем самостоятельно написать скрипт для переноса. Разберем логику создания обработки, которая будет считывать пользователей из одной базы и создавать их в другой. Для доступа к исходной базе удобнее всего использовать COMConnector.
Рассмотрим пример кода для программного создания пользователя:
// Создадим объект для работы со списком пользователей текущей БД
НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
// Заполним основные реквизиты, полученные из источника
НовыйПользователь.Имя = "ИвановИИ";
НовыйПользователь.ПолноеИмя = "Иванов Иван Иванович";
НовыйПользователь.АутентификацияСтандартная = Истина;
// Работа с паролем: мы не можем прочитать чистый текст пароля,
// но можем перенести признак его наличия или установить новый.
НовыйПользователь.Пароль = "НужныйПароль";
// Присвоение ролей (права доступа)
Для Каждого РольИзИсточника Из СписокРолей Цикл
НовыйПользователь.Роли.Добавить(Метаданные.Роли.Найти(РольИзИсточника));
КонецЦикла;
// Сохранение изменений в БД
НовыйПользователь.Записать();
Проанализируем работу с паролями подробнее. Начиная с версии 8.2.15, платформа позволяет копировать хэш пароля. Если мы используем метод Записать(), платформа сама обновит хэш. Однако, если стоит задача именно точного переноса «один в один» без знания самих паролей, рекомендуется использовать специализированные методы экспорта в XML, которые умеют упаковывать зашифрованные данные пользователя.
Выясним важную деталь: в большинстве типовых конфигураций (УПП, БП, ЗУП) существует справочник Справочник.Пользователи. Пользователь информационной базы (учетная запись для входа) и элемент этого справочника — это разные объекты, связанные между собой.
При переносе пользователей базы данных (через Конфигуратор или программно) необходимо убедиться, что в целевой базе в справочнике Пользователи создан соответствующий элемент, и в его реквизите (обычно это ИдентификаторПользователяИБ) прописан верный GUID. Если этого не сделать, программа при входе не сможет определить, какой именно сотрудник зашел в систему, и многие функции (например, подстановка ответственного в документы) перестанут работать.
Рекомендуемый алгоритм совместного переноса:
Пользователи через обработку ВыгрузкаЗагрузкаДанныхXML. Это позволит сохранить GUID-ы элементов справочника.
ТекПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
ОбъектСправочника = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван Иванович").ПолучитьОбъект();
ОбъектСправочника.ИдентификаторПользователяИБ = ТекПользовательИБ.УникальныйИдентификатор;
ОбъектСправочника.Записать();
Рассмотрим ситуацию, когда в исходной базе использовалась доменная авторизация. В этом случае свойство ПользовательWindows содержит имя пользователя в формате DOMAIN\UserName. При переносе важно помнить:
Подводя итог, можно сказать, что наиболее надежный путь — это комбинация использования типовой обработки с ИТС (для переноса самих учетных записей) и обработки ВыгрузкаЗагрузкаДанныхXML (для переноса справочника пользователей).
Никогда не используйте прямое редактирование SQL-таблиц для этих целей, так как это не учитывает бизнес-логику платформы 1С и механизмы кэширования. После выполнения переноса любым из способов, обязательно выполните перезапуск службы сервера 1С, чтобы обновить состояние кэша пользователей в оперативной памяти сервера.