В процессе обновления типовых конфигураций, таких как 1С:Управление торговлей 11 (1С:УТ 11), программисты и администраторы периодически сталкиваются с прерыванием процесса из-за ошибок выполнения служебных запросов. Разберем по шагам одну из наиболее неочевидных проблем, которая сопровождается следующим сообщением системы:
Ошибка при вызове метода контекста (ВыполнитьПакет)
Результат = Запрос.ВыполнитьПакет;
по причине: Ошибка выполнения запроса по причине: Ошибка в ограничении доступа к данным.
объект: 'РегистрНакопления.ДвиженияКонтрагентКонтрагент', поле: 'Регистратор'; право: 'Чтение'
{(60, 1)}: Таблица не найдена "Т" >Т ИЗ Т
Проанализируем ситуацию и выясним причину, по которой платформа не может обнаружить загадочную таблицу «Т», а также рассмотрим несколько рабочих способов устранения этой неполадки.
Текст >Т ИЗ Т может сбить с толку, так как в исходном запросе разработчика такой таблицы нет. На самом деле, это часть типового шаблона ограничения доступа на уровне записей (RLS — Row Level Security), который используется в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). Буква «Т» — это короткий псевдоним текущей таблицы, который платформа подставляет для оптимизации длины SQL-запроса.
Ошибка возникает в тот момент, когда платформа 1С пытается «на лету» наложить макрос RLS на ваш выполняемый запрос. Чаще всего это происходит при соблюдении следующих условий:
&ВТДляОбработки) с физическими таблицами регистров (например, РегистрНакопления.ДвиженияКонтрагентКонтрагент).Посмотрим на самое простое решение, которое не требует навыков программирования. Ошибку можно обойти, временно отключив ограничения прав на уровне записей в настройках программы. Это позволит платформе выполнить запрос напрямую, минуя подстановку макросов и псевдонима Т.
Для этого выполним следующие действия:
Важное замечание: Этот метод является временным «костылем». Глобальное отключение RLS нарушит политику безопасности компании (менеджеры начнут видеть чужие документы). После успешного завершения обновления обязательно верните галочку на место!
Если вы разрабатываете собственную обработку или вносите изменения в код обработчиков обновления конфигурации, правильнее будет выполнить запрос в обход системы прав. Служебные процедуры, меняющие или читающие закрытые данные (включая регистр ДвиженияКонтрагентКонтрагент), должны работать без оглядки на RLS.
Разберем подробнее, как это сделать. Перед строкой Результат = Запрос.ВыполнитьПакет; необходимо программно включить привилегированный режим.
Посмотрим на пример правильного кода:
// ... формирование текста запроса ...
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВТДляОбработки", Результат.ИмяВременнойТаблицы);
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
// Включаем выполнение без контроля прав и RLS
УстановитьПривилегированныйРежим(Истина);
// Теперь запрос выполнится корректно, ошибка таблицы "Т" не появится
Результат = Запрос.ВыполнитьПакет;
// Отключаем режим после выполнения (если требуется)
УстановитьПривилегированныйРежим(Ложь);
Использование метода УстановитьПривилегированныйРежим заставит платформу игнорировать RLS на время работы с базой данных, благодаря чему проблема полностью исчезает без необходимости менять глобальные настройки базы.
Иногда причина кроется в самой платформе. Ошибки трансляции RLS-запросов периодически признаются разработчиками 1С как официальные баги определенных релизов. Если запрос написан корректно, а права настроены верно, попробуйте:
В процессе отладки подобных запросов (особенно во внешних обработках) можно столкнуться с еще одной сопутствующей ошибкой:
Ошибка при вызове метода контекста (Выполнить)
мРезЗапроса = ОбТекущийЗапрос.Выполнить;
по причине: Содержимое объекта данных может быть выбрано только во временную таблицу
Проанализируем эту ошибку. Она указывает на то, что вы пытаетесь получить результат выполнения менеджера временных таблиц напрямую на клиент или в переменную, хотя в самом тексте пакета нет финальной выборки. Временные таблицы физически создаются в tempdb на стороне сервера СУБД.
Чтобы избежать этой ошибки, убедитесь, что ваш пакетный запрос завершается инструкцией выборки данных из созданной временной таблицы, например:
// Создание временной таблицы
ВЫБРАТЬ
СсылкиДляОбработки.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Ссылки
ИЗ
&ВТДляОбработки КАК СсылкиДляОбработки
;
// Финальная выборка данных для возврата результата
ВЫБРАТЬ
*
ИЗ
ВТ_Ссылки КАК ВТ_Ссылки
Применяя эти методы в комплексе, вы сможете быстро локализовать проблему с правами доступа, исправить ошибки RLS-запросов и успешно завершить обновление вашей конфигурации.