← Назад к вопросам
Опиши алгоритм вывода таблицы значений в отчет СКД
2.0 Middle🔥 131 комментариев
#СКД и отчёты
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Алгоритм вывода таблицы значений в отчёт СКД
Понятие СКД и её архитектура
СКД (Система Компоновки Данных) — это встроенный в 1С механизм для создания отчётов с поддержкой группировок, сортировки, фильтров и форматирования. СКД состоит из двух частей:
- Макет СКД — схема данных (определяется в конфигураторе)
- Алгоритм компоновки — выполняется при получении данных
Вывод ТаблицаЗначений в отчёт СКД требует преобразования таблицы в набор данных, который СКД сможет обработать.
Шаг 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 шагов:
- Подготовить ТаблицаЗначений с нужной структурой
- Инициализировать КомпоновщикДанных из макета СКД
- Заменить источник данных на нашу таблицу
- Получить МакетКомпоновки
- Выполнить компоновку через ПроцессорКомпоновкиДанных
- Вывести результат в ТабличныйДокумент
Этот подход позволяет использовать мощь СКД (группировки, фильтры, форматирование) с готовыми данными из памяти приложения.