официальный партнёр 1С по деловому софту
Закрыть
Логин:
Пароль:
Забыли свой пароль?
  Войти
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
 
8(495)229-30-42
город Зеленоград, ул. Юности, д.8

Запросы по объектам составных типов (или как сломать конфигурацию простым добавлением справочника)

Вчера в конфигурацию, на которой работает сеть супермаркетов был добавлен справочник (подчиненный Номенклатуре). Всё. Никаких ссылок на него, никакого использования в коде. (В основных ролях доступ на него не открывался)

Казалось бы максимально безопасное изменение.

Но сегодня отвалился один механизм с ошибкой "Нет доступа на этот справочник".

Как такое может быть? о_О

[spoiler]
А вот как.
Анализ показал что ошибка воспроизводится при выполнении запроса по значениям свойств (с отбором по справочнику договоров)
ВЫБРАТЬ
   ЗначенияСвойствОбъектов.Объект КАК ДоговорКонтрагента
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
   ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.ДоговорыКонтрагентов
   И ЗначенияСвойствОбъектов.Объект.Владелец = &Контрагент
   И ЗначенияСвойствОбъектов.Значение = &Склад


При этом запрос по тому же источнику, но безо всяких условий - выполняется без проблем.
Нарушение доступа в условии по "Объект.Владелец".
Так как поле Объект имеет составной тип, в том числе справочник Номенклатура, то такое условие означает проверку на равенство со всеми подчиненными справочниками. В том числе и с этим новым, на который нет доступа. Тут то и возникает исключение.

Что делать?

1. Вариант быстрый, которым и воспользовались до разбора - в нужной роли дать права на чтение этого справочника (в нашем случае это не противоречит требованиям безопасности)

2. Вариант еще быстрей, если известен проблемный запрос - добавить конструкцию РАЗРЕШЕННЫЕ

ВЫБРАТЬ РАЗРЕШЕННЫЕ <Дальше то же самое>


3. Вариант оптимальный. Ограничить составной тип с помощью конструкции ВЫРАЗИТЬ, так как в данном случае нас интересуют значения свойств только договоров

ВЫБРАТЬ
   ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Объект КАК Справочник.ДоговорыКонтрагентов) КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВремТаб
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ГДЕ
   ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.ДоговорыКонтрагентов
   И ЗначенияСвойствОбъектов.Значение = &Склад
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВремТаб.ДоговорКонтрагента
ИЗ
   ВремТаб КАК ВремТаб
ГДЕ
   ВремТаб.ДоговорКонтрагента.Владелец = &Владелец
   


Что делать, чтобы таких проблем не возникало?
Всегда при использовании запросов по составным типам, и когда нужны не все из них - явно ограничивать типы (вариант 3) перед дальнейшими действиями (если есть отбор и всё остальное "через точку" от поля составного типа) в предварительной временной таблице.

Такой подход кстати и производительность увеличит! (из-за уменьшения количества левых соединений)