Ситуация, когда пользователи внезапно начинают получать сообщения о недостаточности прав при выполнении стандартных операций (например, сохранении «Отчета производства за смену» или «Реализации товаров и услуг»), является одной из самых трудноуловимых в администрировании 1С. Особенно странно это выглядит в конфигурации УПП 1.3, когда права доступа не менялись, а ошибка указывает на объекты, которые, на первый взгляд, не имеют отношения к проводимому документу — например, на Справочник.Учетные записи документооборота.
В этой статье мы подробно разберем причины возникновения такой ошибки, проанализируем связь со сбоями на уровне SQL-сервера и выработаем пошаговый алгоритм решения проблемы.
Первым делом проанализируем точку отказа. Как правило, ошибка возникает в момент работы подписок на события, отвечающих за регистрацию объектов для обмена данными. Процедура ПередЗаписьюДокументаРегистрацияОбъектаИнформационнойБазыПередЗаписью в общем модуле — это стандартная точка, где система проверяет, нужно ли регистрировать изменения объекта в узлах планов обмена.
Почему система обращается к Справочнику.Учетные записи документооборота? В УПП 1.3 реализованы механизмы «1С-Отчетности» и электронного документооборота (ЭДО). При записи любого документа система может инициировать проверку прав на связанные метаданные или функциональные опции. Если у пользователя настроено ограничение доступа на уровне записей (RLS), система выполняет неявный запрос к таблицам прав.
Рассмотрим ситуацию, упомянутую в обсуждении: перед появлением ошибки на сервере закончилось свободное место и произошел аварийный сбой работы MS SQL Server. Это критический момент по нескольким причинам:
ТекущиеУчетныеЗаписиНалогоплательщика) не инициализируются корректно при старте сеанса пользователя.Проанализируем ситуацию и выполним последовательность действий для восстановления работоспособности системы.
Для начала нам нужно подтвердить, что виноват именно механизм RLS. Проверим это простым способом: временно отключим ограничения доступа в настройках программы. Если ошибка исчезнет, значит, проблема в одном из запросов ограничений в ролях пользователя.
Разберем, как найти проблемную роль. Нам потребуется запустить два сеанса 1С:
Выясним, заполняются ли параметры, используемые в RLS. Часто ограничение на справочник выглядит так:
ГДЕ Ссылка В (&ТекущиеУчетныеЗаписиНалогоплательщика)
Если параметр ТекущиеУчетныеЗаписиНалогоплательщика по какой-то причине оказался пустым или имеет значение Неопределено из-за ошибки в коде инициализации после сбоя, система заблокирует доступ ко всем записям справочника, что и вызовет ошибку «Недостаточно прав».
Поскольку проблема возникла после переполнения диска, необходимо привести базу данных в порядок на уровне СУБД. Выполним следующие действия:
snccntx в каталоге сервера приложений.
EXEC sp_updatestats;
Рассмотрим применение встроенных средств диагностики 1С. В конфигураторе выберите пункт «Администрирование» — «Тестирование и исправление». Нам важны следующие пункты:
Это позволит восстановить внутренние таблицы соответствия прав, если они были нарушены в момент падения SQL-сервера.
Если стандартные действия не помогли, воспользуемся отладчиком. Нам нужно поймать момент записи и проверить значение ДополнительныеСвойства объекта. Рассмотрим пример кода, который часто фигурирует в процедурах регистрации:
Процедура ПередЗаписьюДокументаРегистрацияОбъектаИнформационнойБазыПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверим инициализацию параметров сеанса
Попытка
НужноРегистрировать = ПараметрыСеанса.СохранятьИнформациюОМестеСозданияОбъектов;
Исключение
// Если параметр не доступен, это может вызвать ошибку прав
НужноРегистрировать = Ложь;
КонецПопытки;
Источник.ДополнительныеСвойства.Вставить("НужноРегистрироватьМестоСоздания", НужноРегистрировать);
КонецПроцедуры
Если вы обнаружили, что система «спотыкается» именно на обращении к справочнику учетных записей, попробуйте временно дать роль с правом Чтение на этот справочник без ограничений RLS (установив условие ГДЕ ИСТИНА). Если это решит проблему, значит, логика RLS в вашей конфигурации конфликтует с текущим состоянием данных в базе после сбоя.
Важно: Всегда проверяйте наличие прав на чтение не только основного объекта, но и всех связанных реквизитов, которые могут проверяться платформой при записи в рамках подписок на события.