Как в СКД отфильтровать строки, если вычисляемое поле возвращает пустой массив?

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

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

Способ №1: Использование «Неопределено» для стандартного отбора

Самый простой и элегантный способ решить задачу — изменить логику возвращаемого значения в вашем общем модуле. Вместо того чтобы возвращать пустой массив, настройте функцию так, чтобы она возвращала Неопределено в случаях, когда данных для вывода нет.

Почему это работает:

Система компоновки данных 1С отлично распознает значение Неопределено. Если ваше вычисляемое поле возвращает это значение, вы сможете воспользоваться стандартным условием отбора «Не заполнено» в настройках отчета. Это избавляет от необходимости усложнять структуру СКД.

Пошаговая реализация:

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

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

Способ №2: Создание вспомогательного поля для количества

Если логика вашей задачи требует работы именно с массивом (например, для вывода данных в ячейку), но при этом необходимо фильтровать строки по наличию элементов, рекомендуем использовать вспомогательное вычисляемое поле. Мы выносим расчет количества элементов в отдельное поле числового типа.

Разбор реализации:

Создайте вторую функцию в общем модуле, которая будет принимать на вход ваш объект и возвращать не массив, а число:


Функция ПолучитьКоличествоСвойств(Объект) Экспорт
    МассивСвойств = ОбщийМодуль.ПолучитьСвойства(Объект);
    Возврат МассивСвойств.Количество();
КонецФункции

Теперь в СКД, помимо поля с самим массивом, добавьте вычисляемое поле КоличествоСвойств. Теперь в настройках отбора вы сможете указать условие:

КоличествоСвойств равно 0

Преимущества этого метода:

Архитектурный подход: использование характеристик

Если задача сводится к выводу свойств или характеристик номенклатуры, товаров или других объектов, целесообразно рассмотреть использование встроенного механизма «Характеристики» в СКД. Вместо написания собственных функций в общих модулях, вы можете настроить СКД так, чтобы она сама связывала данные.

Использование характеристик позволит системе самостоятельно определять, есть у объекта свойства или нет. В этом случае задача фильтрации решается «из коробки» стандартными средствами отбора СКД, а вы избавляетесь от необходимости поддержки сложного программного кода.

Итоги и рекомендации

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

  1. Всегда старайтесь нормализовать данные: если функция не нашла данных, возвращайте Неопределено, а не пустую коллекцию.
  2. Если нужно фильтровать по наличию элементов, лучше создать дополнительное числовое поле — это самый надежный способ с точки зрения производительности.
  3. Избегайте сложных сравнений типов внутри выражений СКД, так как язык выражений ограничен по сравнению с полноценным кодом 1С.

Применяя эти методы, вы сделаете свои отчеты на базе СКД более гибкими, производительными и простыми в обслуживании.

← На главную