Как выделить цветом строки в журнале документов в зависимости от связанных документов в 1С:УТ 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе в толстом клиенте на обычных формах (например, в конфигурации «Управление торговлей 10.3») часто возникает задача визуального разделения строк в списках и журналах документов. Типичный сценарий — подсветить документ «Возврат товаров от покупателя», если по нему уже оформлен «Расходный кассовый ордер» (РКО), либо выделить документ «Реализация товаров и услуг», если по нему зафиксирован возврат или поступила оплата.

Разберем подробно, как правильно реализовать такое оформление без критической потери производительности при прокрутке списка.

Выбор обработчика: почему именно ПриПолученииДанных

Для управления оформлением строк в табличном поле списка документов платформа предоставляет два основных события:

  1. ПриВыводеСтроки — вызывается индивидуально для каждой отображаемой строки. Если выполнять внутри этого обработчика запросы к базе данных, интерфейс начнет зависать даже при небольшом числе строк на экране.
  2. ПриПолученииДанных — вызывается один раз для всей порции отображаемых на экране строк (передает коллекцию ОформленияСтрок). Это позволяет собрать массив ссылок всех видимых документов и выполнить всего один запрос к базе данных.

Шаг 1. Раскраска документов «Возврат товаров от покупателя» при наличии проведенного РКО

Рассмотрим алгоритм решения задачи. Сначала мы собираем ссылки всех отображаемых строк в массив и создаем соответствие для быстрого доступа к объектам оформления. Затем выполняем запрос, соединяющий табличную часть РасшифровкаПлатежа документа РасходныйКассовыйОрдер с проверяемыми документами возврата, и применяем цвет к нужным строкам.

Посмотрим на пример кода в модуле формы списка:


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

КонецПроцедуры

Шаг 2. Раскраска документов «Реализация товаров и услуг» по оплатам и возвратам

Проанализируем аналогичную задачу для списка реализаций. Документ реализации может быть закрыт как оплатой (через ПриходныйКассовыйОрдер, ПлатежноеПоручениеВходящее, ОплатаОтПокупателяПлатежнойКартой), так и возвратом товара.

Разберем пример запроса, который определяет наличие проведенного ПКО к реализации:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|   Реализация.Ссылка КАК Ссылка
|ИЗ
|   Документ.РеализацияТоваровУслуг КАК Реализация
|       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер.РасшифровкаПлатежа КАК ПКО_Расшифровка
|       ПО (ПКО_Расшифровка.ДокументРасчетовСКонтрагентом = Реализация.Ссылка)
|           И (ПКО_Расшифровка.Ссылка.Проведен = ИСТИНА)
|ГДЕ
|   Реализация.Ссылка В(&МассивСсылок)
|   И Реализация.Проведен = ИСТИНА";

Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    ТекущееОформление = СоответствиеСсылок[Выборка.Ссылка];
    Если ТекущееОформление <> Неопределено Тогда
        ТекущееОформление.ЦветФона = WebЦвета.ЖелтоЗеленый;
    КонецЕсли;
КонецЦикла;

Тонкости и возможные проблемы при определении связей документов

Выясним причину, по которой прямое соединение табличных частей может не находить связанные документы в конфигурации «Управление торговлей 10.3»:

  1. Настройки договора контрагента: Табличная часть ДокументыРасчетовСКонтрагентом в документах взаиморасчетов заполняется только тогда, когда в договоре с контрагентом включен вид расчетов «По документам расчетов». Если учет ведется «По договору в целом» или «По заказам», эта табличная часть остается пустой.
  2. Связь возврата и реализации по партиям: Если возврат введен на основании реализации, прямая ссылка на документ партии чаще всего находится в табличной части Товары возврата в реквизите ДокументПартии, а не в реквизитах шапки или расчетов.
  3. Множественность документов оплаты: Реализация может оплачиваться не только через ПКО, но и через безналичные платежи (ПлатежноеПоручениеВходящее, ПлатежныйОрдерПоступлениеДенежныхСредств) или эквайринг (ОплатаОтПокупателяПлатежнойКартой).

Рекомендации по оптимизации производительности

Для обеспечения максимального быстродействия при интерактивной работе с журналом документов придерживайтесь следующих правил:

  1. Объединяйте запросы: Не создавайте несколько отдельных объектов Запрос внутри процедуры ПриПолученииДанных. Объединяйте условия через конструкции ОБЪЕДИНИТЬ ВСЕ или пакетные запросы.
  2. Используйте критерий отбора: Для поиска подчиненных документов можно обращаться к типовому критерию отбора СвязанныеДокументы, что исключает необходимость перечисления всех табличных частей конфигурации.
  3. Кэшируйте результаты: Сохраняйте полученные цвета строк в переменную формы (например, в Соответствие). При вызове события запрашивайте данные только для тех ссылок из ОформленияСтрок, которых еще нет в кэше, и очищайте кэш при обновлении списка.
  4. Проверяйте подписку на событие: Обязательно убедитесь в палитре свойств табличного поля, что имя обработчика явно привязано к событию ПриПолученииДанных.
← На главную