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