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

Какие наборы данных можно использовать в СКД?

2.3 Middle🔥 181 комментариев
#Объекты метаданных#СКД и отчёты

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

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

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

Наборы данных в СКД (Система компоновки данных)

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

Что такое набор данных в СКД

Набор данных — это источник информации для отчёта. Это не сами данные, а описание того, как их получить. СКД использует наборы для построения отчёта на основе данных из БД или других источников.

Каждый набор содержит:

  • Описание источника данных
  • Список полей (реквизиты, ресурсы)
  • Фильтры и условия

Основные типы наборов данных

1. Запрос

Назначение: Получение данных через SQL-запрос.

Как использовать: Самый мощный и гибкий способ получения данных.

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

Достоинства:

  • Полная гибкость в формировании данных
  • Возможность любых JOINов и условий
  • Оптимизированное выполнение на БД

Недостатки:

  • Требует знания SQL
  • Сложнее для новичков

2. Таблица (Table)

Назначение: Получение данных из справочника или документа напрямую.

Как использовать: Простой способ получить данные из объекта конфигурации.

// Использование таблицы в СКД
// Прямой доступ к справочнику

НаборДанных = Новый НаборДанных();
НаборДанных.ИспользоватьДанные = "Справочник.Товары";

// Поля берутся автоматически из метаданных
// - Ссылка
// - Наименование
// - КодВраче
// - Описание
// и т.д.

Достоинства:

  • Просто в использовании
  • Автоматический доступ к реквизитам

Недостатки:

  • Ограниченная гибкость
  • Нельзя делать сложные фильтры

3. Визуальный конструктор запросов

Назначение: Создание запроса без написания SQL вручную.

Как использовать: В Designer'е можно визуально выбирать таблицы, поля, условия.

// Эквивалент визуального конструктора

НаборДанных = Новый НаборДанных();

// Выбираем таблицу
Таблица = НаборДанных.ДобавитьТаблицу("Справочник.Товары", "Товары");

// Добавляем поля
НаборДанных.ДобавитьПоле(Таблица, "Ссылка", "Товар");
НаборДанных.ДобавитьПоле(Таблица, "Наименование", "НаименованиеТовара");

// Добавляем условие
Условие = НаборДанных.ДобавитьУсловие();
Условие.Левая = Новый ПолеКомпоновкиДанных("Наименование");
Условие.ОператорСравнения = ОператорСравненияКомпоновкиДанных.Содержит;
Условие.Правая = Новый ПараметрКомпоновкиДанных("ПоискВсё");

4. Встроенный набор данных

Назначение: Использование готового набора данных из конфигурации.

Как использовать: Ссылка на заранее определённый набор данных.

// В СКД можно ссылаться на другой набор данных
// как на подчиненный источник данных

ИспользованиеЭтой = 
    "ДанныеОтчёта" // Имя другого набора данных

5. Программный набор данных

Назначение: Полностью программное создание данных в обработчиках.

// Создание данных вручную в обработчике
Процедура ПриКомпоновкеРезультата(ПараметрыКомпоновки, РезультатКомпоновки)
    
    // Вручную создаём таблицу результатов
    ТаблицаДанных = Новая ТаблицаЗначений();
    ТаблицаДанных.Колонки.Добавить("Товар");
    ТаблицаДанных.Колонки.Добавить("Количество");
    ТаблицаДанных.Колонки.Добавить("Сумма");
    
    // Заполняем данные
    Для Каждого Товар Из ПолучитьТовары() Цикл
        СтрокаДанных = ТаблицаДанных.Добавить();
        СтрокаДанных.Товар = Товар.Наименование;
        СтрокаДанных.Количество = Товар.Остаток;
        СтрокаДанных.Сумма = Товар.СтоимостьОстатка;
    КонецЦикла;
    
    // Используем в компоновке
    КомпоновщикДанных = Новый КомпоновщикДанных();
    КомпоновщикДанных.ИсходныеДанные = ТаблицаДанных;
    
КонецПроцедуры

6. Виртуальная таблица регистра

Назначение: Использование виртуальных таблиц регистров накопления.

// Прямое использование виртуальной таблицы

НаборДанных.Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    Остатки.Товар,
    |    Остатки.Склад,
    |    СУММА(Остатки.Количество) КАК ОстатокКоличество
    |ИЗ
    |    РегистрНакопления.ОстаткиТоваров.Остатки(&ДатаНа) КАС Остатки
    |СГРУППИРОВАТЬ ПО
    |    Остатки.Товар,
    |    Остатки.Склад
");

7. Объединённый набор данных

Назначение: Объединение нескольких наборов данных в один.

// Объединение данных из разных источников
НаборДанных1 = ...  // Первый источник
НаборДанных2 = ...  // Второй источник

// В СКД настроить UNION
Запрос = Новый Запрос(
    "ВЫБРАТЬ Товар, Количество ИЗ Таблица1
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ Товар, Количество ИЗ Таблица2
");

Поля в наборе данных

Типы полей:

  1. Реквизит (Dimension) — измерение для группировки
Поле = НаборДанных.ДобавитьПоле(Таблица, "Товар");
Поле.ТипПоля = ТипПоляКомпоновкиДанных.Измерение;
Поле.ТипЗначения = Новый ОписаниеТипов("Ссылка.Товары");
  1. Ресурс (Measure) — значение для расчёта
Поле = НаборДанных.ДобавитьПоле(Таблица, "Количество");
Поле.ТипПоля = ТипПоляКомпоновкиДанных.Ресурс;
Поле.ФункцияАгрегирования = ФункцияАгрегирования.Сумма;
  1. Атрибут (Attribute) — дополнительные данные
Поле = НаборДанных.ДобавитьПоле(Таблица, "Описание");
Поле.ТипПоля = ТипПоляКомпоновкиДанных.Атрибут;

Практический пример

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

Рекомендации

Выбор типа набора данных:

СценарийТип набораПричина
Простой отчёт по справочникуТаблицаПросто и быстро
Сложная аналитикаЗапросГибкость и мощь
Расчёты вручнуюПрограммныйПолный контроль
Объединение источниковОбъединённыйУдобство

Оптимизация:

  • Используйте индексы в регистрах
  • Минимизируйте количество JOIN'ов
  • Добавляйте условия в WHERE, а не в СКД
  • Кэшируйте часто используемые данные

Заключение

Наборы данных в СКД — это гибкий и мощный механизм для получения информации:

  • Запрос — для максимальной гибкости
  • Таблица — для простоты
  • Программный — для расчётов

Правильный выбор набора данных критичен для производительности и простоты поддержки отчётов.

Какие наборы данных можно использовать в СКД? | PrepBro