Как правильно перенести пользователей базы данных в 1С:Предприятие 8.2 и 8.3

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

Перенос списка пользователей между информационными базами 1С — задача, которая кажется простой только на первый взгляд. Многие технические специалисты пытаются решить её «в лоб», манипулируя таблицами на уровне СУБД, однако часто сталкиваются с тем, что пользователи либо не появляются в списке, либо теряют связь со своими данными в справочниках. В этой статье мы подробно разберем, почему прямая правка SQL-таблиц — это плохая идея, и рассмотрим надежные способы переноса учетных записей с сохранением паролей и прав доступа.

Анализ проблемы: почему перенос через таблицу Params неэффективен

Рассмотрим типичную ситуацию: системный администратор пытается перенести данные из таблицы Params, удаляя строку с FileName = 'users.usr' в целевой базе и вставляя аналогичную строку из исходной базы. Несмотря на то, что данные (включая размер DataSize) идентичны, список пользователей в Конфигураторе остается пустым. Проанализируем причины этого явления:

  1. Кэширование на стороне сервера: Платформа 1С:Предприятие активно использует кэширование. Список пользователей считывается при запуске службы сервера. Любые изменения, внесенные в SQL в обход серверных механизмов 1С, просто не «подхватываются» до полной очистки кэша или перезапуска службы rmngr.
  2. Механизм хранения в современных версиях: Начиная с определенных релизов платформы 8.2, информация о пользователях может дублироваться или проверяться через внутренние индексы, которые не обновляются при простом INSERT в таблицу.
  3. Связь с идентификаторами (UUID): Каждый пользователь имеет уникальный внутренний идентификатор. Если просто скопировать файл users.usr, но при этом в самой базе уже существуют ссылки на пользователей в документах (поле Автор, Ответственный), возникнет конфликт идентификаторов. Объекты превратятся в «Объект не найден», так как GUID старых пользователей не совпадут с новыми.

Способ 1: Использование типовых обработок с ИТС

Самый простой и рекомендуемый фирмой 1С способ — это использование специализированных обработок. На портале ИТС (Информационно-технологического сопровождения) существует решение для выгрузки и загрузки пользователей. Главное преимущество этого метода в том, что он работает через программный интерфейс платформы (объект ПользователиИнформационнойБазы), что гарантирует целостность данных.

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

  1. Не обязательно переписывать код обработки. Мы можем временно изменить свойства конфигурации.
  2. В корне дерева метаданных (в Конфигураторе) откроем свойства конфигурации.
  3. Найдем раздел Основные и параметр Использовать управляемые формы в обычном приложении. Установим его в значение Истина.
  4. Теперь мы сможем запустить обработку в режиме обычного приложения.
  5. Альтернативный вариант: запустить базу в режиме Тонкого клиента, даже если основная работа ведется в толстом. Управляемые формы обработки в этом режиме откроются без проблем.

Способ 2: Программный перенос пользователей через встроенный язык

Если готовые инструменты недоступны, мы можем самостоятельно написать скрипт для переноса. Разберем логику создания обработки, которая будет считывать пользователей из одной базы и создавать их в другой. Для доступа к исходной базе удобнее всего использовать COMConnector.

Рассмотрим пример кода для программного создания пользователя:


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

// Заполним основные реквизиты, полученные из источника
НовыйПользователь.Имя = "ИвановИИ";
НовыйПользователь.ПолноеИмя = "Иванов Иван Иванович";
НовыйПользователь.АутентификацияСтандартная = Истина;

// Работа с паролем: мы не можем прочитать чистый текст пароля,
// но можем перенести признак его наличия или установить новый.
НовыйПользователь.Пароль = "НужныйПароль";

// Присвоение ролей (права доступа)
Для Каждого РольИзИсточника Из СписокРолей Цикл
    НовыйПользователь.Роли.Добавить(Метаданные.Роли.Найти(РольИзИсточника));
КонецЦикла;

// Сохранение изменений в БД
НовыйПользователь.Записать();

Проанализируем работу с паролями подробнее. Начиная с версии 8.2.15, платформа позволяет копировать хэш пароля. Если мы используем метод Записать(), платформа сама обновит хэш. Однако, если стоит задача именно точного переноса «один в один» без знания самих паролей, рекомендуется использовать специализированные методы экспорта в XML, которые умеют упаковывать зашифрованные данные пользователя.

Синхронизация со справочником «Пользователи»

Выясним важную деталь: в большинстве типовых конфигураций (УПП, БП, ЗУП) существует справочник Справочник.Пользователи. Пользователь информационной базы (учетная запись для входа) и элемент этого справочника — это разные объекты, связанные между собой.

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

Рекомендуемый алгоритм совместного переноса:

  1. Выгружаем справочник Пользователи через обработку ВыгрузкаЗагрузкаДанныхXML. Это позволит сохранить GUID-ы элементов справочника.
  2. Создаем или переносим пользователей базы данных (учетные записи).
  3. Программно связываем их. Выглядит это примерно так:

ТекПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
ОбъектСправочника = Справочники.Пользователи.НайтиПоНаименованию("Иванов Иван Иванович").ПолучитьОбъект();
ОбъектСправочника.ИдентификаторПользователяИБ = ТекПользовательИБ.УникальныйИдентификатор;
ОбъектСправочника.Записать();

Перенос пользователей с Windows-аутентификацией

Рассмотрим ситуацию, когда в исходной базе использовалась доменная авторизация. В этом случае свойство ПользовательWindows содержит имя пользователя в формате DOMAIN\UserName. При переносе важно помнить:

Итоги и рекомендации

Подводя итог, можно сказать, что наиболее надежный путь — это комбинация использования типовой обработки с ИТС (для переноса самих учетных записей) и обработки ВыгрузкаЗагрузкаДанныхXML (для переноса справочника пользователей).

Никогда не используйте прямое редактирование SQL-таблиц для этих целей, так как это не учитывает бизнес-логику платформы 1С и механизмы кэширования. После выполнения переноса любым из способов, обязательно выполните перезапуск службы сервера 1С, чтобы обновить состояние кэша пользователей в оперативной памяти сервера.

← На главную