В процессе разработки в среде 1С:Предприятие 8.3, особенно при работе с такими сложными конфигурациями, как БГУ 2.0 или БП 3.0, программисты часто сталкиваются с необходимостью кастомизации стандартных журналов документов. Типичная задача — вывести дополнительную колонку (например, «Договор») в Журнал операций. Однако попытка просто добавить поле через точку от реквизита Ссылка (например, Ссылка.Договор) в динамическом списке часто приводит к критическому сбою: «Внутренняя ошибка динамического списка. не найдены поля сортировки данных для полей Дата, Ссылка».
В рамках данной статьи мы подробно разберем, почему возникает эта ошибка, проанализируем механизмы работы платформы с динамическими списками и изучим проверенные способы решения этой проблемы.
Для начала выясним причину такого поведения системы. Журнал документов в 1С — это объект, объединяющий данные из множества различных таблиц документов. Поле Ссылка в журнале имеет составной тип данных, который может включать в себя десятки, а иногда и сотни различных видов документов.
Когда мы пытаемся в динамическом списке обратиться к реквизиту через точку от поля составного типа (Ссылка.Договор), платформа 1С на уровне СУБД пытается выполнить неявное левое соединение (LEFT JOIN) со всеми таблицами, которые входят в этот составной тип. Это порождает несколько проблем:
Дата и Ссылка. Когда запрос «ломается» из-за некорректного обращения к составному полю, механизм построения внутреннего SQL-запроса платформы теряет ориентацию и выдает ошибку о невозможности найти поля сортировки.Рассмотрим самый надежный и правильный метод решения, который соответствует стандартам разработки 1С. Вместо того чтобы просто добавлять поле на форму, нам необходимо перевести динамический список в режим произвольного запроса и явно типизировать нужные нам данные.
Использование конструкции ВЫРАЗИТЬ (CAST) заставляет платформу делать соединение только с конкретными таблицами, что стабилизирует работу списка. Проанализируем пример кода, который решает задачу вывода договора:
ВЫБОР
КОГДА ЖурналДокументовЖурналОпераций.Ссылка ССЫЛКА Документ.СчетФактураВыданный
ТОГДА ВЫРАЗИТЬ(ЖурналДокументовЖурналОпераций.Ссылка КАК Документ.СчетФактураВыданный).Договор
КОГДА ЖурналДокументовЖурналОпераций.Ссылка ССЫЛКА Документ.СчетФактураПолученный
ТОГДА ВЫРАЗИТЬ(ЖурналДокументовЖурналОпераций.Ссылка КАК Документ.СчетФактураПолученный).Договор
// Добавьте остальные типы документов, где есть договор
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
КОНЕЦ КАК ДоговорКонтрагента
В этом примере мы явно указываем системе, из каких таблиц нужно забирать данные. Это позволяет динамическому списку корректно индексировать колонку и не «терять» стандартные поля сортировки.
Иногда даже после правки запроса ошибка может сохраняться из-за настроек самого динамического списка. Разберем по шагам, что нужно проверить в конфигураторе:
ЖурналДокументов.ЖурналОпераций. Если там стоит «Авто» или пусто, платформа может некорректно генерировать команды сортировки.Дата и Ссылка, а также ваше новое поле ДоговорКонтрагента. Установите для них флажок «Использовать всегда». Это гарантирует, что данные будут выбираться из базы, даже если пользователь скроет колонку в интерфейсе.ВЫРАЗИТЬ.Если вы внесли изменения в конфигураторе, но ошибка в пользовательском режиме сохраняется, скорее всего, дело в кэшированных настройках формы. Платформа 1С сохраняет пользовательские настройки (сортировки, группировки, видимость колонок) в информационной базе. Если старые настройки ссылаются на «сломанное» поле, ошибка будет воспроизводиться.
Выполним следующие действия:
%AppData%\1C\1cv8).Рассмотрим ситуацию, когда лезть в запрос динамического списка нежелательно (например, чтобы не снимать конфигурацию с поддержки). В современных версиях БГУ 2.0 и БП 3.0 реализован механизм Дополнительных реквизитов и сведений.
Если «Договор» настроен как дополнительный реквизит, он может быть выведен в список через команду «Изменить форму» в пользовательском режиме. Этот механизм штатно оптимизирован разработчиками 1С и, как правило, не вызывает ошибок с полями сортировки, так как использует внутренние оптимизированные запросы к таблицам дополнительных сведений.
Также стоит помнить о возможности использования Расширений. Если вы меняете запрос через расширение, будьте особенно внимательны к соответствию имен полей. При любом изменении структуры динамического списка в расширении обязательно делайте очистку настроек формы, как было описано выше, иначе конфликт старой и новой структур данных приведет к «Внутренней ошибке».
Подводя итог, можно сказать, что ошибка «не найдены поля сортировки данных» — это защитная реакция платформы на попытку выполнить неопределенный или избыточно сложный запрос к составному полю.
Основные правила для предотвращения этой ошибки:
ВЫРАЗИТЬ при обращении к реквизитам через точку от полей составного типа.Следуя этим рекомендациям, мы сможем создавать стабильные и быстрые интерфейсы, обеспечивая пользователям удобный доступ к необходимым данным без критических ошибок системы.