Разработка и Конфигурация · 11 мин
Как получить запрос динамического списка в 1С
Как получить запрос динамического списка в 1С: через свойства формы, программно, через консоль запросов и СКД. Примеры кода, типичные ошибки и проверка результата.
Динамический список в управляемых формах 1С строится на основе запроса, и у разработчика регулярно возникает задача этот запрос получить: чтобы скопировать его в отчёт, отладить в консоли запросов, доработать или убедиться, что платформа подставила в текст именно те отборы, которые задал пользователь. Запрос можно посмотреть в конфигураторе через свойства списка, получить программно в коде формы, а также «снять» итоговый текст, который реально уходит в СУБД.
Важно различать три состояния одного и того же запроса: исходный текст, заданный в свойстве «Запрос» или в настройках СКД; текст с учётом произвольного запроса и переопределённых полей; и финальный запрос, который платформа формирует после применения отборов, сортировки и группировки. Для разных задач нужен разный из этих вариантов, и путаница между ними — частая причина того, что скопированный запрос «не совпадает» с данными списка.
Где хранится запрос динамического списка
Динамический список — это реквизит управляемой формы с типом «ДинамическийСписок». Его источник данных определяется двумя ключевыми свойствами: «Основная таблица» и «Произвольный запрос». Если флаг «Произвольный запрос» снят, платформа сама строит запрос по основной таблице, и отдельного текста запроса в свойствах нет — получить его можно только программно или из финального обращения к базе.
Если флаг «Произвольный запрос» установлен, текст запроса находится в свойстве «Запрос» реквизита формы. Открыть его можно в конфигураторе: форма объекта → панель реквизитов → свойства реквизита списка → строка «Запрос». По кнопке открытия запускается конструктор запроса, в котором текст можно скопировать целиком.
Дополнительно на итоговый текст влияет настройка компоновки данных: динамический список всегда работает через СКД, даже если вы не включали её явно. Отборы, сортировка и группировка, которые пользователь задаёт в форме, платформа добавляет к запросу автоматически, поэтому «чистый» текст из свойств и реально выполняемый запрос почти всегда отличаются.
Получение запроса через конфигуратор
Самый простой способ — открыть текст в свойствах формы. Последовательность действий: откройте форму в конфигураторе, найдите в дереве реквизитов реквизит с типом «ДинамическийСписок», вызовите палитру свойств и найдите строку «Запрос». Если там стоит признак произвольного запроса, нажмите кнопку открытия — откроется конструктор с полным текстом.
Если произвольный запрос не задан, текст в свойствах отсутствует. В этом случае запрос формируется платформой по основной таблице и видимым полям. Чтобы получить такой запрос для отладки, проще всего временно включить «Произвольный запрос» — конструктор предложит автоматически сформировать текст по текущим настройкам, и его можно скопировать, после чего отменить изменения.
- 1Откройте форму объекта в конфигураторе и найдите реквизит типа «ДинамическийСписок»
- 2В палитре свойств найдите строку «Запрос» и проверьте флаг «Произвольный запрос»
- 3Нажмите кнопку открытия запроса и скопируйте текст из конструктора
- 4Если запрос не произвольный — временно включите флаг, скопируйте сформированный текст, затем отмените изменения
Программное получение текста запроса
В коде формы текст произвольного запроса доступен через свойства реквизита динамического списка. Обращение выполняется к свойствам, которые платформа предоставляет для динамических списков: среди них есть основная таблица, текст запроса и настройки компоновки.
&НаСервере
Процедура ПоказатьЗапросСписка()
ТекстЗапроса = Список.ТекстЗапроса; // текст произвольного запроса
ОсновнаяТаблица = Список.ОсновнаяТаблица; // например "Документ.РеализацияТоваровУслуг"
Сообщить(ТекстЗапроса);
КонецПроцедуры
Свойство «ТекстЗапроса» содержит только тот текст, который задан разработчиком как произвольный запрос. Если произвольный запрос не использовался, свойство будет пустым — это нормально и не означает ошибку. Установка этого свойства программно, наоборот, является штатным способом динамически менять источник данных списка: присваиваете новый текст — и список перестраивается.
Обратите внимание: менять текст запроса программно следует на сервере, до того как список выведен пользователю, либо с пониманием того, что список обновится. Также при смене текста запроса теряется связь с полями, которых нет в новом запросе, — динамические поля и настройки, ссылающиеся на старые поля, перестанут работать.
Как получить итоговый запрос с учётом отборов
Задача «получить именно тот запрос, который выполняется» решается иначе, потому что финальный текст собирается платформой в момент обращения к данным. Практических подхода два: посмотреть запрос в технологическом журнале либо воспроизвести схему компоновки и настройки списка в консоли СКД.
Технологический журнал с событием DBMSSQL (или DBPOSTGRS, DBORACLE — в зависимости от СУБД) фиксирует все запросы к базе. Включив журнал на время обновления списка, вы увидите фактический SQL с подставленными параметрами отборов. Это самый достоверный способ, но он требует доступа к серверу 1С и аккуратной настройки фильтров событий, чтобы не перегрузить журнал.
Второй способ — перенести настройки списка в консоль компоновки данных. Динамический список хранит схему и настройки компоновки; их можно программно сериализовать (например, через СериализаторXDTO в значение XDTO и далее в XML) и загрузить в консоль СКД, где доступен просмотр итогового запроса, макета компоновки и текста, который уйдёт в базу.
// Сохранение настроек динамического списка в XML
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Список.КомпоновщикНастроек.Настройки);
ТекстНастроек = Запись.Закрыть();Отладка полученного запроса в консоли запросов
Скопированный текст почти никогда нельзя просто вставить в консоль запросов и выполнить: в нём есть параметры, которые платформа подставляла автоматически. Перед запуском нужно определить все параметры (стандартные — период виртуальных таблиц, отборы; пользовательские — те, что заданы в настройках списка) и задать им значения в консоли.
Если запрос строился через конструктор и использует расширения языка запросов для динамических списков (например, конструкции, связанные с представлениями или переопределением полей), консоль запросов может не понимать такие фрагменты. В этом случае фрагменты, специфичные для динамического списка, заменяют эквивалентными обычными соединениями и полями.
Признак корректной отладки: результат в консоли совпадает по составу строк с данными списка при тех же отборах. Если строк больше или меньше — ищите различия в параметрах виртуальных таблиц (периодичность, границы дат) и в отборах, которые в списке применяет платформа, а в консоли вы забыли воспроизвести.
Как проверить, что запрос получен верно
Количество и состав строк совпадают
Строк больше/меньше — проверьте параметры виртуальных таблиц и пропущенные отборы
Все параметры определены и заполнены перед выполнением
Ошибка «Параметр не определён» при запуске в консоли
Текст запроса читается из свойства «Запрос» или свойства «ТекстЗапроса»
Свойство пустое при снятом флаге «Произвольный запрос» — это норма, а не ошибка
Типичные ошибки и ограничения
Наиболее частая ошибка — ожидание, что «ТекстЗапроса» вернёт запрос вместе с пользовательскими отборами. Этого не происходит: отборы живут в настройках компоновщика и добавляются платформой на этапе выполнения. Для получения полной картины нужны либо технологический журнал, либо работа со схемой и настройками СКД.
Вторая группа ошибок связана с программной заменой текста запроса: разработчик присваивает новый текст, но забывает, что поля нового запроса должны совпадать по именам с полями, на которые ссылаются элементы формы и настройки. Итог — пустые колонки или ошибки при обновлении списка.
Третья типичная ситуация — попытка выполнить в консоли запрос с обращением к полям, которые динамический список получает через переопределение представлений (например, автопредставления ссылок). В обычном запросе таких полей нет, и текст нужно адаптировать вручную.
Когда какой способ выбирать
Для быстрой задачи «посмотреть и скопировать» достаточно конфигуратора: свойства реквизита формы дают исходный текст за минуту. Для программной доработки — когда нужно читать или менять запрос из кода — используются свойства динамического списка на сервере формы.
Для глубокой отладки производительности и проверки того, что реально уходит в СУБД, подходит только технологический журнал: он показывает фактический запрос с параметрами. Консоль СКД занимает промежуточное положение: она позволяет воспроизвести настройки и увидеть итоговый запрос без доступа к серверу, но требует корректного переноса схемы и настроек.
Как выбрать способ
Что важно запомнить
Исходный запрос динамического списка хранится в свойстве «Запрос» реквизита формы и доступен программно через «ТекстЗапроса». Отборы пользователя в этот текст не входят — итоговый запрос смотрите через технологический журнал или консоль СКД. При отладке в консоли запросов обязательно заполняйте все параметры и воспроизводите отборы списка.
Частые вопросы
Почему свойство «ТекстЗапроса» возвращает пустую строку?
Потому что флаг «Произвольный запрос» в свойствах списка снят: платформа строит запрос автоматически по основной таблице, и отдельного текста не существует. Чтобы увидеть такой запрос, временно включите произвольный запрос в конфигураторе — конструктор сформирует текст по текущим настройкам.
Как получить запрос вместе с отборами, которые поставил пользователь?
Штатного свойства с «готовым» текстом нет. Практические варианты: включить технологический журнал с событиями обращения к СУБД и посмотреть фактический запрос, либо сериализовать настройки компоновщика списка и воспроизвести их в консоли СКД, где виден итоговый текст запроса.
Можно ли программно изменить запрос динамического списка?
Да, присвоением нового текста свойству «ТекстЗапроса» в серверном коде формы. Учтите, что имена полей нового запроса должны совпадать с полями, на которые ссылаются элементы формы и настройки, иначе колонки перестанут заполняться.
Почему запрос из списка не выполняется в консоли запросов?
Чаще всего из-за незаполненных параметров или конструкций, специфичных для динамических списков (переопределение представлений, служебные поля). Определите все параметры, задайте им значения и замените специфичные фрагменты обычными соединениями таблиц.
Нужны ли права администратора для просмотра запроса?
Для просмотра текста в конфигураторе достаточно прав на изменение конфигурации. А вот включение технологического журнала требует доступа к серверу 1С и обычно выполняется администратором, поэтому на рабочей базе согласуйте это заранее и ограничьте сбор событий фильтрами.