При разработке отчетов в 1С, работающих с произвольными данными в памяти (например, с ТаблицейЗначений), многие разработчики сталкиваются с ограничением стандартного объекта ПостроительОтчета. Основная проблема заключается в том, что при передаче такой таблицы в ОписаниеИсточникаДанных, поля ссылочного типа (например, Номенклатура или Склад) перестают «раскрываться». Это означает, что пользователь не может выбрать реквизиты этих справочников в отборах или группировках, так как система «не видит» их структуру.
Рассмотрим, почему это происходит и как правильно решить эту задачу с помощью современного механизма — Системы Компоновки Данных (СКД).
Объект ПостроительОтчета является устаревшим инструментом. Он отлично справляется с простыми запросами к базе данных, но при работе с клиентскими источниками (таблицами, сформированными кодом), он теряет информацию о типах данных. Поскольку метаданные ссылочного поля не передаются автоматически в построитель, система не может предоставить доступ к полям через точку, например, Номенклатура.Артикул.
Чтобы обеспечить полноценную работу с отборами и реквизитами, необходимо использовать СКД. Главная ошибка при этом — попытка просто «загнать» таблицу в отчет без предварительной настройки метаданных. Чтобы поля раскрывались, нам нужно явно объяснить системе, какие типы данных содержатся в колонках нашей таблицы.
Разберем процесс настройки программного формирования схемы компоновки данных. Главным ключом к успеху является явное указание свойства ТипЗначения для каждого поля набора данных.
СхемаКомпоновкиДанных и добавляем в него источник данных с типом Local.НаборДанныхОбъектСхемыКомпоновкиДанных. Именно в него мы будем передавать нашу таблицу значений.ТипЗначения соответствующий тип из колонки таблицы значений. Если этого не сделать, СКД воспримет данные как Строка или Неопределено.Посмотрим на пример кода, который решает эту задачу:
// Предположим, у нас есть заполненная таблица значений "тб"
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.ИмяОбъекта = "тб"; // Имя, по которому мы передадим данные позже
НаборДанных.ИсточникДанных = "ИсточникДанных1";
Для каждого Колонка Из тб.Колонки Цикл
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Поле = Колонка.Имя;
ПолеНабора.ПутьКДанным = Колонка.Имя;
ПолеНабора.ТипЗначения = Колонка.ТипЗначения; // Здесь происходит магия типизации
КонецЦикла;
После того как схема описана, нам необходимо связать ее с КомпоновщикомНастроек, который обычно вынесен на форму. Это позволит пользователю полноценно пользоваться панелью отборов.
Далее мы выполняем инициализацию процессора компоновки. Важно помнить, что в ПроцессорКомпоновкиДанных мы передаем структуру, где ключ совпадает со свойством ИмяОбъекта в наборе данных (в нашем примере это "тб").
// Загружаем настройки и инициализируем компоновщик
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
// Формируем макет
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки);
// Передаем реальные данные
ВнешниеНаборы = Новый Структура("тб", тб);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
// Выводим в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Итак, чтобы избавиться от ограничений, с которыми мы столкнулись в ПостроителеОтчета, используем СКД. Основные моменты, которые мы выяснили:
ТипЗначения, СКД не сможет интерпретировать данные как объект 1С (ссылку) и, соответственно, не сможет раскрыть его реквизиты.СхемеКомпоновкиДанных, а сами данные (ТаблицаЗначений) передаются только на этапе выполнения в ПроцессорКомпоновкиДанных.КомпоновщикаНастроек в качестве реквизита формы позволяет пользователю работать со стандартными отборами, которые теперь будут корректно отображать все доступные реквизиты благодаря нашей предварительной типизации.Теперь, при настройке отбора на форме, при выборе ссылочного поля, система автоматически предложит раскрывающийся список доступных реквизитов, что значительно упростит работу конечных пользователей с отчетом.