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