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