К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Как получить запрос динамического списка в 1С: через свойства формы, программно, через консоль запросов и СКД. Примеры кода, типичные ошибки и проверка результата.

Динамический список в управляемых формах 1С строится на основе запроса, и у разработчика регулярно возникает задача этот запрос получить: чтобы скопировать его в отчёт, отладить в консоли запросов, доработать или убедиться, что платформа подставила в текст именно те отборы, которые задал пользователь. Запрос можно посмотреть в конфигураторе через свойства списка, получить программно в коде формы, а также «снять» итоговый текст, который реально уходит в СУБД.

Важно различать три состояния одного и того же запроса: исходный текст, заданный в свойстве «Запрос» или в настройках СКД; текст с учётом произвольного запроса и переопределённых полей; и финальный запрос, который платформа формирует после применения отборов, сортировки и группировки. Для разных задач нужен разный из этих вариантов, и путаница между ними — частая причина того, что скопированный запрос «не совпадает» с данными списка.

Где хранится запрос динамического списка

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

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

Дополнительно на итоговый текст влияет настройка компоновки данных: динамический список всегда работает через СКД, даже если вы не включали её явно. Отборы, сортировка и группировка, которые пользователь задаёт в форме, платформа добавляет к запросу автоматически, поэтому «чистый» текст из свойств и реально выполняемый запрос почти всегда отличаются.

Получение запроса через конфигуратор

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

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

Как открыть запрос в конфигураторе
  1. 1
    Откройте форму объекта в конфигураторе и найдите реквизит типа «ДинамическийСписок»
  2. 2
    В палитре свойств найдите строку «Запрос» и проверьте флаг «Произвольный запрос»
  3. 3
    Нажмите кнопку открытия запроса и скопируйте текст из конструктора
  4. 4
    Если запрос не произвольный — временно включите флаг, скопируйте сформированный текст, затем отмените изменения

Программное получение текста запроса

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

&НаСервере

Процедура ПоказатьЗапросСписка()

ТекстЗапроса = Список.ТекстЗапроса; // текст произвольного запроса

ОсновнаяТаблица = Список.ОсновнаяТаблица; // например "Документ.РеализацияТоваровУслуг"

Сообщить(ТекстЗапроса);

КонецПроцедуры

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

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

Как получить итоговый запрос с учётом отборов

Задача «получить именно тот запрос, который выполняется» решается иначе, потому что финальный текст собирается платформой в момент обращения к данным. Практических подхода два: посмотреть запрос в технологическом журнале либо воспроизвести схему компоновки и настройки списка в консоли СКД.

Технологический журнал с событием DBMSSQL (или DBPOSTGRS, DBORACLE — в зависимости от СУБД) фиксирует все запросы к базе. Включив журнал на время обновления списка, вы увидите фактический SQL с подставленными параметрами отборов. Это самый достоверный способ, но он требует доступа к серверу 1С и аккуратной настройки фильтров событий, чтобы не перегрузить журнал.

Второй способ — перенести настройки списка в консоль компоновки данных. Динамический список хранит схему и настройки компоновки; их можно программно сериализовать (например, через СериализаторXDTO в значение XDTO и далее в XML) и загрузить в консоль СКД, где доступен просмотр итогового запроса, макета компоновки и текста, который уйдёт в базу.

bsl
// Сохранение настроек динамического списка в XML
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Список.КомпоновщикНастроек.Настройки);
ТекстНастроек = Запись.Закрыть();

Отладка полученного запроса в консоли запросов

Скопированный текст почти никогда нельзя просто вставить в консоль запросов и выполнить: в нём есть параметры, которые платформа подставляла автоматически. Перед запуском нужно определить все параметры (стандартные — период виртуальных таблиц, отборы; пользовательские — те, что заданы в настройках списка) и задать им значения в консоли.

Если запрос строился через конструктор и использует расширения языка запросов для динамических списков (например, конструкции, связанные с представлениями или переопределением полей), консоль запросов может не понимать такие фрагменты. В этом случае фрагменты, специфичные для динамического списка, заменяют эквивалентными обычными соединениями и полями.

Признак корректной отладки: результат в консоли совпадает по составу строк с данными списка при тех же отборах. Если строк больше или меньше — ищите различия в параметрах виртуальных таблиц (периодичность, границы дат) и в отборах, которые в списке применяет платформа, а в консоли вы забыли воспроизвести.

Контрольные точки

Как проверить, что запрос получен верно

Совпадение числа строк в консоли и в списке при одинаковых отборах
Норма

Количество и состав строк совпадают

Тревожный признак

Строк больше/меньше — проверьте параметры виртуальных таблиц и пропущенные отборы

Наличие всех параметров запроса
Норма

Все параметры определены и заполнены перед выполнением

Тревожный признак

Ошибка «Параметр не определён» при запуске в консоли

Произвольный запрос в свойствах
Норма

Текст запроса читается из свойства «Запрос» или свойства «ТекстЗапроса»

Тревожный признак

Свойство пустое при снятом флаге «Произвольный запрос» — это норма, а не ошибка

Типичные ошибки и ограничения

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

Вторая группа ошибок связана с программной заменой текста запроса: разработчик присваивает новый текст, но забывает, что поля нового запроса должны совпадать по именам с полями, на которые ссылаются элементы формы и настройки. Итог — пустые колонки или ошибки при обновлении списка.

Третья типичная ситуация — попытка выполнить в консоли запрос с обращением к полям, которые динамический список получает через переопределение представлений (например, автопредставления ссылок). В обычном запросе таких полей нет, и текст нужно адаптировать вручную.

Типичные ошибки
01
Ожидание отборов пользователя в свойстве «ТекстЗапроса» — отборы применяются отдельно через СКД, итоговый текст смотрите в технологическом журнале
02
Запуск скопированного запроса в консоли без заполнения параметров — получаете ошибку «Параметр не определён»
03
Программная замена текста запроса без сохранения имён полей — ломаются колонки формы и настройки списка
04
Копирование запроса со специфичными для динамического списка конструкциями в консоль без адаптации — синтаксические ошибки при выполнении

Когда какой способ выбирать

Для быстрой задачи «посмотреть и скопировать» достаточно конфигуратора: свойства реквизита формы дают исходный текст за минуту. Для программной доработки — когда нужно читать или менять запрос из кода — используются свойства динамического списка на сервере формы.

Для глубокой отладки производительности и проверки того, что реально уходит в СУБД, подходит только технологический журнал: он показывает фактический запрос с параметрами. Консоль СКД занимает промежуточное положение: она позволяет воспроизвести настройки и увидеть итоговый запрос без доступа к серверу, но требует корректного переноса схемы и настроек.

Маршрут решения

Как выбрать способ

Нужно просто посмотреть или скопировать исходный текст запросаОткройте свойство «Запрос» реквизита формы в конфигураторе
Нужно читать или менять запрос из кода формыИспользуйте свойство «ТекстЗапроса» динамического списка на сервере
Нужен итоговый запрос с отборами пользователяВключите технологический журнал с событием СУБД или перенесите настройки в консоль СКД
Нужно отладить запрос отдельно от формыСкопируйте текст в консоль запросов, определите все параметры и воспроизведите отборы
Итог

Что важно запомнить

Исходный запрос динамического списка хранится в свойстве «Запрос» реквизита формы и доступен программно через «ТекстЗапроса». Отборы пользователя в этот текст не входят — итоговый запрос смотрите через технологический журнал или консоль СКД. При отладке в консоли запросов обязательно заполняйте все параметры и воспроизводите отборы списка.

Частые вопросы

Почему свойство «ТекстЗапроса» возвращает пустую строку?

Потому что флаг «Произвольный запрос» в свойствах списка снят: платформа строит запрос автоматически по основной таблице, и отдельного текста не существует. Чтобы увидеть такой запрос, временно включите произвольный запрос в конфигураторе — конструктор сформирует текст по текущим настройкам.

Как получить запрос вместе с отборами, которые поставил пользователь?

Штатного свойства с «готовым» текстом нет. Практические варианты: включить технологический журнал с событиями обращения к СУБД и посмотреть фактический запрос, либо сериализовать настройки компоновщика списка и воспроизвести их в консоли СКД, где виден итоговый текст запроса.

Можно ли программно изменить запрос динамического списка?

Да, присвоением нового текста свойству «ТекстЗапроса» в серверном коде формы. Учтите, что имена полей нового запроса должны совпадать с полями, на которые ссылаются элементы формы и настройки, иначе колонки перестанут заполняться.

Почему запрос из списка не выполняется в консоли запросов?

Чаще всего из-за незаполненных параметров или конструкций, специфичных для динамических списков (переопределение представлений, служебные поля). Определите все параметры, задайте им значения и замените специфичные фрагменты обычными соединениями таблиц.

Нужны ли права администратора для просмотра запроса?

Для просмотра текста в конфигураторе достаточно прав на изменение конфигурации. А вот включение технологического журнала требует доступа к серверу 1С и обычно выполняется администратором, поэтому на рабочей базе согласуйте это заранее и ограничьте сбор событий фильтрами.