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