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