Как исправить ошибки «Таблица не найдена» и «Поле не найдено» в запросе 1С

Программист 1С v8.3 (Обычные формы) Сфера услуг, туризм и социальный сектор
← На главную

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

Основные причины ошибки «Таблица не найдена»

Проанализируем базовые ситуативные факторы, из-за которых платформа 1С не может обнаружить таблицу в контексте выполнения запроса:

  1. Опечатки в наименованиях объектов метаданных. Пропущенная или неверно указанная буква в имени регистра или его измерений приводит к тому, что транслятор 1С не может сопоставить имя из запроса с реальным объектом структуры конфигурации.
  2. Обращение к виртуальным таблицам у непериодических регистров. Виртуальные таблицы СрезПоследних и СрезПервых существуют только у периодических регистров сведений. Если у регистра сведений в свойствах установлено значение «Непериодический», попытка обратиться к РегистрСведений.ИмяРегистра.СрезПоследних вызовет ошибку «Таблица не найдена».
  3. Ошибки динамической сборки строк. При конкатенации фрагментов текста запроса с помощью тернарных операторов ?(...) и оператора сложения строк + легко пропустить пробелы на стыках операторов или ошибиться в передаче параметров.

Причины возникновения ошибки «Поле не найдено»

Разберем ситуацию, когда таблица найдена, но платформа выдает исключение вида Поле не найдено "Псевдоним.ИмяПоля". В подавляющем большинстве случаев причина кроется в рассинхронизации псевдонимов (алиасов) таблиц в секции ИЗ/СОЕДИНЕНИЕ и в секции ВЫБРАТЬ.

Рассмотрим характерный пример такой рассинхронизации:


// Ошибка: в секции ВЫБРАТЬ используется имя "КВП_УчетКоличестваЖильцовПоЛицевымСчетамСрезПоследних",
// однако самой таблице в секции ИЗ задан псевдоним "КВП_ЛицевыеСчетаСрезПоследних"
ВЫБРАТЬ
    КВП_УчетКоличестваЖильцовПоЛицевымСчетамСрезПоследних.ЛицевойСчет КАК ЛицевойСчет
ИЗ
    РегистрСведений.КВП_УчетКоличестваЖильцовПоЛицевымСчетам.СрезПоследних КАК КВП_ЛицевыеСчетаСрезПоследних

Для устранения ошибки необходимо либо привести обращение в секции ВЫБРАТЬ к объявленному псевдониму (КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет), либо изменить сам псевдоним таблицы в предложении КАК.

Методика диагностики и отладки динамических запросов

Когда текст запроса формируется динамически в коде через объединение строк с условиями, визуально найти ошибку в модуле становится затруднительно. В этом случае визуальный конструктор запросов платформы выключен из-за встроенных выражений языка 1С.

Рассмотрим шаги для быстрой отладки такого запроса:

  1. Установим точку останова в коде непосредственно перед вызовом метода Запрос.Выполнить().
  2. Запустим конфигурацию в режиме отладки и дождемся остановки на нужной строчке.
  3. Откроем окно вычисления выражений (Табло) и получим итоговый сформированный текст из свойства Запрос.Текст.
  4. Скопируем сформированный текст и вставим его во внешнюю Консоль запросов, где платформа наглядно подсветит строку с синтаксической ошибкой.

Шаги по исправлению ошибок на конкретном примере

Посмотрим на исходный фрагмент кода, где присутствовали сразу три ошибки:


// Вложенный запрос с опечаткой в имени и ошибочным обращением к непериодическому регистру
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    КВП_УчетКоличестваЖильцовПоЛицевымСчетамСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    КВП_УчетКоличестваЖильцовПоЛицевымСчета.КоличествоПроживающих КАК КоличествоПроживающих
ИЗ
    РегистрСведений.КВП_УчетКоличестваЖильцовПоЛицевымСчета.СрезПоследних(&ДатаКон) КАК КВП_ЛицевыеСчетаСрезПоследних
) КАК Проживающие
ПО ТаблицаНачислений.ЛицевойСчет = Проживающие.ЛицевойСчет

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_РазмерыДолейЛицевыхСчетов.СрезПоследних(&ДатаКон) КАК КВП_РазмерыДолейЛицевыхСчетов
ПО ТаблицаНачислений.ЛицевойСчет = КВП_РазмерыДолейЛицевыхСчетов.ЛицевойСчет

Выясним последовательность исправлений:

  1. Исправим опечатку в наименовании регистра сведений: вместо КВП_УчетКоличестваЖильцовПоЛицевымСчета укажем корректное имя КВП_УчетКоличестваЖильцовПоЛицевымСчетам.
  2. Приведем обращения к полям в соответствие с объявленным псевдонимом КВП_ЛицевыеСчетаСрезПоследних.
  3. Для непериодического регистра сведений КВП_РазмерыДолейЛицевыхСчетов удалим вызов виртуальной таблицы .СрезПоследних и обратимся напрямую к физической таблице регистра.

Посмотрим на корректный вариант написания запроса:


ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет КАК ЛицевойСчет,
    КВП_ЛицевыеСчетаСрезПоследних.КоличествоПроживающих КАК КоличествоПроживающих
ИЗ
    РегистрСведений.КВП_УчетКоличестваЖильцовПоЛицевымСчетам.СрезПоследних(&ДатаКон) КАК КВП_ЛицевыеСчетаСрезПоследних
) КАК Проживающие
ПО ТаблицаНачислений.ЛицевойСчет = Проживающие.ЛицевойСчет

// Обращение к непериодическому регистру сведений без виртуальной таблицы СрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КВП_РазмерыДолейЛицевыхСчетов КАК КВП_РазмерыДолейЛицевыхСчетов
ПО ТаблицаНачислений.ЛицевойСчет = КВП_РазмерыДолейЛицевыхСчетов.ЛицевойСчет

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

← На главную