При разработке интерфейсов в толстом клиенте (обычные формы) часто возникает необходимость отобразить в табличном поле журнала документов дополнительные сведения, которых физически нет в самом документе или журнале. Например, признак наличия оригинала документа, хранящийся в отдельном справочнике или регистре сведений.
Разберем, как правильно реализовать вывод таких данных без потери производительности при прокрутке списка.
В зависимости от используемого режима форм платформы 1С подход к решению задачи принципиально различается:
ПриВыводеСтроки или ПриПолученииДанных.Использование события ПриВыводеСтроки для выполнения запросов к базе данных категорически не рекомендуется: запрос будет выполняться отдельно для каждой строки на экране, что приведет к сильным зависаниям интерфейса. Единственно верным решением для обычных форм является использование события ПриПолученииДанных, где все видимые строки обрабатываются пакетно за один запрос.
Разберем по шагам порядок реализации вывода данных:
Оригинал).ПриПолученииДанных.Проанализируем алгоритм работы обработчика. Нам необходимо собрать массив ссылок всех документов, которые в текущий момент выводятся на экран (передаются платформой в параметре ОформленияСтрок), выполнить один запрос к справочнику и заполнить ячейки полученными значениями.
Посмотрим на пример программного кода:
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
// Массив для передачи в параметр запроса
МассивСсылок = Новый Массив;
// Соответствие для быстрого поиска строки оформления по ссылке
СоответствиеСтрок = Новый Соответствие;
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ТекСсылка = ОформлениеСтроки.ДанныеСтроки.Ссылка;
МассивСсылок.Добавить(ТекСсылка);
СоответствиеСтрок.Вставить(ТекСсылка, ОформлениеСтроки);
КонецЦикла;
// Выбираем только те документы, для которых взведен признак оригинала
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОригиналыДокументов.Документ КАК Документ,
| ОригиналыДокументов.Оригинал КАК Оригинал
|ИЗ
| Справочник.ОригиналыДокументов КАК ОригиналыДокументов
|ГДЕ
| ОригиналыДокументов.Документ В(&МассивСсылок)
| И ОригиналыДокументов.Оригинал = ИСТИНА";
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ТекущееОформление = СоответствиеСтрок[Выборка.Документ];
Если ТекущееОформление <> Неопределено Тогда
ТекущееОформление.Ячейки.Оригинал.УстановитьФлажок(Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Рассмотрим подробнее ключевые моменты этого кода:
ОформленияСтрок содержит объекты ОформлениеСтроки только для тех строк, которые физически отображаются на экране пользователя.Соответствие позволяет избежать вложенных циклов и осуществлять поиск нужной строки оформления по ссылке документа за постоянное время O(1).Выясним особенности платформенных ограничений при работе с виртуально вычисляемыми колонками:
Документ в справочнике обязательно должен быть проиндексирован (свойство метаданных Индексировать). Без индекса СУБД будет сканировать всю таблицу справочника при каждой прокрутке списка.ПриПолученииДанных, стандартные механизмы сортировки, быстрого поиска и интерактивного отбора в обычных формах не работают, так как эти данные отсутствуют в исходном запросе динамического списка.УстановитьФлажок(Ложь)).Если проект развивается или требует регулярных отборов по выводимому полю, рассмотрим более подходящие архитектурные варианты:
Документ (индексируется автоматически), а ресурсом — статус или признак оригинала.