При разработке и модификации сложных отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с крайне неприятной ситуацией. Запрос, который без проблем выполняется в обычной Консоли запросов, внутри схемы компоновки данных неожиданно выдает ошибку: «Поле не найдено» (или «Поле не обнаружено»). Особенно часто это происходит при работе с пакетами запросов и временными таблицами.
В этой статье мы подробно разберем, почему СКД «теряет» поля во временных таблицах, как устроен внутренний оптимизатор компоновщика макета, и по шагам рассмотрим несколько эффективных способов решения этой проблемы.
Главная причина кроется во встроенном оптимизаторе запросов СКД. В отличие от стандартного выполнения запроса через СУБД, СКД не отправляет на сервер ваш SQL-код в исходном виде. Платформа сначала анализирует финальные настройки отчета (какие поля выбрал пользователь, какие группировки и отборы применил) и на основе этого формирует новый, «оптимизированный» текст запроса.
Проанализируем ситуацию подробнее:
ДатаПоступления из первой временной таблицы ВремТаблЗаказыПоствщику, оптимизатор СКД решает, что это поле лишнее.ВремТаблЗаказыПоствщику.ДатаПоступления.Также к этой ошибке часто приводит путаница между одноименными реквизитами шапки документа и его табличной части (например, когда ДатаПоступления есть и в самом документе, и в строках таблицы Товары), некорректная работа флага «Автозаполнение» или закэшированные пользовательские настройки схемы.
---
Самый надежный и быстрый способ запретить оптимизатору СКД исключать поле из временных таблиц — это настроить роли этого поля в наборе данных.
Разберем этот процесс по шагам:
.erf отчета или макет СКД в конфигураторе).ДатаПоступления (или то поле, на которое ругается система). Обратите внимание на его путь к данным.Установка свойства «Обязательное» принудительно указывает компоновщику макета, что данное поле должно присутствовать во временной таблице в любом случае, даже если пользователь не выбрал его для вывода в отчет.
---
Флаг «Автозаполнение» (расположенный на вкладке «Наборы данных» рядом с текстом запроса) заставляет платформу автоматически определять доступные поля, их типы и связи. В сложных запросах с обилием временных таблиц, объединений (ОБЪЕДИНИТЬ ВСЕ) и левых соединений алгоритм автозаполнения может давать сбои.
Рассмотрим, как решить проблему ручной настройкой:
Отключение автозаполнения гарантирует, что платформа передаст на СУБД именно тот текст пакета запросов, который вы написали в конструкторе, без скрытых модификаций структуры временных таблиц.
---
Часто СКД выдает ошибку из-за конфликта имен полей. Если в запросе выбираются поля из разных таблиц с одинаковыми именами, СУБД или компоновщик могут некорректно сопоставить типы данных. Выясним причину на примере работы с документами:
ВЫБРАТЬ
ЗаказПоставщикуТовары.Ссылка КАК ЗаказПоставщику,
ЗаказПоставщикуТовары.Ссылка.ДатаПоступления КАК ДатаДокумента, // Дата из шапки
ЗаказПоставщикуТовары.ДатаПоступления КАК ДатаСтрокиТовара // Дата из ТЧ Товары
ПОМЕСТИТЬ ВремТаблЗаказыПоствщику
Проанализируем ситуацию: если мы называем оба поля одинаково (ДатаПоступления), СКД может запутаться при автозаполнении путей к данным. Всегда разделяйте псевдонимы полей шапки и табличной части с помощью ключевого слова КАК.
---
Иногда программист исправляет запрос, делает поле обязательным, но ошибка «Поле не найдено» продолжает воспроизводиться. Это происходит из-за того, что в режиме «1С:Предприятие» у пользователя сохранились старые (закэшированные) настройки отчета.
Для устранения этой проблемы выполним следующие действия:
---
Если визуальный анализ запроса не помогает локализовать ошибку в большом пакете из 10-15 временных таблиц, необходимо использовать специализированные инструменты диагностики.
Отличным решением является использование Консоли компоновки данных из пакета «Инструменты разработчика» (ИР) автора TormozIT. Рассмотрим алгоритм работы с ней:
ДатаПоступления.Применяя указанные методики комплексного анализа схемы СКД, мы сможем быстро и безболезненно устранять любые ошибки компоновки пакетов запросов, сохраняя структуру отчета и избегая необходимости его полной переделки с нуля.