Как полностью программно создать отчет на СКД без использования конструктора

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

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

Основные этапы программного построения отчета

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

Важно понимать: Схема компоновки данных — это описание структуры (что и откуда берем), а Настройки компоновки — это описание визуализации (как группируем и выводим).

Шаг 1. Инициализация схемы и источника данных

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


Схема = Новый СхемаКомпоновкиДанных;

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

Проанализируем этот момент: без источника данных система не сможет сопоставить наборы данных с СУБД, что приведет к ошибке при попытке компоновки макета.

Шаг 2. Создание набора данных и написание запроса

Теперь добавим НаборДанныхЗапросКомпоновкиДанных. Это сердце нашего отчета, где определяется текст запроса. Обратите внимание, что программно добавленные поля в наборе данных должны соответствовать полям в тексте запроса.


НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.Запрос = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Товар,
    |   Номенклатура.Код КАК Код,
    |   Остатки.ВНаличииОстаток КАК Остаток
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остаток
    |   ПО Номенклатура.Ссылка = Остаток.Номенклатура";

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


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

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

Шаг 3. Настройка ресурсов (итогов)

Если мы хотим, чтобы числовые данные суммировались в иерархии отчета, необходимо добавить их в коллекцию ПоляИтога. Выясним, как это сделать программно. Мы укажем выражение, по которому будут рассчитываться итоги.


Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = "Остаток";
Ресурс.Выражение = "Сумма(Остаток)";

Шаг 4. Программная настройка структуры отчета

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


Настройки = Схема.НастройкиПоУмолчанию;

// 1. Выбранные поля
ВыбранноеПолеТовар = Настройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеТовар.Поле = Новый ПолеКомпоновкиДанных("Товар");

ВыбранноеПолеОстаток = Настройки.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеОстаток.Поле = Новый ПолеКомпоновкиДанных("Остаток");

// 2. Создание группировки
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группировка.Использование = Истина;

// Добавляем поле группировки
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Использование = Истина;
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Товар");

// Чтобы в группировке выводились выбранные выше поля, добавим АвтоПоле
АвтоПоле = Группировка.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Поле = Новый ПолеКомпоновкиДанных("Авто");

Шаг 5. Компоновка и вывод результата

Заключительный этап — превращение описанной схемы и настроек в реальный табличный документ. Проанализируем стандартную цепочку вывода: КомпоновщикМакета -> ПроцессорКомпоновки -> ПроцессорВывода.


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

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

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

ТабДок.Показать();

Полезные инструменты для разработчика

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

  1. Обработка ConvertSKD: Это мощный инструмент, который позволяет взять готовую схему, созданную в конструкторе (XML), и автоматически сгенерировать программный код на языке 1С, полностью повторяющий эту схему. Это лучший способ научиться программному созданию СКД — достаточно посмотреть, как инструмент описывает те или иные элементы.
  2. Глобальный поиск в конфигураторе: Разберем отличный лайфхак. Если вам нужен пример реализации сложной настройки (например, программное создание условного оформления), откройте любую типовую конфигурацию (БП, УТ, ERP) и выполните поиск по строке Новый СхемаКомпоновкиДанных. Вы найдете десятки примеров от разработчиков фирмы "1С", где отчеты собираются динамически.
  3. Отладка через сериализацию: Если ваш программный отчет работает не так, как ожидалось, вы можете выгрузить созданную схему в XML файл:
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Схема);
    ТекстXML = ЗаписьXML.Закрыть();
    
    Полученный текст можно вставить в консоль СКД и увидеть ошибки структуры в визуальном редакторе.

Использование Библиотеки стандартных подсистем (БСП)

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

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

← На главную