При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача исключить из итогового документа строки, у которых значения двух определенных колонок совпадают (например, когда наш долг равен долгу поставщика, либо разница между показателями равна нулю). Рассмотрим подробно, как правильно организовать сравнение полей и исключить такие строки из вывода отчета.
Перед тем как переходить к настройке отборов, проанализируем нюансы, из-за которых сравнение в отчете может работать некорректно:
NULL (например, при левом соединении таблиц), выражение прямого сравнения или вычитания вернет NULL. В логике 1С значение NULL не равно ИСТИНА, из-за чего отбор отработает неправильно. В выражениях необходимо всегда использовать функцию ЕСТЬNULL().Рассмотрим наилучший практический подход, при котором в запрос или вычисляемые поля добавляется числовая разница между сравниваемыми показателями.
Разберем по шагам порядок настройки:
ЕСТЬNULL(Поле1, 0) - ЕСТЬNULL(Поле2, 0)
0.Благодаря этому условию из отчета будут исключены все строки, в которых значения Поле1 и Поле2 совпадают.
Если требуется сформировать флаг совпадения прямо в тексте запроса, проанализируем следующий вариант с конструкцией ВЫБОР:
ВЫБОР
КОГДА ЕСТЬNULL(ТаблицаЗадолженностей.НашДолгВВалютеОтчета, 0) = ЕСТЬNULL(ТаблицаЗадолженностей.ДолгПоставщикаВВалютеОтчета, 0)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ПоляРавны
После добавления этого поля в набор данных переходим в настройки отчета и устанавливаем отбор: ПоляРавны Равно ЛОЖЬ.
Если отчет строится на базе типа Набор данных - Объект (данные передаются из кода BSL в виде таблицы значений), фильтрацию можно выполнить еще до вызова компоновщика.
Рассмотрим пример кода на языке 1С для удаления лишних строк перед формированием отчета:
Индекс = ТаблицаДанных.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаТаблицы = ТаблицаДанных[Индекс];
Если СтрокаТаблицы.Поле1 = СтрокаТаблицы.Поле2 Тогда
ТаблицаДанных.Удалить(СтрокаТаблицы);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Если строка должна быть скрыта визуально, но её показатели обязательно должны войти в общие итоги и ресурсы отчета, стандартный отбор не подходит. В такой ситуации разберем применение механизмов оформления:
Поле1 Равно Поле2.Таким образом, строки визуально не сливаются с остальными данными, но итоговые суммы по отчету рассчитываются корректно с учетом всех записей.