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