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