Заполнение табличной части (ТЧ) или таблицы значений (ТЗ) на форме — одна из самых частых задач, с которыми сталкивается разработчик 1С. Начинающие программисты часто сталкиваются с ситуацией, когда запрос выполняется без ошибок, но после загрузки данных в таблицу она остается пустой или заполняется пустыми строками. В этой статье мы подробно разберем, как правильно передать данные из запроса в интерфейс, и проанализируем основные причины возможных ошибок.
Самый быстрый и простой способ заполнить коллекцию строк — использовать метод Загрузить(). Этот метод доступен как для табличных частей объектов (документов, справочников, обработок), так и для таблиц значений. Рассмотрим базовый алгоритм действий:
Запрос и описываем его текст.Загрузить() у целевой таблицы.Проанализируем пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка,
| Реализация.Организация КАК Организация,
| Реализация.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация";
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// Предположим, что ТабличнаяЧасть — это имя ТЧ вашей обработки
ТабличнаяЧасть.Загрузить(РезультатЗапроса);
Выясним причину, по которой у новичков часто возникают «пустые строки». Метод Загрузить() работает по принципу соответствия имен. Если в результате запроса колонка называется Организация, а в табличной части она называется ОрганизацияШапки, данные не будут загружены, хотя количество строк в таблице увеличится. Платформа просто не поймет, в какую колонку поместить значение.
Важный момент: если вы обращаетесь к полям через точку (например, РеализацияТоваровУслуг.Ссылка.Организация), 1С автоматически присвоит этой колонке техническое имя, которое может не совпадать с именем реквизита в вашей ТЧ. Чтобы избежать проблем, всегда используйте ключевое слово КАК для задания явного псевдонима.
Разберем на примере из обсуждения:
|ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка.Организация КАК Организация,
| РеализацияТоваровУслуг.Ссылка.Дата КАК Дата,
| КлассификаторВЕТИС.UUID КАК UUIDОрганизации
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлассификаторВЕТИС КАК КлассификаторВЕТИС
| ПО РеализацияТоваровУслуг.Ссылка.Организация = КлассификаторВЕТИС.Объект
В данном случае имена Организация, Дата и UUIDОрганизации должны в точности (до символа) совпадать с именами колонок в вашей табличной части на форме.
В управляемом приложении мы часто работаем не с самой таблицей значений, а с реквизитом формы типа ДанныеФормыКоллекция. У этого объекта также есть метод Загрузить(), но он имеет свои особенности. Если вы выполняете код на сервере, вы можете выгрузить запрос в ТЗ и загрузить его в реквизит формы напрямую.
Однако существует более производительный метод для управляемых форм — ЗначениеВРеквизитФормы(). Рассмотрим ситуацию, когда данных много:
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере()
Запрос = Новый Запрос("ВЫБРАТЬ ... "); // Ваш текст запроса
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
// Преобразуем таблицу значений напрямую в реквизит формы "Остатки"
ЗначениеВРеквизитФормы(ТаблицаРезультат, "Объект.Остатки");
КонецПроцедуры
Этот способ работает быстрее, так как платформа оптимизирует передачу данных между сервером и клиентом.
Проанализируем дополнительные факторы, которые могут помешать корректному заполнению:
Строка, а в табличной части — СправочникСсылка, ячейка останется пустой. Платформа не выполняет автоматическое преобразование типов при методе Загрузить().ЛЕВОЕ СОЕДИНЕНИЕ, если запись во второй таблице не найдена, запрос вернет NULL. Если колонка ТЧ не поддерживает пустые значения или имеет строго определенный тип, данные могут не отобразиться. В запросе рекомендуется использовать функцию ЕСТЬNULL(Поле, ЗначениеЗамены).Ссылка.Организация.Наименование создают дополнительные соединения в SQL-запросе, что замедляет работу. Старайтесь выбирать данные из первичных таблиц.УстановитьПривилегированныйРежим(Истина).Иногда метод Загрузить() не подходит — например, если вам нужно не полностью очистить таблицу и заменить её данными, а дополнить уже существующие строки или выполнить сложную логику проверки для каждой строки. В этом случае используем обход выборки:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.Остатки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
// Здесь можно добавить дополнительную логику
Если Выборка.Сумма > 1000 Тогда
НоваяСтрока.ВажнаяЗапись = Истина;
КонецЕсли;
КонецЦикла;
Метод ЗаполнитьЗначенияСвойств() автоматически сопоставит поля из выборки запроса с именами реквизитов новой строки, что делает код лаконичным и понятным.