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