Разработка и Конфигурация · 10 мин
Как переопределить запрос динамического списка в 1С
Как переопределить запрос динамического списка в 1С: свойство ПроизвольныйЗапрос, СКД, изменение текста запроса в коде, типичные ошибки и проверка результата.
Динамический список в управляемых формах 1С строится на основе запроса: либо запрос формируется автоматически по основной таблице, либо задаётся вручную. Переопределить запрос можно двумя путями — через свойство «Произвольный запрос» в конфигураторе и программно, изменяя текст запроса в коде формы. Оба способа дают разный уровень контроля и имеют свои ограничения.
Чаще всего переопределение требуется, когда стандартного набора полей таблицы недостаточно: нужно добавить вычисляемую колонку, соединить данные нескольких таблиц, показать остатки или обороты, применить сложную фильтрацию. При этом важно сохранить ключевые возможности динамического списка — динамическое считывание данных, стандартные отборы, сортировку и поиск.
Ошибка в произвольном запросе приводит не только к падению формы, но и к потере интерактивных возможностей: перестаёт работать сортировка по колонкам, отбор по полям, которых нет в запросе, и группировка. Поэтому изменять запрос нужно с пониманием того, какие поля обязательны и как платформа динамически достраивает итоговый текст.
Когда нужен произвольный запрос, а когда достаточно стандартных средств
Прежде чем переопределять запрос, проверьте, нельзя ли решить задачу штатными механизмами. Отбор по конкретным значениям реализуется через свойство «Отбор» списка или программно через ЭлементыОтбора. Сортировку задаёт пользователь или разработчик в настройках. Связь с основной таблицей формы настраивается через «Основной реквизит» и параметры связи.
Произвольный запрос оправдан, когда нужны соединения таблиц (например, справочник с регистром сведений), агрегатные данные (остатки, суммы продаж), вычисляемые поля с конструкцией ВЫБОР, виртуальные таблицы регистров или объединения запросов. В этих случаях стандартный запрос по основной таблице физически не может вернуть нужные данные.
Обратная сторона — каждое соединение и группировка усложняют итоговый запрос, который платформа достраивает отборами и сортировкой. На больших таблицах это заметно влияет на скорость открытия формы и прокрутку списка.
Как выбрать действие
Переопределение запроса через конфигуратор
Откройте форму в конфигураторе, выделите реквизит динамического списка и в палитре свойств установите флаг «Произвольный запрос». После этого становится активным свойство «Текст запроса» — в него вводится собственный запрос на встроенном языке запросов. Удобно использовать конструктор запроса, доступный по кнопке рядом с полем.
Главное требование: в выборке должно присутствовать поле, которое платформа использует как ключ строки. Для списка документов или справочников это поле Ссылка основной таблицы. Без него список откроется, но перестанут работать переход к объекту, стандартные команды изменения, пометки удаления и часть интерактивных действий.
Также учтите свойство «Основная таблица» — даже при произвольном запросе его стоит оставить заполненным. Платформа использует основную таблицу для определения типа списка, стандартных команд и динамического считывания. Если очистить это свойство, список может перестать обновляться при изменении данных.
Программное изменение текста запроса
Когда состав запроса зависит от условий — роли пользователя, параметров формы, настроек учёта — текст удобнее формировать в коде. Для этого в обработчике ПриСозданииНаСервере обратитесь к реквизиту списка и присвойте свойству ТекстЗапроса новую строку, предварительно включив произвольный запрос.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.ПроизвольныйЗапрос = Истина;
Список.ТекстЗапроса =
"ВЫБРАТЬ
| Товары.Ссылка КАК Ссылка,
| Товары.Наименование КАК Наименование,
| ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
|ИЗ
| Справочник.Номенклатура КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
| ПО Товары.Ссылка = Остатки.Номенклатура";
КонецПроцедуры
Менять текст запроса можно и позже, например по команде пользователя. После присваивания нового текста список пересчитывается автоматически. Учтите, что если пользователь уже применил отборы по полям, которых нет в новом запросе, возникнет ошибка — поэтому при смене текста запроса отборы по удалённым полям нужно очищать.
Параметры запроса задаются через коллекцию Параметры списка: Список.Параметры.УстановитьЗначениеПараметра("Склад", ВыбранныйСклад). Используйте параметры вместо подстановки значений конкатенацией строк — это безопаснее и избавляет от проблем с форматированием дат и чисел.
Динамический список на основе СКД
Альтернатива ручному запросу — схема компоновки данных. Если в свойствах списка выбрать источник «Схема компоновки данных», запрос описывается в наборе данных схемы, а отборы, сортировка и группировки становятся настраиваемыми через стандартный механизм СКД. Пользователь получает расширенные настройки списка без доработки кода.
Этот вариант предпочтителен, когда список должен гибко настраиваться: менять состав отборов, группировать данные, выводить итоги. Цена вопроса — более сложная первоначальная настройка и необходимость понимать структуру схемы компоновки.
Сравнение подходов
Максимальная интерактивность и скорость, но только поля одной таблицы
Соединения и вычисляемые поля, но нужно следить за ключевым полем и отборами
Гибкие пользовательские настройки и группировки, сложнее в настройке и поддержке
Проверка результата после переопределения
После изменения запроса откройте форму в режиме предприятия и проверьте базовые сценарии: список открывается без ошибок, строки отображаются с ожидаемыми данными, двойной щелчок открывает объект, работают команды «Создать», «Изменить», «Пометить на удаление». Затем проверьте сортировку по каждой видимой колонке и отбор по основным полям.
Отдельно проверьте производительность на реальном объёме данных. Если список открывается заметно дольше, чем раньше, проанализируйте запрос: типичные причины — соединение без индексированного поля связи, виртуальная таблица без отбора по периоду, функции в условиях соединения.
Как проверить результат
Двойной щелчок открывает форму объекта
Ничего не происходит или ошибка — в запросе нет поля Ссылка
Список сортируется по любой видимой колонке
Ошибка при сортировке — поле недоступно в запросе
Отбор применяется и фильтрует строки
Ошибка поля не найдено — поле отсутствует в выборке
Список обновляется после записи объекта
Данные устарели — проверьте свойство «Основная таблица»
Типичные ошибки и ограничения
Самая частая ошибка — отсутствие ключевого поля в выборке. Список формально работает, но теряет привязку к объектам: нельзя открыть карточку, не срабатывают команды изменения. Вторая распространённая проблема — отборы, настроенные в конфигураторе или сохранённые пользователем, ссылаются на поля, которых нет в новом запросе. Форма падает с ошибкой сразу при открытии.
Ещё одна ловушка — псевдонимы полей. Если переименовать поле в запросе, все настройки отбора, сортировки и условного оформления, привязанные к старому имени, перестанут работать. Сохраняйте прежние псевдонимы, если форма уже использовалась и пользователи хранят свои настройки.
Помните и про ограничение динамического списка: он не поддерживает итоги по иерархии и некоторые конструкции вроде вложенных запросов в списке полей в отдельных случаях. Если запрос не принимается, упростите его и добавляйте конструкции по одной, проверяя результат.
FAQ
Можно ли менять запрос динамического списка на клиенте?
Нет, свойство ТекстЗапроса доступно только на сервере. Изменяйте запрос в серверных процедурах формы, а с клиента вызывайте серверный метод или используйте параметры и отборы, которые доступны в тонком клиенте.
Почему после переопределения запроса пропала сортировка?
Сортировка работает только по полям, присутствующим в выборке запроса и доступным для упорядочивания. Проверьте, что колонка связана с полем запроса, а не с вычисляемым выражением, которое платформа не может вынести в предложение УПОРЯДОЧИТЬ.
Как добавить условие, не переписывая весь запрос?
Используйте программный отбор: Список.Отбор.Элементы с установкой левого значения, вида сравнения и правого значения. Это безопаснее, чем редактировать текст запроса, и сохраняет все интерактивные возможности списка.
Работает ли динамическое считывание при произвольном запросе?
Да, если запрос не содержит группировок и итогов, превращающих его в агрегатный. При агрегации данных платформа считывает список целиком, что замедляет работу на больших таблицах.
Что делать, если форма падает с ошибкой «Поле не найдено»?
Ошибка означает, что отбор, сортировка или условное оформление ссылаются на поле, отсутствующее в новом запросе. Найдите ссылку на это поле в настройках списка и элементов формы, удалите её или добавьте поле в выборку запроса.
Можно ли использовать временные таблицы в запросе списка?
Нет, запрос динамического списка должен быть одиночным запросом без пакета временных таблиц. Если логика сложная, перенесите подготовку данных в программный код или пересмотрите структуру запроса в сторону соединений и вложенных запросов.
Что важно запомнить
Переопределение запроса динамического списка делается через «Произвольный запрос» в конфигураторе или свойство ТекстЗапроса в коде. Всегда оставляйте в выборке поле Ссылка и заполненную основную таблицу, используйте параметры вместо конкатенации и проверяйте работу отборов, сортировки и стандартных команд после изменения.