В процессе разработки и эксплуатации внешних обработок в 1С:Предприятие 8.3 пользователи могут столкнуться с критической ошибкой, возникающей при выполнении запросов к базе данных, работающей на СУБД PostgreSQL. Текст ошибки обычно выглядит как «Ошибка SDBL: Внутренняя ошибка при реконструкции запроса (2)». Важной особенностью является то, что ошибка часто проявляется только у пользователей, не обладающих правами администратора, что напрямую указывает на конфликт системы прав доступа (RLS) и механизма формирования SQL-запросов платформой 1С.
Рассмотрим, почему это происходит. При выполнении кода РезультатЗапроса = Запрос.Выполнить(); платформа 1С транслирует ваш объект Запрос в SQL-код для СУБД PostgreSQL. В случае использования RLS (ограничения прав на уровне записей), 1С в автоматическом режиме добавляет в запрос дополнительные условия проверки прав. Если структура запроса является сложной или база данных имеет специфическую конфигурацию, автоматическая трансляция может привести к превышению лимитов сложности запроса или некорректной интерпретации со стороны оптимизатора PostgreSQL, что и вызывает сбой на низком уровне SDBL.
Основным способом устранения данной ошибки, который подтвердил автор темы, является использование привилегированного режима. Привилегированный режим позволяет временно отключить проверки прав доступа и RLS для текущего участка кода, тем самым исключая добавление «тяжелых» условий проверки прав в SQL-запрос.
Давайте разберем, как правильно реализовать этот подход:
УстановитьПривилегированныйРежим(Истина) непосредственно перед выполнением запроса.УстановитьПривилегированныйРежим(Ложь) после завершения операции.Посмотрим на пример реализации серверного вызова:
// Пример серверной процедуры модуля
Процедура ВыполнитьЗапросВПривилегированномРежиме()
УстановитьПривилегированныйРежим(Истина);
Попытка
Запрос = Новый Запрос;
Запрос.Текст = "...ваш текст запроса...";
Результат = Запрос.Выполнить();
// Обработка результата
Исключение
// Обработка ошибок
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
При попытке борьбы с ошибками безопасности разработчики часто сталкиваются с использованием метода УстановитьБезопасныйРежим(Ложь). Важно понимать, что этот метод не является универсальным решением для ошибок SDBL. Более того, при попытке вызвать его в процедуре, где безопасный режим не был установлен платформой автоматически, вы получите ошибку исполнения. Поэтому для устранения проблем с RLS рекомендуется именно УстановитьПривилегированныйРежим.
Если использование привилегированного режима по политике безопасности компании нежелательно, рекомендуем обратить внимание на следующие аспекты:
РАЗРЕШЕННЫЕ. Это позволяет платформе корректно фильтровать записи, доступные пользователю, еще до отправки сложного SQL-запроса на сервер.PostgreSQL. Убедитесь, что вы используете рекомендованные версии компонентов для вашей конфигурации.Использование привилегированного режима — наиболее быстрый и действенный способ решения данной проблемы. Однако, при его использовании всегда помните о необходимости ограничения области действия этого режима минимально возможным участком кода, чтобы не нарушать политику безопасности системы.