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