Как использовать поля структуры в наборе данных СКД для отборов и группировок?

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

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

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

Почему СКД не «видит» структуру?

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

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

Решение 1: Декомпозиция данных (рекомендуемый подход)

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

Рассмотрим пример того, как правильно подготовить таблицу:


// В коде, где вы формируете таблицу значений для СКД:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КлиентНаименование", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("КлиентКод", Новый ОписаниеТипов("Число"));

// Заполняем данными из структуры
Для Каждого Элемент Из СписокКлиентов Цикл
    НоваяСтрока = ТЗ.Добавить();
    НоваяСтрока.КлиентНаименование = Элемент.Клиент.Наименование;
    НоваяСтрока.КлиентКод = Элемент.Клиент.Код;
КонецЦикла;

После такой подготовки СКД автоматически распознает КлиентНаименование и КлиентКод как отдельные поля. Вы сможете использовать их в Отборах, Группировках и Выбранных полях без каких-либо ограничений.

Решение 2: Использование ссылочных типов

Если данные, которые вы передаете, по своей сути являются элементами справочника, постарайтесь передавать в ТаблицуЗначений не Структуру, а непосредственно Ссылку на этот справочник. Если поле в ТаблицеЗначений имеет тип СправочникСсылка.Контрагенты, то СКД автоматически предоставит доступ ко всем реквизитам через «плюсик» в списке полей.

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

  1. Отсутствие необходимости «разбирать» данные вручную.
  2. Поддержка всех возможностей СКД по работе со ссылками.
  3. Интуитивно понятный интерфейс для пользователей в режиме Настройки.

Решение 3: Вычисляемые поля для вывода информации

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

Пример функции в модуле:


Функция ПолучитьЗначениеИзСтруктуры(ДанныеСтруктура, ИмяКлюча) Экспорт
    Если ТипЗнч(ДанныеСтруктура) = Тип("Структура") И ДанныеСтруктура.Свойство(ИмяКлюча) Тогда
        Возврат ДанныеСтруктура[ИмяКлюча];
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

В настройках СКД для вычисляемого поля НаименованиеКлиента вы указываете выражение ПолучитьЗначениеИзСтруктуры(Клиент, "Наименование"). Повторимся: это позволит только отобразить значение, но не позволит полноценно фильтровать по нему отчет через панель настроек СКД, так как система не считает это поле физическим полем источника данных.

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

← На главную