При разработке обработок и документов часто возникает задача программного заполнения табличной части по данным запроса. Нередко разработчики сталкиваются с ситуацией, когда запрос отрабатывает без ошибок, строки в табличную часть добавляются, но определенные поля остаются пустыми. Разберем по шагам, почему возникает эта проблема и как правильно переносить данные запроса в табличную часть.
Рассмотрим типовую ситуацию. Выполняется запрос к справочнику, результат выгружается во временную таблицу значений, а затем в цикле создаются новые строки табличной части:
Для Каждого ЭлементРезультата Из ТзВрем Цикл
НоваяСтрокаТЧ = ТЧ1.Добавить();
НоваяСтрокаТЧ.Наименование = ЭлементРезультата.Наименование;
КонецЦикла;
Если после выполнения такого кода поле Наименование остается пустым, проанализируем основные причины:
СправочникСсылка.Контрагенты), а в коде в нее передается строковое наименование (ЭлементРезультата.Наименование), платформа выполняет неявное приведение типов. Поскольку преобразовать произвольную строку в ссылку невозможно, поле молча очищается и принимает значение пустой ссылки без генерации исключения.Данные (или ПутьКДанным).В ИЕРАРХИИ(&Родитель)) запрос возвращает пустую таблицу, из-за чего строки не заполняются нужными значениями.Чтобы быстро локализовать проблему, выясним причину с помощью точки останова:
ТипЗнч(НоваяСтрокаТЧ.Наименование) или проверим описание метаданных реквизита.ТипЗнч(ЭлементРезультата.Наименование) и ЭлементРезультата.Наименование.СправочникСсылка.Контрагенты, а передается Строка, необходимо в запросе выбирать поле Ссылка и присваивать именно его: НоваяСтрокаТЧ.Контрагент = ЭлементРезультата.Ссылка;.Рассмотрим подробнее эффективные способы переноса данных из запроса в табличную часть.
Если имена и типы колонок в выборке запроса полностью совпадают с именами и типами реквизитов табличной части объекта, наиболее лаконичным решением является метод Загрузить(). Это избавляет от необходимости писать цикл вручную:
ТЧ1.Очистить();
РезультатЗапроса = Запрос.Выполнить();
ТЧ1.Загрузить(РезультатЗапроса.Выгрузить());
Важно: Псевдонимы полей в тексте запроса должны строго соответствовать именам реквизитов табличной части.
Выгрузка результата запроса в промежуточную таблицу значений через Запрос.Выполнить().Выгрузить() создает дубликат данных в оперативной памяти. Оптимальнее использовать прямой обход выборки:
ТЧ1.Очистить();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТЧ1.Добавить();
НоваяСтрока.Контрагент = Выборка.Ссылка;
КонецЦикла;
Если в табличной части много колонок с совпадающими именами, внутри цикла удобно применять функцию ЗаполнитьЗначенияСвойств:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТЧ1.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;
Функция автоматически сопоставляет свойства источника и приемника по именам и типам, копируя значения только в совпадающие реквизиты.