Как правильно загрузить результат запроса в таблицу значений на управляемой форме 1С

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

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

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

Проанализируем ситуацию, когда код выполняется без видимых прерываний, но вместо данных в таблице на форме мы видим пустые строки. Основная причина кроется в механизме работы метода Загрузить(). Этот метод сопоставляет колонки источника (результата запроса) и приемника (таблицы значений) исключительно по их именам. Если в запросе вы выбираете поле Наименование, а в реквизите формы колонка называется ФизЛицо, данные не будут перенесены, хотя строки будут созданы.

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

  1. Вы передаете во втором параметре имя реквизита, которого не существует на форме.
  2. Если ваша таблица является табличной частью документа, то путь к ней должен начинаться с префикса Объект. (например, "Объект.ИсторияИзменения"), а не просто "ИсторияИзменения".

Способ 1: Использование метода ЗначениеВРеквизитФормы (Рекомендуемый)

Этот способ является наиболее эффективным для управляемых форм, так как он позволяет быстро заменить все данные в коллекции. Проанализируем правильный алгоритм действий на сервере:


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

Важный момент: обратите внимание на использование псевдонимов в запросе (КАК Ответственный). Если в вашей таблице на форме колонка называется Ответственный, а в справочнике это поле Ссылка, использование псевдонима обязательно. Также обратите внимание на типы данных: если колонка на форме ожидает ссылку, в запросе нужно выбирать именно Ссылка, а не Наименование (строку).

Способ 2: Модификация таблицы через преобразование в объект

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


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

Почему возникают пустые строки при использовании .Загрузить()?

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

Если в вашей таблице на форме есть колонки Сотрудник и ДатаСобытия, а запрос вернул колонки Ссылка и Период, то:

  1. Программа создаст строки.
  2. Программа не найдет в результате запроса колонку Сотрудник (потому что там Ссылка).
  3. Программа не найдет колонку ДатаСобытия (потому что там Период).
  4. В итоге вы получите таблицу с правильным количеством строк, но во всех ячейках будут пустые значения.

Решение: Всегда проверяйте соответствие псевдонимов в тексте запроса именам колонок реквизита формы. Помните, что 1С чувствительна к регистру и точному написанию имен идентификаторов.

Особенности работы с Табличными Частями документа

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

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


// Правильно для табличной части документа
ЗначениеВРеквизитФормы(ТЗ_Результат, "Объект.Товары");

// Ошибка для табличной части (приведет к ошибке параметра №2)
ЗначениеВРеквизитФормы(ТЗ_Результат, "Товары");

Подведение итогов

Для успешной загрузки данных из запроса в таблицу на форме придерживайтесь следующих правил:

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

← На главную