В практике администрирования систем на платформе 1С:Предприятие случаются критические ситуации, когда из-за логических сбоев или некорректных обновлений в базе данных пропадают права у всех пользователей. Особенно сложной ситуация становится в серверных версиях, где стандартные утилиты вроде Tool1CD не могут напрямую работать с данными SQL-сервера. Проанализируем сценарий, когда роль Администрирование повреждена, а войти в систему под полными правами невозможно даже для выгрузки информационной базы в файл .dt.
Разберем ситуацию, описанную в обращении. В конфигурации 1С:Управление торговлей 11 произошел сбой: при записи новой группы доступа системная роль Администрирование исчезает из списка доступных. Это приводит к тому, что ни один пользователь не может получить административные функции, а попытка выгрузить базу или войти в Конфигуратор блокируется системой из-за недостатка прав. Поскольку база находится на SQL Server, мы не можем просто открыть файл 1Cv8.1CD. Нам потребуется прибегнуть к методам прямого взаимодействия с таблицами базы данных.
Рассмотрим наиболее эффективный метод получения доступа к базе, когда в ней не осталось пользователей с правами администратора. Платформа 1С хранит данные о пользователях в специальных системных таблицах. Если платформа «не видит» ни одного пользователя, она позволяет войти в Конфигуратор с неограниченными правами.
Выясним, какие действия необходимо предпринять на стороне SQL Server Management Studio (SSMS):
-- Переименовываем таблицу пользователей
EXEC sp_rename 'v8users', 'v8users_backup';
Params. Нам нужно удалить или переименовать запись users.usr. Проанализируем запрос:
-- Удаление записи о пользователях из таблицы параметров
DELETE FROM Params WHERE FileName = 'users.usr';
После выполнения этих действий платформа при запуске решит, что база абсолютно чистая в плане безопасности. Теперь мы можем беспрепятственно зайти в Конфигуратор. Важно помнить, что после завершения восстановительных работ таблицу v8users нужно будет вернуть в исходное состояние или заново создать пользователей.
Если проблема заключается именно в повреждении метаданных самой роли, и она «пропадает» из дерева конфигурации, рассмотрим вариант ее принудительного восстановления. Вся конфигурация хранится в таблице Config. Каждая строка там — это объект метаданных, упакованный в бинарный формат (обычно с использованием сжатия zlib).
Разберем алгоритм загрузки роли, если у нас есть ее выгрузка в формате .xml из исправной копии базы:
Важный нюанс: Прямая вставка XML в SQL-таблицу Config затруднена тем, что 1С хранит данные в сжатом бинарном виде. Однако мы можем использовать механизм сравнения и объединения конфигураций после того, как получили доступ по Способу 1.
Если же мы решим действовать программно из другой базы (источника), можно попробовать перенести пользователя с полными правами через XML-сериализацию. Посмотрим на пример кода, который выполняет выгрузку пользователя:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ИмяПользователя = "АдминистраторВосстановление";
лПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если лПользователь <> Неопределено Тогда
Хранилище = Новый ХранилищеЗначения(лПользователь);
ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент");
ЗаписатьXML(ЗаписьXML, Хранилище);
ЗаписьXML.ЗаписатьКонецЭлемента();
Результат = ЗаписьXML.Закрыть();
КонецЕсли;
Проанализируем процесс загрузки этого пользователя в целевую базу (при условии, что мы уже обошли защиту SQL):
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(дхПользовательИБ);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.ЛокальноеИмя = "Элемент" Тогда
// Читаем значение из XML
Хранилище = XMLЗначение(Тип("ХранилищеЗначения"), ЧтениеXML.Значение).Получить();
НовыйПользователь = Хранилище;
Попытка
НовыйПользователь.Записать();
Сообщить("Пользователь успешно восстановлен");
Исключение
Сообщить("Ошибка записи: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
После того как доступ в Конфигуратор получен, необходимо выяснить причину исчезновения роли. Проанализируем ситуацию: если роль пропадает при записи группы доступа, значит, нарушены внутренние связи в таблице DBSchema или Config. Посмотрим, какие шаги помогут исправить ситуацию:
Тестирование и исправление конфигурации с включенными опциями «Проверка логической целостности» и «Проверка ссылочной целостности».1C:Enterprise Server Administration и удалить содержимое папок snccntx в каталоге кластера.Config через XML, лучше использовать стандартный механизм Конфигурация - Сравнить, объединить с конфигурацией из файла, выбрав чистый .cf файл того же релиза. Это позволит платформе корректно обновить идентификаторы UUID в системных таблицах.Рассмотренные методы прямой правки SQL-таблиц являются экстренными. Помните, что любое вмешательство в таблицу Config или v8users лишает базу официальной поддержки. Проанализировав ситуацию, мы видим, что наиболее безопасным путем является сброс таблицы пользователей для входа в Конфигуратор с последующим восстановлением метаданных штатными средствами платформы. Всегда держите под рукой актуальный файл .cf вашей конфигурации, чтобы иметь возможность восстановить поврежденные объекты метаданных без потери данных в пользовательских таблицах.