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