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

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

Как вывести результат запроса на форму в 1С

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

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

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

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

Выбор способа вывода: динамический список или таблица значений

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

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

Для иерархических данных (группы и подчинённые строки) применяется дерево значений. Оно строится из результата запроса с итогами по группировкам либо заполняется построчно из выборки.

Сравнение вариантов вывода

Динамический список

Интерактивный список с отборами и сортировкой. Ограничение: запрос должен быть одиночным, без пакетов и сложной постобработки.

Таблица значений

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

Дерево значений

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

Вывод через динамический список

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

Для отбора по параметрам используется установка параметров динамического списка программно. Это делается при создании формы на сервере:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Список.Параметры.УстановитьЗначениеПараметра("Организация", ТекущаяОрганизация);

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

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

Вывод результата запроса в таблицу значений на форме

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

&НаСервере

Процедура ЗаполнитьДанные()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

| Остатки.КоличествоОстаток КАК Остаток

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки

| ПО Номенклатура.Ссылка = Остатки.Номенклатура";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

ТаблицаДанных.Загрузить(Запрос.Выполнить().Выгрузить());

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

Метод Выгрузить() возвращает таблицу значений, а Загрузить() переносит её в реквизит формы. Имена колонок результата запроса должны совпадать с именами колонок реквизита формы — иначе данные по несовпадающим колонкам будут потеряны без сообщения об ошибке.

Порядок вывода в таблицу значений
  1. 1
    Создайте реквизит формы типа «ТаблицаЗначений» и добавьте колонки с типами
  2. 2
    Перетащите реквизит в дерево элементов формы — появится таблица
  3. 3
    В серверной процедуре сформируйте запрос и установите параметры
  4. 4
    Выполните Загрузить(Запрос.Выполнить().Выгрузить()) в реквизит формы
  5. 5
    Откройте форму и проверьте, что колонки заполнены и типы отображаются корректно

Вывод иерархии: дерево значений из запроса

Когда результат нужно показать в виде дерева — например, заказы с разворотом по контрагентам — используйте запрос с итогами и выгрузку в дерево значений. В запросе добавьте конструкцию ИТОГИ ПО, а результат выгрузите с типом обхода ПоГруппировкам:

Запрос.Текст =

"ВЫБРАТЬ

| Контрагент,

| Заказ,

| Сумма

|ИЗ

| Документ.ЗаказКлиента

|ИТОГИ ПО

| Контрагент";

ДеревоДанных = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

ЗначениеВРеквизитФормы(ДеревоДанных, "ДеревоФормы");

Обратите внимание на последнюю строку: реквизит формы типа «ДеревоЗначений» нельзя заполнить методом Загрузить() напрямую из переменной — требуется преобразование через ЗначениеВРеквизитФормы(). Это частая причина ошибок у начинающих разработчиков.

Проверка результата и отладка

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

Второй шаг — проверить совпадение имён колонок. Если колонка результата называется «Товар», а колонка реквизита формы — «Номенклатура», данные молча не перенесутся. Используйте псевдонимы в запросе (КАК Номенклатура), чтобы привести имена к единому виду.

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

Как проверить результат

Запрос в консоли запросов
Норма

Возвращает ожидаемые строки и типы полей

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

Пустой результат или ошибка — чинить запрос, а не форму

Имена колонок
Норма

Псевдонимы полей совпадают с колонками реквизита формы

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

Часть колонок пустая при заполненном результате

Типы данных
Норма

Ссылки отображаются как ссылки, числа — как числа

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

Все значения выводятся строками — колонки реквизита без типа

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

Самая распространённая ошибка — попытка выполнить запрос в клиентской процедуре. В управляемом приложении объект Запрос доступен только на сервере, поэтому заполнение таблиц всегда делается в процедурах с директивой &НаСервере, а кнопка «Обновить» вызывает серверный вызов.

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

Типичные ошибки
01
Вызов Запрос.Выполнить() в клиентской процедуре — ошибка компиляции или выполнения, переносите код на сервер
02
Несовпадение имён колонок результата и реквизита формы — данные теряются без сообщений
03
Выгрузка всей таблицы без отбора — форма открывается минутами, добавьте отбор и ограничение строк
04
Заполнение дерева значений без ЗначениеВРеквизитФормы — ошибка при попытке прямого присвоения
05
Неустановленные параметры динамического списка — ошибка при открытии формы

Альтернативы: отчёт на СКД вместо таблицы на форме

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

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

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

Как выбрать действие

Нужен интерактивный список объектов с отбором и открытием по двойному щелчкуИспользуйте динамический список с произвольным запросом
Нужна разовая выборка с расчётами или редактируемые строкиСоздайте реквизит «ТаблицаЗначений» и заполняйте через Выгрузить()
Данные иерархические, нужны группы и подчинённые строкиПримените дерево значений и ИТОГИ ПО в запросе
Пользователю нужны настройки, варианты и группировки без доработокСделайте отчёт на СКД вместо ручной формы

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

Итог

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

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

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

Можно ли вывести результат запроса на форму без создания реквизита?

Нет, в управляемой форме данные отображаются только через реквизиты формы. Элемент формы (таблица, поле) лишь показывает содержимое реквизита. Минимальный набор — реквизит типа «ТаблицаЗначений» с колонками и связанный с ним элемент «ТаблицаФормы».

Почему таблица на форме пустая, хотя запрос в консоли возвращает строки?

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

Как обновить данные в таблице после изменения параметров отбора?

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

Как вывести результат пакетного запроса с временными таблицами?

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

Почему ссылки в таблице не открываются по двойному щелчку?

Для таблицы значений платформа не предоставляет автоматического открытия объектов. Добавьте обработчик события таблицы «Выбор» на клиенте и в нём вызовите ПоказатьЗначение() для ссылки из текущей строки. В динамическом списке открытие работает без дополнительного кода.

Есть ли ограничение на количество строк в таблице значений на форме?

Жёсткого лимита платформа не устанавливает, но практический предел определяется производительностью: десятки тысяч строк уже заметно замедляют открытие формы и прокрутку. Для больших объёмов используйте динамический список, отборы или постраничный вывод.