Как заполнить табличную часть или таблицу значений из запроса в 1С?

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

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

Метод Загрузить(): основной способ заполнения

Самый быстрый и простой способ заполнить коллекцию строк — использовать метод Загрузить(). Этот метод доступен как для табличных частей объектов (документов, справочников, обработок), так и для таблиц значений. Рассмотрим базовый алгоритм действий:

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

Проанализируем пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Реализация.Ссылка КАК Ссылка,
    |   Реализация.Организация КАК Организация,
    |   Реализация.СуммаДокумента КАК Сумма
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК Реализация";

РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Предположим, что ТабличнаяЧасть — это имя ТЧ вашей обработки
ТабличнаяЧасть.Загрузить(РезультатЗапроса);

Проблема пустых колонок и важность псевдонимов

Выясним причину, по которой у новичков часто возникают «пустые строки». Метод Загрузить() работает по принципу соответствия имен. Если в результате запроса колонка называется Организация, а в табличной части она называется ОрганизацияШапки, данные не будут загружены, хотя количество строк в таблице увеличится. Платформа просто не поймет, в какую колонку поместить значение.

Важный момент: если вы обращаетесь к полям через точку (например, РеализацияТоваровУслуг.Ссылка.Организация), 1С автоматически присвоит этой колонке техническое имя, которое может не совпадать с именем реквизита в вашей ТЧ. Чтобы избежать проблем, всегда используйте ключевое слово КАК для задания явного псевдонима.

Разберем на примере из обсуждения:


|ВЫБРАТЬ
|   РеализацияТоваровУслуг.Ссылка.Организация КАК Организация,
|   РеализацияТоваровУслуг.Ссылка.Дата КАК Дата,
|   КлассификаторВЕТИС.UUID КАК UUIDОрганизации
|ИЗ
|   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг
|   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлассификаторВЕТИС КАК КлассификаторВЕТИС
|   ПО РеализацияТоваровУслуг.Ссылка.Организация = КлассификаторВЕТИС.Объект

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

Особенности работы в управляемых формах

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

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


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

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

Типичные технические нюансы

Проанализируем дополнительные факторы, которые могут помешать корректному заполнению:

  1. Несовпадение типов: если в запросе поле имеет тип Строка, а в табличной части — СправочникСсылка, ячейка останется пустой. Платформа не выполняет автоматическое преобразование типов при методе Загрузить().
  2. Использование NULL: при использовании ЛЕВОЕ СОЕДИНЕНИЕ, если запись во второй таблице не найдена, запрос вернет NULL. Если колонка ТЧ не поддерживает пустые значения или имеет строго определенный тип, данные могут не отобразиться. В запросе рекомендуется использовать функцию ЕСТЬNULL(Поле, ЗначениеЗамены).
  3. Разыменование полей (обращение через точку): Конструкции типа Ссылка.Организация.Наименование создают дополнительные соединения в SQL-запросе, что замедляет работу. Старайтесь выбирать данные из первичных таблиц.
  4. Права доступа (RLS): если у пользователя настроены ограничения на уровне записей, запрос может вернуть пустой результат, даже если данные в базе есть. Для проверки рекомендуется временно запустить код с использованием УстановитьПривилегированныйРежим(Истина).

Альтернатива: Построчное заполнение

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


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    НоваяСтрока = Объект.Остатки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
    
    // Здесь можно добавить дополнительную логику
    Если Выборка.Сумма > 1000 Тогда
        НоваяСтрока.ВажнаяЗапись = Истина;
    КонецЕсли;
КонецЦикла;

Метод ЗаполнитьЗначенияСвойств() автоматически сопоставит поля из выборки запроса с именами реквизитов новой строки, что делает код лаконичным и понятным.

← На главную