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

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

Работа с табличными полями и вывод в них данных из базы — одна из фундаментальных задач для начинающего разработчика 1С. В этой статье мы подробно разберем, как правильно составить запрос, передать в него параметры и "склеить" результат с элементами интерфейса. Мы проанализируем типичные ошибки, разберем методы оптимизации и посмотрим на различия в подходах для разных типов форм.

Разбор типичных ошибок в тексте запроса

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

Использование конструкции Заказ.СтруктурнаяЕдиница.Ссылка является избыточным. Поле СтруктурнаяЕдиница в документе уже само по себе является ссылкой. Добавление .Ссылка через точку не несет функциональной нагрузки, но заставляет систему выполнять лишние операции. Также обратите внимание на фильтры в секции ГДЕ. Если мы одновременно устанавливаем условие Заказ.Контрагент.Наименование = &Контрагент и Заказ.Контрагент = &Контрагент, это создает логическую путаницу. Рекомендуется всегда фильтровать по ссылке, а не по строковому наименованию, так как это значительно быстрее и надежнее.

Давайте посмотрим на пример чистого и правильного запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    Заказ.Дата КАК Дата,
|    Заказ.Номер КАК Номер,
|    Заказ.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница,
|    Заказ.Контрагент КАК Контрагент
|ИЗ
|    Документ.Заказ КАК Заказ
|ГДЕ
|    Заказ.Проведен = ИСТИНА
|    И Заказ.Дата МЕЖДУ &ДатаНач И &ДатаКон";

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

Выясним, как передать данные из выполненного запроса в объект, который можно отобразить на форме. Самый простой и эффективный способ — использование метода Выгрузить(). Этот метод создает объект ТаблицаЗначений, колонки которой будут называться точно так же, как псевдонимы (после слова КАК) в вашем запросе.

Рассмотрим по шагам процесс выполнения и выгрузки:

  1. Создаем объект Запрос и описываем его текст.
  2. Устанавливаем параметры (даты начала и конца периода, ссылки на объекты).
  3. Выполняем запрос методом Выполнить().
  4. Выгружаем результат в переменную методом Выгрузить().

// Установка параметров
Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Объект.ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(Объект.ПериодРегистрации));

// Выполнение и получение таблицы
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультат = РезультатЗапроса.Выгрузить();

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

Связь данных с управляемой формой

Проанализируем ситуацию в управляемых формах. Здесь мы не можем просто создать таблицу в коде и "бросить" ее в интерфейс. Нам необходимо выполнить следующие действия:

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

Разберем пример кода для серверной процедуры формы:


&НаСервере
Процедура ЗаполнитьТаблицуНаФорме()
    Запрос = Новый Запрос("ВЫБРАТЬ Номер, Дата ИЗ Документ.Заказ");
    Результат = Запрос.Выполнить();
    
    // Очищаем старые данные, если это необходимо
    // Объект.ИмяВашейТаблицы.Очистить();
    
    // Выгружаем данные запроса непосредственно в реквизит формы
    ЗначениеВРеквизитФормы(Результат.Выгрузить(), "ИмяРеквизитаТаблица");
КонецПроцедуры

Важность правильного именования колонок

Посмотрим на распространенную причину ошибки "Данные не отображаются". Метод Выгрузить() работает по принципу соответствия имен. Если в запросе вы написали Заказ.Контрагент КАК Клиент, а в табличном поле на форме колонка называется Контрагент, данные в нее не попадут. Система просто проигнорирует несовпадающие поля. Всегда проверяйте Псевдонимы в конструкторе запроса.

Типизация колонок и производительность

Выясним причину, по которой иногда сортировка или фильтрация в табличном поле работает некорректно. Это часто связано с типизацией. Если вы программно создаете колонки таблицы значений, обязательно указывайте ОписаниеТипов. Например, для даты это должен быть тип Дата, а не просто пустая колонка, которая может превратиться в строку.

Также важно помнить об оптимизации "через точку". Каждый раз, когда вы пишете в запросе Заказ.Контрагент.Наименование, 1С делает скрытое соединение с таблицей справочника Контрагенты. Если вам нужно просто вывести ссылку для того, чтобы пользователь мог открыть карточку контрагента, лучше выбрать само поле Контрагент. Это снизит нагрузку на сервер базы данных.

Обработка пустых результатов и ошибок параметров

Если при выполнении кода вы получаете ошибку "Не задано значение параметра", это означает, что в тексте запроса вы указали переменную через амперсанд (например, &Дата), но не вызвали метод УстановитьПараметр(). Рассмотрим хорошую практику проверки результата перед выгрузкой:


Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
    ТаблицаДанных = Результат.Выгрузить();
Иначе
    Сообщить("По вашему запросу данных не найдено!");
КонецЕсли;

Альтернатива: Динамический список

Если ваша задача — просто отобразить список документов с возможностью поиска и отбора, проанализируем, стоит ли использовать таблицу значений. В 1С существует объект ДинамическийСписок. В отличие от таблицы значений, он не считывает все 10 000 строк из базы сразу, а подгружает их порциями по мере прокрутки пользователем. Это экономит оперативную память и ускоряет открытие формы. В свойствах динамического списка достаточно включить галочку "Произвольный запрос" и вставить туда ваш текст ВЫБРАТЬ.... Для расширения возможностей такого подхода можно изучить методы доработки динамических списков.

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

← На главную