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

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

При изучении разработки на платформе 1С:Предприятие 8, особенно по учебнику М.Г. Радченко, начинающие программисты часто сталкиваются с ошибкой «Таблица не найдена "НоменклатураДокумента"». Эта проблема возникает при попытке выполнить второй запрос, который должен использовать временную таблицу, созданную первым запросом. Давайте вместе проанализируем код и разберем, почему система «теряет» таблицу и как это исправить.

Причина 1: Синтаксическая ошибка в обращении к менеджеру временных таблиц

Рассмотрим внимательно фрагмент кода, где создается второй объект запроса. Одной из самых частых причин является банальная опечатка. В языке 1С каждое свойство объекта должно отделяться точкой. Проанализируем строку из примера:


Запрос2 = Новый Запрос;
Запрос2МенеджерВременныхТаблиц = МенеджерВТ; // Ошибка здесь!

В данном случае система не выдает синтаксическую ошибку сразу, а просто создает новую локальную переменную Запрос2МенеджерВременныхТаблиц. При этом свойство МенеджерВременныхТаблиц самого объекта Запрос2 остается пустым. В итоге второй запрос ничего не знает о временных таблицах первого запроса.

Правильный вариант: необходимо обязательно поставить точку между именем объекта и его свойством.


Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ; // Теперь запрос видит временные таблицы

Причина 2: Использование неверного результата запроса в цикле

Даже если синтаксис исправлен, данные могут отображаться некорректно или отсутствовать. Посмотрим на логику получения данных. В коде автора выполняются два разных запроса, и результаты сохраняются в разные переменные: РезультатЗапроса (от первого запроса) и Результат (от второго запроса).

Выясним причину ошибки в блоке обхода данных. Автор пишет:


Результат = Запрос2.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); // Ошибка! Используется результат первого запроса

Поскольку РезультатЗапроса содержит только данные временной таблицы (список номенклатуры), в нем нет полей «Стоимость» или «Количество» из регистров остатков. Для получения полных данных нужно обходить выборку из переменной Результат.

Исправленный код:


Результат = Запрос2.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать(); // Используем результат второго (итогового) запроса

Причина 3: Отсутствие параметров в виртуальных таблицах

Разберем еще один важный технический момент. При обращении к виртуальным таблицам остатков (например, РегистрНакопления.СтоимостьМатериалов.Остатки), важно передавать параметр Период. Если оставить скобки пустыми, 1С рассчитает остатки на текущую секунду. В процедуре ОбработкаПроведения это может привести к неверным расчетам, если документ проводится «задним числом».

Рекомендуем устанавливать в качестве периода МоментВремени() документа. Для этого в запросе нужно использовать параметр, например &Период, и установить его перед выполнением:

Запрос2.УстановитьПараметр("Период", МоментВремени());

Итоги и рекомендации

Для корректной работы механизмов списания себестоимости при проведении документа ОказаниеУслуги, придерживайтесь следующего алгоритма:

  1. Всегда проверяйте наличие точки при назначении МенеджерВременныхТаблиц.
  2. Убедитесь, что метод Выбрать() вызывается у того результата запроса, который содержит итоговые данные (обычно это последний запрос в цепочке).
  3. Используйте Пакетные запросы. Это современный стандарт разработки, при котором несколько запросов пишутся в одном тексте через символ ";". В этом случае менеджер временных таблиц создается автоматически внутри одного объекта Запрос, что исключает подобные ошибки.
← На главную