Как правильно заполнить табличную часть внешнего отчета на управляемых формах 1С?

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

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

Разбор типичной ошибки

Чаще всего проблема кроется в использовании метода РеквизитФормыВЗначение внутри серверной процедуры. Когда вы вызываете этот метод для объекта «Отчет», платформа создает временный объект в памяти сервера. Все изменения, которые вы вносите в табличную часть этого временного объекта, существуют только в рамках текущей серверной процедуры и не передаются обратно в форму автоматически. После завершения процедуры этот временный объект просто «исчезает», а форма остается пустой.

Проанализируем ошибочный подход:


// Ошибочный код
Процедура ЗаполнитьНаСервере()
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет"); // Создали временную копию
    // ... заполнение ...
    НС = ОтчетОбъект.ТабличнаяЧасть.Добавить(); // Добавляем в копию
    // Изменения не попадут на экран!
КонецПроцедуры

Решение: прямая работа с реквизитами формы

Чтобы данные появились на форме, необходимо манипулировать не временным объектом, а непосредственно реквизитами формы. В управляемых формах каждый элемент, выведенный на форму, связан с определенным реквизитом. Если вы добавили табличную часть или таблицу значений как реквизит формы, вам достаточно обращаться к ней через ключевое слово Отчет.

Рассмотрим по шагам, как это реализовать:

  1. Убедитесь, что табличная часть добавлена в реквизиты формы (или создана как отдельный реквизит формы с типом ТаблицаЗначений).
  2. В коде на сервере обращайтесь к данным напрямую через имя реквизита: Отчет.ВашаТабличнаяЧасть.
  3. Платформа автоматически синхронизирует состояние реквизита на сервере и его визуальное отображение на клиенте.

Посмотрим на исправленный вариант заполнения:


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

Почему использование запроса — лучший выбор

Помимо самой архитектуры передачи данных, критически важно обратить внимание на производительность. В начальном коде автора использовался метод Документы.РеализацияТоваровУслуг.Выбрать(). Это классическая ошибка «перебора документов», которая заставляет платформу считывать каждый документ из базы данных по отдельности.

Использование Запрос дает следующие преимущества:

Итоги и рекомендации

Подводя итог нашей совместной работы над задачей, можно выделить главные правила:

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

Теперь, когда вы знаете механизм взаимодействия между серверными процедурами и отображением на форме, ваши отчеты будут работать корректно и быстро!

← На главную