Как найти и просмотреть текст запроса динамического списка в 1С в режиме отладки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с управляемыми формами разработчики часто сталкиваются с ситуацией, когда необходимо проанализировать запрос, по которому динамический список выводит данные. Однако при попытке найти свойство ТекстЗапроса в дереве переменных отладчика, оно может отсутствовать. В рамках этой статьи мы разберем, почему это происходит, как правильно обращаться к свойствам списка и как получить финальный текст запроса, который система отправляет к базе данных.

Разграничение контекста: Клиент против Сервера

Первое и самое важное правило, которое мы должны запомнить: объект ДинамическийСписок на клиенте и на сервере — это две разные сущности. Проанализируем ситуацию: когда вы находитесь в процедуре с директивой &НаКлиенте, переменная, связанная с вашим списком, является лишь управляемой оболочкой. В ней нет данных о структуре запроса, так как клиентской части они не требуются для отображения данных.

Рассмотрим порядок действий для проверки: если вы пытаетесь посмотреть текст запроса в отладке, убедитесь, что точка останова установлена в серверной процедуре (например, ПриСозданииНаСервере или любая процедура с директивой &НаСервере). Только на стороне сервера объект ДинамическийСписок раскрывает свои технические свойства, включая параметры и текст запроса.

Режим «Произвольный запрос»

Выясним причину, по которой даже на сервере свойство ТекстЗапроса может быть пустым или недоступным. Это происходит в тех случаях, когда динамический список настроен на отображение основной таблицы без использования произвольного текста. Посмотрим на настройки в конфигураторе: если флаг Произвольный запрос не установлен, система генерирует запрос автоматически «на лету» на основании выбранной основной таблицы.

Чтобы иметь возможность программно читать или изменять текст, необходимо:

  1. Включить признак Произвольный запрос (Флажок в динамическом списке в 1С 8.3) в свойствах динамического списка.
  2. Убедиться, что вы обращаетесь к свойству именно того реквизита формы, который является динамическим списком (например, Список.ТекстЗапроса).

Использование компоновщика настроек

Разберем утверждение, что запрос находится в компоновщике настроек. Динамический список в 1С 8.3 построен на базе Системы компоновки данных (СКД). Это означает, что итоговый результат, который видит пользователь, формируется путем наложения настроек (отборов, сортировок, группировок) на исходный текст запроса.

Если нам нужно проанализировать параметры, мы должны обратиться к коллекции Параметры самого списка или к компоновщику. Рассмотрим пример кода для получения значения параметра:


// Обращение к параметру напрямую через коллекцию списка
ЗначениеПараметра = Список.Параметры.Найти("ДатаНачала");
Если ЗначениеПараметра <> Неопределено Тогда
    Сообщить(ЗначениеПараметра.Значение);
КонецЕсли;

Важно помнить, что в Список.КомпоновщикНастроек.Настройки (Пользовательская СКД) хранятся текущие настройки, а в Список.КомпоновщикНастроек.ПользовательскиеНастройки — те фильтры, которые пользователь установил самостоятельно через интерфейс формы.

Как получить финальный исполняемый запрос

Текст, который мы видим в свойстве ТекстЗапроса, — это лишь шаблон. Настоящий SQL-запрос, уходящий в СУБД, может значительно отличаться из-за примененных отборов. Для того чтобы «отловить» именно исполняемый запрос, воспользуемся методами получения схемы и настроек. Проанализируем следующий алгоритм:


// 1. Получаем исполняемую схему компоновки
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();

// 2. Получаем текущие настройки (с учетом пользовательских)
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

// 3. Используем макет компоновки для генерации итогового запроса
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

// Теперь в МакетКомпоновки.НаборыДанных[0].Запрос содержится текст
ТекстИсполняемогоЗапроса = МакетКомпоновки.НаборыДанных[0].Запрос;

Этот метод является наиболее точным при отладке сложных динамических списков, где условия отбора накладываются динамически в зависимости от прав доступа или действий пользователя.

Особенности программной модификации

Если ваша задача — не просто посмотреть текст, но и изменить его, делать это нужно в строго определенных местах. Рассмотрим процедуру ПриСозданииНаСервере. Это идеальный момент для программной корректировки запроса. Проанализируем ситуацию: если мы меняем текст запроса, мы обязаны обеспечить наличие всех полей, на которые ссылаются элементы формы или условное оформление. В противном случае форма выдаст ошибку при отрисовке, так как не найдет ожидаемых путей данных.

Пример программной замены текста:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    НовыйТекст = "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ ЭтоГруппа = ЛОЖЬ";
    Список.ТекстЗапроса = НовыйТекст;
    
КонецПроцедуры

Инструменты для облегчения отладки

Для ускорения процесса разработки рекомендуем использовать внешние обработки, известные как «Консоль динамических списков» — для этого подойдет внешняя консоль запросов и СКД для анализа динамических списков. Они позволяют имитировать поведение списка в режиме «1С:Предприятие», настраивать отборы и сразу видеть результат выполнения запроса без постоянного перезапуска отладки. Также полезно проверять свойство Список.ОсновнаяТаблица. Если оно заполнено, система может оптимизировать запросы, обращаясь к индексам этой таблицы, что важно для производительности.

Резюмируем: чтобы увидеть текст запроса в отладке (Консоль запросов УФ 8.3.2.24.22), всегда переходите на серверный контекст, проверяйте наличие флага произвольного запроса и используйте компоновщик макета для получения итогового текста со всеми наложенными фильтрами.

← На главную