Как исправить ошибку «Поле не обнаружено» в запросе СКД 1С?

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

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

В этой статье мы подробно разберем, почему СКД «теряет» поля во временных таблицах, как устроен внутренний оптимизатор компоновщика макета, и по шагам рассмотрим несколько эффективных способов решения этой проблемы.

Выясняем причину: почему СКД «вырезает» поля?

Главная причина кроется во встроенном оптимизаторе запросов СКД. В отличие от стандартного выполнения запроса через СУБД, СКД не отправляет на сервер ваш SQL-код в исходном виде. Платформа сначала анализирует финальные настройки отчета (какие поля выбрал пользователь, какие группировки и отборы применил) и на основе этого формирует новый, «оптимизированный» текст запроса.

Проанализируем ситуацию подробнее:

  1. Если в настройках отчета (в выбранных полях, группировках, отборах или условном оформлении) напрямую не используется поле ДатаПоступления из первой временной таблицы ВремТаблЗаказыПоствщику, оптимизатор СКД решает, что это поле лишнее.
  2. Для экономии памяти и повышения производительности СКД полностью удаляет это поле из текста первой временной таблицы при генерации итогового SQL-запроса.
  3. Однако далее по тексту пакета (например, в финальном запросе при левом соединении) происходит обращение к полю ВремТаблЗаказыПоствщику.ДатаПоступления.
  4. Поскольку во временной таблице этого поля уже нет (его стер оптимизатор), СУБД возвращает ошибку компиляции запроса: «Поле не найдено».

Также к этой ошибке часто приводит путаница между одноименными реквизитами шапки документа и его табличной части (например, когда ДатаПоступления есть и в самом документе, и в строках таблицы Товары), некорректная работа флага «Автозаполнение» или закэшированные пользовательские настройки схемы.

---

Способ 1. Установка флага «Обязательное» в ролях поля

Самый надежный и быстрый способ запретить оптимизатору СКД исключать поле из временных таблиц — это настроить роли этого поля в наборе данных.

Разберем этот процесс по шагам:

  1. Откроем схему компоновки данных (файл .erf отчета или макет СКД в конфигураторе).
  2. Перейдем на вкладку «Наборы данных».
  3. В таблице полей найдем наше проблемное поле — ДатаПоступления (или то поле, на которое ругается система). Обратите внимание на его путь к данным.
  4. Найдем колонку «Роль» для этого поля и нажмем на кнопку выбора (три точки).
  5. В открывшемся окне редактирования роли поля установим флаг «Обязательное» (в некоторых версиях платформы он может называться «Required»).
  6. Сохраним отчет и проверим его работу.

Установка свойства «Обязательное» принудительно указывает компоновщику макета, что данное поле должно присутствовать во временной таблице в любом случае, даже если пользователь не выбрал его для вывода в отчет.

---

Способ 2. Отключение флага «Автозаполнение»

Флаг «Автозаполнение» (расположенный на вкладке «Наборы данных» рядом с текстом запроса) заставляет платформу автоматически определять доступные поля, их типы и связи. В сложных запросах с обилием временных таблиц, объединений (ОБЪЕДИНИТЬ ВСЕ) и левых соединений алгоритм автозаполнения может давать сбои.

Рассмотрим, как решить проблему ручной настройкой:

  1. Снимем галочку «Автозаполнение» для набора данных-запроса.
  2. После этого таблица доступных полей СКД очистится. Нам потребуется заполнить ее вручную.
  3. Нажмем кнопку «Добавить» (зеленый плюс) над списком полей и вручную пропишем пути к данным, псевдонимы и заголовки для тех полей, которые действительно должны быть доступны в отчете.

Отключение автозаполнения гарантирует, что платформа передаст на СУБД именно тот текст пакета запросов, который вы написали в конструкторе, без скрытых модификаций структуры временных таблиц.

---

Способ 3. Проверка уникальности псевдонимов полей

Часто СКД выдает ошибку из-за конфликта имен полей. Если в запросе выбираются поля из разных таблиц с одинаковыми именами, СУБД или компоновщик могут некорректно сопоставить типы данных. Выясним причину на примере работы с документами:


ВЫБРАТЬ
    ЗаказПоставщикуТовары.Ссылка КАК ЗаказПоставщику,
    ЗаказПоставщикуТовары.Ссылка.ДатаПоступления КАК ДатаДокумента, // Дата из шапки
    ЗаказПоставщикуТовары.ДатаПоступления КАК ДатаСтрокиТовара   // Дата из ТЧ Товары
ПОМЕСТИТЬ ВремТаблЗаказыПоствщику

Проанализируем ситуацию: если мы называем оба поля одинаково (ДатаПоступления), СКД может запутаться при автозаполнении путей к данным. Всегда разделяйте псевдонимы полей шапки и табличной части с помощью ключевого слова КАК.

---

Способ 4. Очистка кэша настроек схемы компоновки

Иногда программист исправляет запрос, делает поле обязательным, но ошибка «Поле не найдено» продолжает воспроизводиться. Это происходит из-за того, что в режиме «1С:Предприятие» у пользователя сохранились старые (закэшированные) настройки отчета.

Для устранения этой проблемы выполним следующие действия:

  1. Запустим отчет в режиме «1С:Предприятие».
  2. Перейдем в меню «Еще» -> «Установить стандартные настройки». Это сбросит все пользовательские группировки, отборы и выбранные поля к первоначальному виду, заложенному в конфигураторе.
  3. Если это не помогло, откроем отчет в режиме изменения варианта («Еще» -> «ИЗменить вариант»), внимательно изучим вкладки «Отбор», «Условное оформление» и «Группировки». Если там присутствуют поля, помеченные красным восклицательным знаком или крестиком (удаленные или переименованные поля), удалим их из настроек.

---

Способ 5. Использование специализированных инструментов разработчика

Если визуальный анализ запроса не помогает локализовать ошибку в большом пакете из 10-15 временных таблиц, необходимо использовать специализированные инструменты диагностики.

Отличным решением является использование Консоли компоновки данных из пакета «Инструменты разработчика» (ИР) автора TormozIT. Рассмотрим алгоритм работы с ней:

  1. Запустим Консоль компоновки данных ИР в вашей базе.
  2. Загрузим в нее схему компоновки данных проблемного отчета и применим текущие настройки.
  3. Попытаемся скомпоновать макет. При возникновении ошибки «Поле не найдено...» консоль автоматически позиционируется на том элементе настроек (конкретном отборе, элементе условного оформления или группировке), который вызывает сбой.
  4. Также консоль позволяет увидеть итоговый сформированный текст SQL-запроса, отправляемый на СУБД. Мы сможем сравнить его с исходным кодом и сразу увидеть, из какой именно временной таблицы оптимизатор СКД вырезал поле ДатаПоступления.

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

← На главную