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

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

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

Анализ причины возникновения ошибки

Проанализируем контекст исполнения клиент-серверной архитектуры в управляемом приложении. На тонком клиенте данные обработки не существуют напрямую в виде стандартного прикладного объекта. Вся информация формы хранится в специальной структуре данных — контексте формы.

Выясним основные причины ошибки:

  1. Обращение вне контекста объекта: На клиенте табличные части обработки доступны только как элементы структуры Объект. Попытка обратиться к реквизиту напрямую по имени БалансСчетовЗаДень приводит к тому, что система не может найти такую переменную в клиентском контексте. Правильный путь — Объект.БалансСчетовЗаДень.
  2. Типизация данных формы: На тонком и веб-клиенте тип ТаблицаЗначений недоступен. На клиенте реквизит табличной части имеет тип ДанныеФормыКоллекция. У этого типа нет метода Загрузить(), принимающего напрямую объект ТаблицаЗначений.
  3. Ограничения передачи типов: Выполнить запрос и получить объект типа ТаблицаЗначений можно только на сервере. Передать объект ТаблицаЗначений с сервера на клиент напрямую нельзя, так как этот тип не сериализуется для передачи по сети.

Способ 1. Прямое заполнение табличной части на сервере (Рекомендуемый)

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

Рассмотрим пример кода:


&НаКлиенте
Процедура Заполнить(Команда)
    ЗаполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере()
    ТаблицаЗапроса = ВыбратьНаСервереБалансСчетовЗаДень(); // Возвращает ТаблицуЗначений
    Объект.БалансСчетовЗаДень.Загрузить(ТаблицаЗапроса);
КонецПроцедуры

В данном случае на сервере у коллекции ДанныеФормыКоллекция (которой является Объект.БалансСчетовЗаДень) доступен метод Загрузить(). Он автоматически сопоставляет колонки таблицы значений с реквизитами табличной части и заполняет данные.

Способ 2. Заполнение через преобразование контекста формы в объект

Если логика заполнения табличной части описана в модуле объекта обработки или требует вызова его прикладных методов, используем функции преобразования контекста РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.

Посмотрим на пример реализации:


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

Ограничения и рекомендации по выбору решения

При выборе метода работы с данными обратите внимание на следующие нюансы:

  1. Метод Объект.БалансСчетовЗаДень.Загрузить() работает быстрее, так как обновляет исключительно коллекцию строк конкретной табличной части, не перечитывая весь объект формы.
  2. Метод РеквизитФормыВЗначение полностью воссоздает экземпляр обработки в памяти сервера. Его следует использовать в случаях, когда после загрузки таблицы необходимо вызвать процедуры модуля объекта.
  3. Если таблица создана не в конфигураторе как табличная часть обработки, а добавлена непосредственно на форму как произвольный реквизит с типом ТаблицаЗначений, для передачи данных с сервера на форму применяется метод ЗначениеВРеквизитФормы(ТаблицаИсточник, "ИмяРеквизитаФормы").
← На главную