При работе с динамическими списками на платформе 1С:Предприятие 8.3 разработчики иногда сталкиваются с ситуацией, когда попытка отсортировать данные по ссылочному полю или реквизиту формы завершается критической ошибкой вида: «Нельзя упорядочить список по колонке "%ИмяКолонки%"! Выберите другую колонку для упорядочивания. по причине: Поле не найдено "%ИмяКолонки%"».
Рассмотрим подробно причины возникновения этой проблемы и разберем практические способы её устранения.
Проанализируем механику работы динамического списка. Платформа 1С автоматически генерирует SQL-запросы к базе данных на основе схемы запроса динамического списка, настроек компоновки данных и действий пользователя в интерфейсе (установка фильтров, группировок и сортировок).
Если текст запроса динамического списка содержит конструкцию ОБЪЕДИНЕНИЕ или ОБЪЕДИНЕНИЕ ВСЕ, платформа не всегда может корректно сопоставить имя колонки из пользовательского интерфейса с полями выбираемых таблиц. При попытке выполнить сортировку по полю ссылочного типа (например, СправочникСсылка) оптимизатор динамического списка пытаются применить инструкцию ORDER BY к полю, которое отсутствует во внешней секции ВЫБРАТЬ одной из частей объединения, что и вызывает ошибку «Поле не найдено».
Выясним, как правильно построить запрос динамического списка, чтобы платформа могла свободно применять интерактивную сортировку. Наиболее надежный способ — поместить исходный запрос с объединением во вложенный запрос, а во внешнем запросе явно выбрать все необходимые поля с четко заданными псевдонимами.
Разберем по шагам создание правильной структуры запроса:
ОБЪЕДИНЕНИЕ в скобки подзапроса.Посмотрим на пример правильного оформления запроса динамического списка:
ВЫБРАТЬ
ВложенныйЗапрос.Ссылка КАК Ссылка,
ВложенныйЗапрос.Код КАК Код,
ВложенныйЗапрос.Наименование КАК Наименование
ИЗ
(ВЫБРАТЬ
ПерваяТаблица.Ссылка КАК Ссылка,
ПерваяТаблица.Код КАК Код,
ПерваяТаблица.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК ПерваяТаблица
ОБЪЕДИНЕНИЕ ВСЕ
ВЫБРАТЬ
ВтораяТаблица.Ссылка КАК Ссылка,
ВтораяТаблица.Код КАК Код,
ВтораяТаблица.Наименование КАК Наименование
ИЗ
Справочник.Услуги КАК ВтораяТаблица) КАК ВложенныйЗапрос
Благодаря такому подходу платформа формирует итоговый SQL-запрос поверх единой виртуальной таблицы ВложенныйЗапрос, и обращение к полю Ссылка при интерактивной сортировке отрабатывает без ошибок.
Рассмотрим другие распространенные причины и способы их решения, если обертывание во вложенный запрос не требуется или ошибка сохраняется:
Использовать всегда в значение Истина. Это исключит оптимизацию, при которой платформа вырезает неиспользуемые колонки из результирующего SQL-запроса.Основная таблица. Это позволит платформе автоматически определять типы и типы ссылок для построения корректных предложений упорядочивания.