Почему результат запроса не вставляется в табличную часть 1С?

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

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

Причины возникновения проблемы

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


Для Каждого ЭлементРезультата Из ТзВрем Цикл
    НоваяСтрокаТЧ = ТЧ1.Добавить();
    НоваяСтрокаТЧ.Наименование = ЭлементРезультата.Наименование;
КонецЦикла;

Если после выполнения такого кода поле Наименование остается пустым, проанализируем основные причины:

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

Диагностика через отладчик

Чтобы быстро локализовать проблему, выясним причину с помощью точки останова:

  1. Установим точку останова внутри цикла на строке присвоения значения.
  2. Откроем табло отладчика и проверим тип реквизита табличной части: ТипЗнч(НоваяСтрокаТЧ.Наименование) или проверим описание метаданных реквизита.
  3. Проверим тип и значение в источнике: ТипЗнч(ЭлементРезультата.Наименование) и ЭлементРезультата.Наименование.
  4. Если тип реквизита — СправочникСсылка.Контрагенты, а передается Строка, необходимо в запросе выбирать поле Ссылка и присваивать именно его: НоваяСтрокаТЧ.Контрагент = ЭлементРезультата.Ссылка;.

Варианты правильного заполнения табличной части

Рассмотрим подробнее эффективные способы переноса данных из запроса в табличную часть.

Способ 1. Использование метода Загрузить()

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


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

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

Способ 2. Прямой обход через ВыборкаИзРезультатаЗапроса

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


ТЧ1.Очистить();
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    НоваяСтрока = ТЧ1.Добавить();
    НоваяСтрока.Контрагент = Выборка.Ссылка;
КонецЦикла;

Способ 3. Использование функции ЗаполнитьЗначенияСвойств()

Если в табличной части много колонок с совпадающими именами, внутри цикла удобно применять функцию ЗаполнитьЗначенияСвойств:


Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    НоваяСтрока = ТЧ1.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;

Функция автоматически сопоставляет свойства источника и приемника по именам и типам, копируя значения только в совпадающие реквизиты.

← На главную