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