Казалось бы максимально безопасное изменение.
Но сегодня отвалился один механизм с ошибкой "Нет доступа на этот справочник".
Как такое может быть? о_О
[spoiler]
А вот как.
Анализ показал что ошибка воспроизводится при выполнении запроса по значениям свойств (с отбором по справочнику договоров)
ВЫБРАТЬ ЗначенияСвойствОбъектов.Объект КАК ДоговорКонтрагента ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ГДЕ ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.ДоговорыКонтрагентов И ЗначенияСвойствОбъектов.Объект.Владелец = &Контрагент И ЗначенияСвойствОбъектов.Значение = &Склад |
При этом запрос по тому же источнику, но безо всяких условий - выполняется без проблем.
Нарушение доступа в условии по "Объект.Владелец".
Так как поле Объект имеет составной тип, в том числе справочник Номенклатура, то такое условие означает проверку на равенство со всеми подчиненными справочниками. В том числе и с этим новым, на который нет доступа. Тут то и возникает исключение.
Что делать?
1. Вариант быстрый, которым и воспользовались до разбора - в нужной роли дать права на чтение этого справочника (в нашем случае это не противоречит требованиям безопасности)
2. Вариант еще быстрей, если известен проблемный запрос - добавить конструкцию РАЗРЕШЕННЫЕ
ВЫБРАТЬ РАЗРЕШЕННЫЕ <Дальше то же самое> |
3. Вариант оптимальный. Ограничить составной тип с помощью конструкции ВЫРАЗИТЬ, так как в данном случае нас интересуют значения свойств только договоров
ВЫБРАТЬ ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.ДоговорыКонтрагентов) КАК ДоговорКонтрагента ПОМЕСТИТЬ ВремТаб ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ГДЕ ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.ДоговорыКонтрагентов И ЗначенияСвойствОбъектов.Значение = &Склад ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВремТаб.ДоговорКонтрагента ИЗ ВремТаб КАК ВремТаб ГДЕ ВремТаб.ДоговорКонтрагента.Владелец = &Владелец |
Что делать, чтобы таких проблем не возникало?
Всегда при использовании запросов по составным типам, и когда нужны не все из них - явно ограничивать типы (вариант 3) перед дальнейшими действиями (если есть отбор и всё остальное "через точку" от поля составного типа) в предварительной временной таблице.
Такой подход кстати и производительность увеличит! (из-за уменьшения количества левых соединений)
