При переходе с версии 1С:Бухгалтерии предприятия 2.0 (БП 2.0) на 1С:Бухгалтерию предприятия 3.0 (БП 3.0) (удобнее через инструмент перехода БП 2.0 на 3.0) многие пользователи сталкиваются с затруднениями, связанными с учетными записями. Наиболее распространенные проблемы включают в себя отсутствие флажка «Вход в программу разрешен», сообщения об ошибках «Имя для входа уже занято», а также «Пользователь... не существует в справочнике пользователи». Эти трудности возникают из-за различий в механизмах управления пользователями между двумя версиями платформы.
В БП 3.0 реализован иной подход к управлению пользователями, требующий синхронизации учетных записей информационной базы (ИБ) и элементов справочника «Пользователи» в режиме 1С:Предприятие. В отличие от БП 2.0, где пользователи могли быть созданы исключительно в конфигураторе, БП 3.0 предполагает, что создание и управление пользователями осуществляется преимущественно через режим 1С:Предприятие, с автоматическим созданием или изменением соответствующего пользователя в конфигураторе. Рассинхронизация этих списков в процессе обновления часто приводит к указанным ошибкам. Давайте разберем подробнее, как мы можем решить эти проблемы.
Прежде чем перейти к решениям, мы выясним причины, по которым возникают эти сложности. В БП 2.0 пользователи обычно создавались в конфигураторе. При переходе на БП 3.0 система пытается сопоставить этих пользователей с новым механизмом. Если есть дубликаты полных имен пользователей, или если пользователи были созданы только в конфигураторе без соответствующего элемента в справочнике «Пользователи» (в БП 2.0 это было опционально), возникают проблемы сопоставления.
Наиболее простым и рекомендуемым способом решения проблем с сопоставлением пользователей является использование встроенного механизма в БП 3.0.
Этот метод часто решает проблему для большинства пользователей и является наиболее предпочтительным, поскольку использует штатные механизмы конфигурации.
Если автоматическое сопоставление не дает результата, особенно для пользователей, у которых возникает ошибка «Имя для входа уже занято» или «Пользователь... не существует в справочнике пользователи», мы можем применить более радикальный метод. Важно помнить, что в современных конфигурациях 1С, построенных на Библиотеке стандартных подсистем (БСП), пользователей рекомендуется заводить только через режим 1С:Предприятие.
Этот подход гарантирует корректную привязку пользователя ИБ к элементу справочника «Пользователи», так как создание происходит в соответствии с логикой БП 3.0.
В случаях, когда пользователей много или предыдущие методы не приносят желаемого результата, мы можем прибегнуть к программному сопоставлению. Это требует навыков работы с кодом 1С.
Основная идея заключается в том, чтобы установить для элемента справочника «Пользователи» корректное значение поля ИдентификаторПользователяИБ, которое хранит уникальный идентификатор соответствующего пользователя информационной базы (конфигуратора).
Рассмотрим пример кода, который можно использовать в отдельной внешней обработке или в консоли запросов/команд (поможет набор инструментов анализа прав и метаданных) для восстановления связи:
// Получаем всех пользователей информационной базы
МП = ПользователиИнформационнойБазы.ПолучитьПользователей();
// Создаем соответствие для быстрого поиска пользователей ИБ по полному имени
СП = Новый Соответствие;
Для Каждого П ИЗ МП Цикл
СП.Вставить(П.ПолноеИмя, П);
КонецЦикла;
// Выбираем всех пользователей из справочника "Пользователи" в режиме 1С:Предприятие
ВыборкаПользователейСправочника = Справочники.Пользователи.Выбрать();
Пока ВыборкаПользователейСправочника.Следующий() Цикл
// Пытаемся найти соответствующего пользователя ИБ по наименованию (полному имени)
// Предполагаем, что Наименование в справочнике соответствует ПолномуИмени в ИБ
ПользовательИБ = СП.Получить(ВыборкаПользователейСправочника.Наименование);
// Получаем объект справочника для изменения
ОбъектСправочникаПользователи = ВыборкаПользователейСправочника.ПолучитьОбъект();
Если ПользовательИБ = Неопределено Тогда
// Если пользователь ИБ не найден, возможно, он недействителен или удален
// Мы можем пометить его как недействительного в справочнике
ОбъектСправочникаПользователи.Недействителен = Истина;
Сообщить("Для пользователя справочника """ + ВыборкаПользователейСправочника.Наименование + """ не найден соответствующий пользователь ИБ. Помечен как недействительный.");
Иначе
// Если пользователь ИБ найден, устанавливаем его уникальный идентификатор
ОбъектСправочникаПользователи.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
Сообщить("Для пользователя справочника """ + ВыборкаПользователейСправочника.Наименование + """ установлен ИдентификаторПользователяИБ.");
КонецЕсли;
// Важно: установить флаг Загрузка = Истина, чтобы система не проверяла права при записи
ОбъектСправочникаПользователи.ОбменДанными.Загрузка = Истина;
ОбъектСправочникаПользователи.Записать();
КонецЦикла;
Сообщить("Процесс сопоставления пользователей завершен.");
Мы проанализируем этот код:
ПользователиИнформационнойБазы.ПолучитьПользователей().СП, где ключом является полное имя пользователя ИБ, а значением — сам объект пользователя ИБ. Это позволяет нам быстро находить пользователя ИБ по его полному имени.Наименование (предполагая, что наименование в справочнике соответствует полному имени пользователя в ИБ).УникальныйИдентификатор в поле ИдентификаторПользователяИБ элемента справочника. Это и есть ключевой шаг для установления связи.ОбъектСправочникаПользователи.ОбменДанными.Загрузка = Истина; очень важна, так как она отключает некоторые проверки при записи, что позволяет произвести изменения даже с ограниченными правами или в ситуациях, когда обычная запись блокируется.Дополнительно, для более точного сопоставления, если имена пользователей в ИБ и в справочнике не всегда совпадают, мы можем использовать следующий подход, как было предложено в одном из сообщений:
// В режиме отладки или в обработке
// Получаем объект справочника "Пользователи" для текущего пользователя
ОбъектПользовательСправочника = Справочники.Пользователи.НайтиПоНаименованию("ИмяПользователяВСправочнике").ПолучитьОбъект();
// Находим пользователя ИБ по имени, как оно написано в конфигураторе
// Например, если имя пользователя в конфигураторе "Администратор", а в справочнике "Иванов И.И."
// то мы можем найти по "Администратор"
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("Имя пользователя как написано в конфигураторе");
Если ПользовательИБ <> Неопределено Тогда
// Устанавливаем идентификатор пользователя ИБ для объекта справочника
ОбъектПользовательСправочника.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
// Включаем флажок входа, если он был сброшен
ОбъектПользовательСправочника.ВходВПрограммуРазрешен = Истина;
// Отключаем проверки при записи
ОбъектПользовательСправочника.ОбменДанными.Загрузка = Истина;
ОбъектПользовательСправочника.Записать();
Сообщить("Связь для пользователя " + ОбъектПользовательСправочника.Наименование + " восстановлена.");
Иначе
Сообщить("Пользователь ИБ с именем 'Имя пользователя как написано в конфигураторе' не найден.");
КонецЕсли;
Этот фрагмент демонстрирует точечное восстановление связи для конкретного пользователя, при условии, что мы знаем имя пользователя в конфигураторе и можем найти соответствующий элемент в справочнике «Пользователи».
Мы рассмотрим дополнительные рекомендации, которые помогут избежать проблем при обновлении и последующей работе:
Мы видим, что проблемы с пользователями после обновления на БП 3.0 являются достаточно частыми, но имеют четкие пути решения. Важно тщательно проверять состояние пользователей и использовать рекомендованные методы сопоставления или, при необходимости, программные подходы для восстановления корректной работы.