Как исправить ошибку «Таблица не найдена "Т"» при обновлении 1С:УТ 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе обновления типовых конфигураций, таких как 1С:Управление торговлей 11 (1С:УТ 11), программисты и администраторы периодически сталкиваются с прерыванием процесса из-за ошибок выполнения служебных запросов. Разберем по шагам одну из наиболее неочевидных проблем, которая сопровождается следующим сообщением системы:


Ошибка при вызове метода контекста (ВыполнитьПакет)
Результат = Запрос.ВыполнитьПакет; 
по причине: Ошибка выполнения запроса по причине: Ошибка в ограничении доступа к данным. 
объект: 'РегистрНакопления.ДвиженияКонтрагентКонтрагент', поле: 'Регистратор'; право: 'Чтение' 
{(60, 1)}: Таблица не найдена "Т" >Т ИЗ Т

Проанализируем ситуацию и выясним причину, по которой платформа не может обнаружить загадочную таблицу «Т», а также рассмотрим несколько рабочих способов устранения этой неполадки.

Выясняем причину: что за таблица «Т» и почему она не найдена?

Текст >Т ИЗ Т может сбить с толку, так как в исходном запросе разработчика такой таблицы нет. На самом деле, это часть типового шаблона ограничения доступа на уровне записей (RLS — Row Level Security), который используется в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). Буква «Т» — это короткий псевдоним текущей таблицы, который платформа подставляет для оптимизации длины SQL-запроса.

Ошибка возникает в тот момент, когда платформа 1С пытается «на лету» наложить макрос RLS на ваш выполняемый запрос. Чаще всего это происходит при соблюдении следующих условий:

  1. В запросе используются сложные соединения временных таблиц (например, &ВТДляОбработки) с физическими таблицами регистров (например, РегистрНакопления.ДвиженияКонтрагентКонтрагент).
  2. У пользователя, под которым запускается обработчик обновления, недостаточно прав на чтение данных этого регистра без ограничений.
  3. Имеет место баг конкретного релиза платформы 1С:Предприятие при трансляции сложных RLS-запросов.

Способ 1. Временное отключение RLS (Административное решение)

Посмотрим на самое простое решение, которое не требует навыков программирования. Ошибку можно обойти, временно отключив ограничения прав на уровне записей в настройках программы. Это позволит платформе выполнить запрос напрямую, минуя подстановку макросов и псевдонима Т.

Для этого выполним следующие действия:

  1. Перейдем в раздел Администрирование.
  2. Откроем пункт Настройки пользователей и прав.
  3. Перейдем в Группы доступа.
  4. Снимем галочку Ограничивать доступ на уровне записей.
  5. Повторим процедуру обновления базы.

Важное замечание: Этот метод является временным «костылем». Глобальное отключение RLS нарушит политику безопасности компании (менеджеры начнут видеть чужие документы). После успешного завершения обновления обязательно верните галочку на место!

Способ 2. Установка привилегированного режима (Программное решение)

Если вы разрабатываете собственную обработку или вносите изменения в код обработчиков обновления конфигурации, правильнее будет выполнить запрос в обход системы прав. Служебные процедуры, меняющие или читающие закрытые данные (включая регистр ДвиженияКонтрагентКонтрагент), должны работать без оглядки на RLS.

Разберем подробнее, как это сделать. Перед строкой Результат = Запрос.ВыполнитьПакет; необходимо программно включить привилегированный режим.

Посмотрим на пример правильного кода:


// ... формирование текста запроса ...
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВТДляОбработки", Результат.ИмяВременнойТаблицы); 
Запрос = Новый Запрос(ТекстЗапроса); 
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; 

// Включаем выполнение без контроля прав и RLS
УстановитьПривилегированныйРежим(Истина);

// Теперь запрос выполнится корректно, ошибка таблицы "Т" не появится
Результат = Запрос.ВыполнитьПакет;

// Отключаем режим после выполнения (если требуется)
УстановитьПривилегированныйРежим(Ложь);

Использование метода УстановитьПривилегированныйРежим заставит платформу игнорировать RLS на время работы с базой данных, благодаря чему проблема полностью исчезает без необходимости менять глобальные настройки базы.

Способ 3. Обновление платформы и очистка кэша

Иногда причина кроется в самой платформе. Ошибки трансляции RLS-запросов периодически признаются разработчиками 1С как официальные баги определенных релизов. Если запрос написан корректно, а права настроены верно, попробуйте:

  1. Очистить серверный и клиентский кэш 1С. Часто после неудачных обновлений в кэше остаются "битые" структуры таблиц.
  2. Обновить версию технологической платформы 1С:Предприятие 8.3 до актуального и стабильного релиза внутри вашей ветки (например, перейти на последние сборки 8.3.22 или 8.3.23).

Дополнительно: Ошибка работы с временными таблицами

В процессе отладки подобных запросов (особенно во внешних обработках) можно столкнуться с еще одной сопутствующей ошибкой:


Ошибка при вызове метода контекста (Выполнить)
мРезЗапроса = ОбТекущийЗапрос.Выполнить;
по причине: Содержимое объекта данных может быть выбрано только во временную таблицу

Проанализируем эту ошибку. Она указывает на то, что вы пытаетесь получить результат выполнения менеджера временных таблиц напрямую на клиент или в переменную, хотя в самом тексте пакета нет финальной выборки. Временные таблицы физически создаются в tempdb на стороне сервера СУБД.

Чтобы избежать этой ошибки, убедитесь, что ваш пакетный запрос завершается инструкцией выборки данных из созданной временной таблицы, например:


// Создание временной таблицы
ВЫБРАТЬ
    СсылкиДляОбработки.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Ссылки
ИЗ
    &ВТДляОбработки КАК СсылкиДляОбработки
;
// Финальная выборка данных для возврата результата
ВЫБРАТЬ
    *
ИЗ
    ВТ_Ссылки КАК ВТ_Ссылки

Применяя эти методы в комплексе, вы сможете быстро локализовать проблему с правами доступа, исправить ошибки RLS-запросов и успешно завершить обновление вашей конфигурации.

← На главную