Почему в отчете на основе таблицы значений не раскрываются реквизиты ссылочных полей и как это исправить?

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

При разработке отчетов в 1С, работающих с произвольными данными в памяти (например, с ТаблицейЗначений), многие разработчики сталкиваются с ограничением стандартного объекта ПостроительОтчета. Основная проблема заключается в том, что при передаче такой таблицы в ОписаниеИсточникаДанных, поля ссылочного типа (например, Номенклатура или Склад) перестают «раскрываться». Это означает, что пользователь не может выбрать реквизиты этих справочников в отборах или группировках, так как система «не видит» их структуру.

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

Почему Построитель отчета не подходит для сложных структур?

Объект ПостроительОтчета является устаревшим инструментом. Он отлично справляется с простыми запросами к базе данных, но при работе с клиентскими источниками (таблицами, сформированными кодом), он теряет информацию о типах данных. Поскольку метаданные ссылочного поля не передаются автоматически в построитель, система не может предоставить доступ к полям через точку, например, Номенклатура.Артикул.

Переход на Систему Компоновки Данных (СКД)

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

Пошаговое руководство по типизации данных в СКД

Разберем процесс настройки программного формирования схемы компоновки данных. Главным ключом к успеху является явное указание свойства ТипЗначения для каждого поля набора данных.

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

Посмотрим на пример кода, который решает эту задачу:


// Предположим, у нас есть заполненная таблица значений "тб"
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";

НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.ИмяОбъекта = "тб"; // Имя, по которому мы передадим данные позже
НаборДанных.ИсточникДанных = "ИсточникДанных1";

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

Инициализация компоновщика и вывод результата

После того как схема описана, нам необходимо связать ее с КомпоновщикомНастроек, который обычно вынесен на форму. Это позволит пользователю полноценно пользоваться панелью отборов.

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


// Загружаем настройки и инициализируем компоновщик
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

// Формируем макет
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки);

// Передаем реальные данные
ВнешниеНаборы = Новый Структура("тб", тб);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);

// Выводим в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Ключевые выводы

Итак, чтобы избавиться от ограничений, с которыми мы столкнулись в ПостроителеОтчета, используем СКД. Основные моменты, которые мы выяснили:

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

← На главную