Почему в СКД возникает ошибка «Поле не найдено», если в консоли запросов запрос выполняется успешно?

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

Довольно часто разработчики 1С сталкиваются с ситуацией, когда сложный пакетный запрос без ошибок отрабатывает в консоли запросов, но при переносе в схему компоновки данных (СКД) падает на этапе инициализации или исполнения отчета с ошибкой вида Поле не найдено "ИмяПоля" или Таблица не найдена "ИмяТаблицы".

Разберем детально, почему так происходит, какие скрытые механизмы схемы компоновки данных приводят к подобному поведению и как правильно адаптировать текст запроса для набора данных СКД.

Причина 1: Конфликт имен псевдонима таблицы и выбираемого поля

Проанализируем ключевое отличие работы объекта Запрос и механизма СКД. Обычный запрос выполняет переданный текст «как есть». Компоновщик макета СКД перед выполнением парсит текст запроса, перестраивает его, внедряет отборы, удаляет неиспользуемые поля и формирует финальный текст с учетом настроек пользователя.

Если псевдоним таблицы в запросе полностью совпадает с именем одного из ее полей или псевдонимом колонки выборки, синтаксический анализатор компоновщика может некорректно сопоставить контекст поля. Посмотрим на проблемный фрагмент запроса:


ВЫБРАТЬ
    ДатаВыдачи.Объект КАК Объект,
    ДатаВыдачи.Значение КАК ДатаВыдачи
ПОМЕСТИТЬ ВТ_ДатаВыдачи
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ДатаВыдачи
ГДЕ
    ДатаВыдачи.Свойство.Код = "Б00000140"
ИНДЕКСИРОВАТЬ ПО
    Объект
;

В этом примере таблица РегистрСведений.ЗначенияСвойствОбъектов получила псевдоним ДатаВыдачи, и в этой же секции выбирается поле с псевдонимом ДатаВыдачи. При модификации текста компоновщиком поле теряет однозначную идентификацию, в результате чего генерируется ошибка Поле не найдено "ДатаВыдачи".

Разберем исправление. Для устранения неоднозначности зададим таблице уникальный псевдоним (например, с префиксом Рег_ или Таблица_):


ВЫБРАТЬ
    РегистрДатаВыдачи.Объект КАК Объект,
    РегистрДатаВыдачи.Значение КАК ДатаВыдачи
ПОМЕСТИТЬ ВТ_ДатаВыдачи
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК РегистрДатаВыдачи
ГДЕ
    РегистрДатаВыдачи.Свойство.Код = "Б00000140"
ИНДЕКСИРОВАТЬ ПО
    Объект
;

Причина 2: Отсутствие финальной выборки в пакетном запросе

Рассмотрим структуру пакетного запроса в СКД. Набор данных типа «Запрос» обязательно должен возвращать результат. В отличие от консоли запросов, которая может просто сложить данные во временные таблицы в менеджере временных таблиц, СКД требует, чтобы последняя часть пакета представляла собой итоговый запрос без инструкции ПОМЕСТИТЬ.

Посмотрим на ошибочный вариант завершения пакета:


ВЫБРАТЬ
    ВТ_Документы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. Проверить уникальность всех псевдонимов. Убедимся, что ни одно имя временной таблицы, источника данных или вложенного запроса не дублирует имя поля или реквизита.
  2. Сделать итоговую секцию открытой. Убедимся, что последний запрос пакета возвращает результат, а не помещает его во временную таблицу.
  3. Обновить список полей набора данных. В конструкторе схемы компоновки данных перейдем на вкладку Наборы данных, выделим поля набора данных и нажмем кнопку Автозаполнение (или удалим поля и добавим их заново), чтобы пути к данным синхронизировались с новым текстом запроса.
  4. Сбросить пользовательские настройки отчета. Если отчет запускается в режиме 1С:Предприятие, сохраненный пользовательский вариант может хранить старую структуру полей. Необходимо нажать Еще — Установить стандартные настройки.

Соблюдение этих правил гарантирует корректную работу компоновщика макета и предотвращает ошибки поиска полей при формировании сложных отчетов.

← На главную