← Назад к вопросам

Опиши алгоритм вывода таблицы значений в отчет СКД

2.0 Middle🔥 131 комментариев
#СКД и отчёты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Алгоритм вывода таблицы значений в отчёт СКД

Понятие СКД и её архитектура

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

  1. Макет СКД — схема данных (определяется в конфигураторе)
  2. Алгоритм компоновки — выполняется при получении данных

Вывод ТаблицаЗначений в отчёт СКД требует преобразования таблицы в набор данных, который СКД сможет обработать.

Шаг 1: Получение макета СКД

// Получаем макет СКД из отчёта
МакетСКД = Отчеты.МойОтчет.ПолучитьМакет("МакетСКД");

// или просто:
Макет = Отчеты.МойОтчет.МакетСКД;  // если макет одноимённый

Макет содержит:

  • Наборы данных с источниками (запросы, константы)
  • Поля наборов данных (колонки результата)
  • Параметры для фильтрации
  • Вычисляемые поля

Шаг 2: Создание объекта компоновщика

// Компоновщик обрабатывает макет
Компоновщик = Новый КомпоновщикДанных;

// Инициализируем его макетом
Компоновщик.ИнициализироватьИзМакета(МакетСКД);

Компоновщик отвечает за:

  • Управление источниками данных
  • Выполнение запросов
  • Применение фильтров
  • Группировку и сортировку

Шаг 3: Замена источника данных на ТаблицаЗначений

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

// Создаём нашу ТаблицаЗначений
МояТаблица = Новая ТаблицаЗначений;
МояТаблица.Колонки.Добавить("Товар");
МояТаблица.Колонки.Добавить("Количество");
МояТаблица.Колонки.Добавить("Сумма");

// Заполняем строки
Строка = МояТаблица.Добавить();
Строка.Товар = "Товар 1";
Строка.Количество = 100;
Строка.Сумма = 10000;

// Заменяем источник данных
ИсточникДанных = Компоновщик.ИсточникиДанных.Элементы[0];
ИсточникДанных.ДатаИсточник = МояТаблица;

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

Шаг 4: Установка параметров и макета компоновки

// Установим параметры (если они в макете)
ПараметрыКомпоновки = Новый ПараметрыКомпоновкиДанных;

// Передаём параметры в компоновщик
Компоновщик.УстановитьПараметр("ПериодНачало", НачалоПериода);
Компоновщик.УстановитьПараметр("ПериодКонец", КонецПериода);

// Получаем макет компоновки (структуру отчёта)
МакетКомпоновки = Компоновщик.ПолучитьМакетКомпоновки();

Шаг 5: Выполнение компоновки и получение результата

// Создаём процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

// Выполняем компоновку
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

// Выходной документ (для вывода)
Документ = Новый ТабличныйДокумент;

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

Шаг 6: Получение результата для отображения

// Готовый документ можно:

// 1. Показать пользователю
СПредставлением.ОткрытьЗначение(Документ);

// 2. Сохранить в файл
Документ.ЗаписатьВФайл("C:\\Отчет.xlsx", ФорматТабличногоДокумента.Excel97);

// 3. Передать на печать
Документ.ПоказатьВаrиант(ВариантПечати.ТекущийВариант, ВариантПечати.ОктябрьМДП);

Полный пример: от А до Я

Процедура ВывестиОтчет()
    // 1. Подготавливаем ТаблицаЗначений
    МояТаблица = Новая ТаблицаЗначений;
    МояТаблица.Колонки.Добавить("Товар");
    МояТаблица.Колонки.Добавить("Количество");
    МояТаблица.Колонки.Добавить("Сумма");
    
    СтрокаТаблицы = МояТаблица.Добавить();
    СтрокаТаблицы.Товар = "Помидоры";
    СтрокаТаблицы.Количество = 100;
    СтрокаТаблицы.Сумма = 5000;
    
    СтрокаТаблицы = МояТаблица.Добавить();
    СтрокаТаблицы.Товар = "Огурцы";
    СтрокаТаблицы.Количество = 200;
    СтрокаТаблицы.Сумма = 4000;
    
    // 2. Инициализируем компоновщик
    МакетСКД = Отчеты.МойОтчет.ПолучитьМакет("МакетСКД");
    Компоновщик = Новый КомпоновщикДанных;
    Компоновщик.ИнициализироватьИзМакета(МакетСКД);
    
    // 3. Заменяем источник данных
    ИсточникДанных = Компоновщик.ИсточникиДанных.Элементы[0];
    ИсточникДанных.ДатаИсточник = МояТаблица;
    
    // 4. Получаем макет компоновки
    МакетКомпоновки = Компоновщик.ПолучитьМакетКомпоновки();
    
    // 5. Выполняем компоновку
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // 6. Выводим результат
    Документ = Новый ТабличныйДокумент;
    ПроцессорКомпоновки.ВывестьВТабличныйДокумент(Документ);
    
    // 7. Показываем результат
    СПредставлением.ОткрытьЗначение(Документ);
КонецПроцедуры

Ключевые свойства при замене источника

// Свойства ИсточникаДанныхОтчета:
Источник.ДатаИсточник        // Сама таблица
Источник.Имя                   // Имя в макете (например, "НаборДанных1")
Источник.ТипИсточника         // тип: запрос, таблица, поле, константа

// Проверка типа:
Если ИсточникДанных.ТипИсточника = ТипИсточникаДанныхОтчета.Таблица Тогда
    ИсточникДанных.ДатаИсточник = МояТаблица;
КонецЕсли;

Частые ошибки

// ❌ Неправильно: не совпадают колонки
МояТаблица.Колонки.Добавить("Наимено");  // опечатка
// Макет ожидает "Наименование"

// ✅ Правильно: колонки совпадают с макетом
МояТаблица.Колонки.Добавить("Наименование");

// ❌ Неправильно: пустая таблица
// Компоновщик выведет пустой отчёт

// ✅ Правильно: таблица заполнена данными

Итог

Алгоритм в 6 шагов:

  1. Подготовить ТаблицаЗначений с нужной структурой
  2. Инициализировать КомпоновщикДанных из макета СКД
  3. Заменить источник данных на нашу таблицу
  4. Получить МакетКомпоновки
  5. Выполнить компоновку через ПроцессорКомпоновкиДанных
  6. Вывести результат в ТабличныйДокумент

Этот подход позволяет использовать мощь СКД (группировки, фильтры, форматирование) с готовыми данными из памяти приложения.

Опиши алгоритм вывода таблицы значений в отчет СКД | PrepBro