Как сравнить два поля в отчете 1С и скрыть строку при их равенстве?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Выясним причину возможных ошибок при сравнении

Перед тем как переходить к настройке отборов, проанализируем нюансы, из-за которых сравнение в отчете может работать некорректно:

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

Способ 1. Вычисление разности и отбор в СКД (Основное решение)

Рассмотрим наилучший практический подход, при котором в запрос или вычисляемые поля добавляется числовая разница между сравниваемыми показателями.

Разберем по шагам порядок настройки:

  1. В запросе набора данных или на вкладке Вычисляемые поля создадим поле разности с защитой от пустых значений: ЕСТЬNULL(Поле1, 0) - ЕСТЬNULL(Поле2, 0)
  2. Перейдем на вкладку Настройки компоновки данных.
  3. В левой части окна выберем элемент структуры Детальные записи (или нужную группировку).
  4. На вкладке Отбор добавим новое условие: созданное поле разности Не равно 0.

Благодаря этому условию из отчета будут исключены все строки, в которых значения Поле1 и Поле2 совпадают.

Способ 2. Использование логического выражения в запросе

Если требуется сформировать флаг совпадения прямо в тексте запроса, проанализируем следующий вариант с конструкцией ВЫБОР:


ВЫБОР
	КОГДА ЕСТЬNULL(ТаблицаЗадолженностей.НашДолгВВалютеОтчета, 0) = ЕСТЬNULL(ТаблицаЗадолженностей.ДолгПоставщикаВВалютеОтчета, 0)
		ТОГДА ИСТИНА
	ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ПоляРавны

После добавления этого поля в набор данных переходим в настройки отчета и устанавливаем отбор: ПоляРавны Равно ЛОЖЬ.

Способ 3. Предварительная фильтрация для набора данных — объект

Если отчет строится на базе типа Набор данных - Объект (данные передаются из кода BSL в виде таблицы значений), фильтрацию можно выполнить еще до вызова компоновщика.

Рассмотрим пример кода на языке 1С для удаления лишних строк перед формированием отчета:


Индекс = ТаблицаДанных.Количество() - 1;
Пока Индекс >= 0 Цикл
	СтрокаТаблицы = ТаблицаДанных[Индекс];
	Если СтрокаТаблицы.Поле1 = СтрокаТаблицы.Поле2 Тогда
		ТаблицаДанных.Удалить(СтрокаТаблицы);
	КонецЕсли;
	Индекс = Индекс - 1;
КонецЦикла;

Способ 4. Сохранение строк в итогах с помощью Условного оформления

Если строка должна быть скрыта визуально, но её показатели обязательно должны войти в общие итоги и ресурсы отчета, стандартный отбор не подходит. В такой ситуации разберем применение механизмов оформления:

  1. В настройках отчета откроем вкладку Условное оформление.
  2. Добавим новое оформление и укажем цвет текста, совпадающий с цветом фона (например, белый).
  3. В качестве условия установим равенство полей: Поле1 Равно Поле2.

Таким образом, строки визуально не сливаются с остальными данными, но итоговые суммы по отчету рассчитываются корректно с учетом всех записей.

← На главную