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

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

1. Подготовка расширения: что нужно сделать до интеграции СКД

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

Во-первых, проверьте версию платформы 1С. СКД активно развивается, и некоторые функции (например, Иерархические группы или Динамические списки) могут отсутствовать в устаревших версиях. Минимально рекомендуемая версия для полноценной работы с СКД в расширениях — 8.3.20 и выше. Если вы работаете с более ранними релизами, часть функционала может быть недоступна.

  • 🔧 Обновите конфигурацию до актуальной версии платформы (через Конфигуратор → Администрирование → Обновление конфигурации).
  • 📋 Создайте резервную копию основной базы и расширения (через Администрирование → Выгрузить информационную базу).
  • 🔍 Проверьте права доступа к объектам, которые будут использоваться в СКД (через Администрирование → Пользователи и права).
  • 🛠️ Установите расширение в режим редактирования (если оно ещё не подключено к базе).

Особое внимание уделите внешним источникам данных. Если ваша схема компоновки будет обращаться к данным из основной конфигурации (например, к справочникам или документам), эти объекты должны быть доступны для чтения из расширения. В противном случае вы получите ошибку вида "Объект не найден (ИмяОбъекта)" при попытке выполнить отчет.

💡

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

2. Способы добавления СКД в расширение: сравнение подходов

Существует два основных способа интеграции системы компоновки данных в расширение . Каждый из них имеет свои преимущества и ограничения. Выбор зависит от задачи, сложности отчета и требований к гибкости.

Первый способ — создание внешнего отчета с СКД. Этот метод подходит, если вам нужно быстро добавить отчет без глубоких изменений в расширении. Внешний отчет хранится в отдельном файле (.erf или .epf) и подключается к расширению через механизм ВнешниеОтчетыИОбработки. Преимущество — простота обновления (достаточно заменить файл), недостаток — ограниченная интеграция с бизнес-логикой расширения.

Второй способ — создание схемы компоновки данных непосредственно в расширении. Здесь схема хранится внутри объекта расширения (например, в Отчете или Обработке) и имеет полный доступ к его методам и данным. Этот подход сложнее в реализации, но даёт больше возможностей для кастомизации. Например, вы можете динамически менять параметры СКД в зависимости от прав пользователя или текущих настроек системы.

Критерий Внешний отчет с СКД СКД в объекте расширения
Сложность интеграции Низкая Средняя/Высокая
Гибкость настройки Ограниченная Высокая
Обновление отчета Замена файла Изменение кода расширения
Доступ к данным расширения Ограниченный Полный
Производительность Выше (кеширование) Зависит от реализации

Какой способ выбрать? Если вам нужен простой отчет с минимальными доработками (например, выгрузка данных в Excel по стандартной схеме), подойдёт внешний отчет. Если же требуется сложная логика (динамические параметры, интеграция с другими объектами расширения, кастомизированное оформление), лучше создавать СКД внутри расширения.

📊 Какой способ интеграции СКД вы используете чаще?
Внешние отчеты
СКД в объектах расширения
Оба варианта
Ещё не работал с СКД

3. Пошаговая инструкция: добавление СКД через внешний отчет

Рассмотрим процесс добавления системы компоновки данных через внешний отчет. Этот метод подходит для большинства типовых задач и требует минимальных изменений в основной конфигурации.

Шаг 1: Создайте внешний отчет в Конфигураторе. Для этого перейдите в Файл → Новый → Внешний отчет. В открывшемся окне укажите имя отчета (например, "ОтчетПоПродажамСКД") и добавьте схему компоновки данных через конструктор (Добавить → Схема компоновки данных).

Шаг 2: Настройте источник данных. В конструкторе СКД перейдите на вкладку "Наборы данных" и добавьте новый набор. Здесь можно использовать:

  • 📊 Запрос — если данные берутся из базы (например, ВЫБРАТЬ ... ИЗ Документ.РеализацияТоваровУслуг).
  • 🔄 Объект — если источник — справочник или документ (например, Справочник.Номенклатура).
  • 📎 Объединение наборов — если нужно совместить данные из нескольких источников.

Шаг 3: Определите структуру отчета. На вкладке "Настройки" настройте:

  • 📌 Группировки (по датам, контрагентам, номенклатуре).
  • 📈 Поля вывода (какие данные показывать в колонках).
  • 🎨 Условное оформление (например, подсветка отрицательных остатков красным).

Шаг 4: Сохраните отчет в файл (.erf) и подключите его к расширению. Для этого в расширении создайте объект ВнешниеОтчетыИОбработки и добавьте ссылку на файл. Пример кода для подключения:

Процедура ПодключитьВнешнийОтчет()

ВнешниеОтчеты = Новый Массив();

ВнешниеОтчеты.Добавить(Новый ВнешнийОтчет("ОтчетПоПродажамСКД", Новый Файл("C:\Отчеты\ОтчетПоПродажамСКД.erf")));

ВнешниеОтчетыИОбработки.ДобавитьВнешниеОтчеты(ВнешниеОтчеты);

КонецПроцедуры

Шаг 5: Протестируйте отчет в пользовательском режиме. Убедитесь, что:

  • 🔹 Данные загружаются без ошибок.
  • 🔹 Параметры отчета (если есть) корректно передаются.
  • 🔹 Оформление соответствует ожидаемому (шрифты, цвета, выравнивание).

☑️ Проверка внешнего отчета с СКД

Выполнено: 0 / 5

Важно: если внешний отчет использует данные из основной конфигурации, убедитесь, что в расширении подключены все необходимые подсистемы. Например, для работы с документами РеализацияТоваровУслуг должна быть активна подсистема Продажи.

4. Создание СКД внутри расширения: разбор на примере

Если внешний отчет не подходит (например, из-за необходимости динамической настройки параметров), можно создать схему компоновки данных непосредственно в объекте расширения. Рассмотрим процесс на примере добавления СКД в Отчет расширения.

Шаг 1: Создайте новый отчет в расширении. Для этого в Конфигураторе перейдите в ветку Объекты → Отчеты и добавьте новый элемент. Укажите имя (например, "АнализЗапасовСКД") и тип "Отчет".

Шаг 2: Добавьте схему компоновки данных. В свойствах отчета нажмите "Добавить → Схема компоновки данных". Откроется конструктор СКД, где нужно:

  • 📊 Создать набор данных (например, на основе запроса к регистру ТоварыНаСкладах).
  • 🔧 Настроить параметры (период анализа, склад, номенклатурная группа).
  • 📈 Определить структуру вывода (группировки по складам, сортировка по остаткам).

Шаг 3: Напишите код для динамической настройки СКД. Например, если нужно менять доступные склады в зависимости от прав пользователя, добавьте следующий код в модуль отчета:

Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)

// Получаем текущего пользователя

ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

// Ограничиваем список складов по ролям

Если ТекущийПользователь.Роли.Найти("РольСкладскогоМенеджера") <> Неопределено Тогда

СкладыДоступные = Справочники.Склады.Выбрать();

Иначе

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

КонецЕсли;

// Передаем ограничение в СКД

КомпоновщикМакета.Параметры.УстановитьЗначениеПараметра("Склады", СкладыДоступные);

КонецПроцедуры

Шаг 4: Настройте форму отчета. В свойствах отчета укажите "Основная форма" и добавьте элементы управления для взаимодействия с пользователем (кнопки, поля ввода параметров). Например:

// Пример кода для формы отчета

&НаКлиенте

Процедура ПериодНачалоПриИзменении(Элемент)

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

КонецПроцедуры

Шаг 5: Протестируйте отчет в пользовательском режиме. Обратите внимание на:

  • 🔹 Корректность передачи параметров из формы в СКД.
  • 🔹 Производительность при больших объёмах данных (используйте Индексированные запросы).
  • 🔹 Совместимость с другими объектами расширения (например, если отчет используется в обработке).

Как ускорить работу СКД в расширении?

Для оптимизации производительности используйте следующие приемы:

1. Индексируйте запросы — добавьте индексы на поля, по которым идет фильтрация или сортировка.

2. Ограничивайте выборку — используйте параметры для уменьшения объема данных (например, по периоду или организации).

3. Кэшируйте результаты — если отчет выполняется часто, сохраняйте промежуточные данные в временные таблицы.

4. Отключайте ненужные поля — в настройках СКД оставляйте только те поля, которые действительно выводятся в отчете.

5. Типичные ошибки и их решения

При интеграции СКД в расширение разработчики часто сталкиваются с типичными ошибками. Разберём наиболее распространённые из них и способы их устранения.

Ошибка 1: "Объект не найден (ИмяОбъекта)"

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

  • 🔧 Проверьте, подключены ли необходимые подсистемы в расширении.
  • 📋 Убедитесь, что объект существует в основной конфигурации и не помечен на удаление.
  • 🔄 Используйте ПолноеИмяОбъекта (например, Справочник.Номенклатура вместо Номенклатура).

Ошибка 2: "Недопустимое значение параметра (ИмяПараметра)"

Ошибка связана с несоответствием типов данных при передаче параметров в СКД. Например, если в схеме компоновки параметр объявлен как Дата, а из формы передаётся Строка. Решение:

  • 📅 Проверьте типы параметров в Конструкторе СКД (вкладка "Параметры").
  • 🔧 Преобразуйте данные перед передачей (например, Дата(СтрокаПараметра)).
  • 📌 Используйте ОписаниеТипов для валидации:
ТипДата = Новый ОписаниеТипов("Дата");

Если Не ТипДата.Совместим(ЗначениеПараметра) Тогда

ВызватьИсключение "Некорректный формат даты!";

КонецЕсли;

Ошибка 3: "Недостаточно прав для выполнения операции"

Эта ошибка появляется, если у пользователя нет прав на доступ к данным, используемым в СКД. Решение:

  • 🔐 Проверьте роли пользователя в 1С:Предприятие (раздел Администрирование → Пользователи).
  • 📋 Настройте права на уровне профилей групп доступа (если используются).
  • 🛡️ Добавляйте проверку прав в коде отчета:
Если Не Пользователь.ПроверитьПрава("ЧтениеДокументов.РеализацияТоваровУслуг") Тогда

Предупреждение("У вас недостаточно прав для просмотра этого отчета!");

Возврат;

КонецЕсли;

Ошибка 4: "Слишком длинный запрос или недостаточно памяти"

Эта ошибка типична для больших отчетов с сложными группировками. Решение:

  • 📊 Разбейте запрос на несколько более простых (используйте временные таблицы).
  • 🔧 Оптимизируйте индексы в базе данных (через Администрирование → Тестирование и исправление).
  • 📈 Ограничьте период данных или используйте Пакетные запросы.
💡

Чаще всего ошибки в СКД связаны с несоответствием типов данных, недостаточными правами или неправильной настройкой источников. Всегда тестируйте отчеты на небольших выборках данных перед запуском на полной базе.

6. Оптимизация производительности СКД в расширениях

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

1. Используйте индексированные запросы

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

ВЫБРАТЬ

Номенклатура.Наименование,

СУММА(Документ.РеализацияТоваровУслуг.Количество) КАК Количество

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО Документ.Номенклатура = Номенклатура.Ссылка

ГДЕ

Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО

Номенклатура.Наименование

Лучше написать:

ВЫБРАТЬ

Номенклатура.Наименование,

СУММА(Документ.Количество) КАК Количество

ИЗ

Документ.РеализацияТоваровУслуг КАК Документ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО Документ.Номенклатура = Номенклатура.Ссылка

ГДЕ

Документ.Дата >= &НачалоПериода

И Документ.Дата <= &КонецПериода

СГРУППИРОВАТЬ ПО

Номенклатура.Ссылка // Группировка по ссылке вместо наименования

2. Ограничивайте объём данных на уровне запроса

Используйте параметры для фильтрации данных ещё на этапе выборки. Например, если отчет анализирует продажи по организациям, добавьте параметр Организация и фильтруйте по нему:

ГДЕ

Документ.Организация = &Организация

И Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

3. Используйте временные таблицы для сложных вычислений

Если в отчете требуются промежуточные вычисления (например, расчёт средних значений или сравнение с планом), вынесите их во временные таблицы. Это уменьшит нагрузку на основной запрос:

// Создаём временную таблицу для промежуточных данных

ВременнаяТаблица = Новый ТаблицаЗначений;

ВременнаяТаблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ВременнаяТаблица.Колонки.Добавить("СуммаПродаж", Новый ОписаниеТипов("Число", , "15,2"));

// Заполняем её данными из основного запроса

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ...";

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

Строка = ВременнаяТаблица.Добавить();

Строка.Номенклатура = Выборка.Номенклатура;

Строка.СуммаПродаж = Выборка.Сумма;

КонецЦикла;

4. Настройте кеширование отчетов

Если отчет выполняется часто с одинаковыми параметрами, настройте кеширование результатов. Для этого в модуле отчета добавьте логику сохранения и загрузки данных:

Процедура ПолучитьДанныеИзКэша(Параметры)

ХэшПараметров = ПолучениеХэшаПараметров(Параметры);

Кеш = Новый КешЗначений;

Если Кеш.Получить(ХэшПараметров, Данные) Тогда

Возврат Данные;

Иначе

Данные = ПолучитьДанныеИзБазы(Параметры);

Кеш.Добавить(ХэшПараметров, Данные, 3600); // Кешируем на 1 час

Возврат Данные;

КонецЕсли;

КонецПроцедуры

💡

Для анализа производительности СКД используйте Журнал регистрации (раздел Администрирование → Журнал регистрации). Включите регистрацию событий "Запросы" и "Выполнение отчетов", чтобы увидеть, какие операции занимают больше всего времени.

7. Расширенные возможности: динамическая настройка СКД

Одно из ключевых преимуществ интеграции СКД непосредственно в расширение — возможность динамически менять параметры отчета в зависимости от контекста. Рассмотрим несколько практических примеров.

Пример 1: Изменение доступных полей в зависимости от роли пользователя

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

Процедура ПриКомпоновкеДанных(ДанныеРасшифровки, СтандартнаяОбработка)

ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

// Получаем настройки компоновщика

Настройки = КомпоновщикНастроек.Настройки;

Схема = КомпоновщикМакета.ПолучитьСхемуКомпоновкиДанных();

// Скрываем поле "Себестоимость" для неадминистраторов

Если Не ТекущийПользователь.Роли.Найти("ПолныеПрава") Тогда

ПолеСебестоимость = Схема.Поля.Найти("Себестоимость");

Если ПолеСебестоимость <> Неопределено Тогда

Настройки.Поля.Удалить(ПолеСебестоимость);

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Пример 2: Динамическая группировка данных

Если нужно менять группировку в отчете в зависимости от выбранного параметра (например, группировать по "Контрагентам" или по "Регионам"), используйте следующий подход:

Процедура УстановитьГруппировку(ТипГруппировки)

Настройки = КомпоновщикНастроек.Настройки;

Схема = КомпоновщикМакета.ПолучитьСхемуКомпоновкиДанных();

// Очищаем текущие группировки

Настройки.ОчиститьГруппировки();

// Добавляем новую группировку в зависимости от параметра

Если ТипГруппировки = "ПоКонтрагентам" Тогда

Настройки.Группировки.Добавить(Схема.Поля.Найти("Контрагент"));

ИначеЕсли ТипГруппировки = "ПоРегионам" Тогда

Настройки.Группировки.Добавить(Схема.Поля.Найти("Регион"));

КонецЕсли;

// Обновляем отчет

КомпоновщикМакета.Выполнить();

КонецПроцедуры

Пример 3: Экспорт отчета в разных форматах

СКД поддерживает экспорт в Excel, PDF, HTML и другие форматы. Чтобы дать пользователю выбор, добавьте на форму отчета кнопки с соответствующими обработчиками:

&НаКлиенте

Процедура ЭкспортироватьВExcel(Команда)

Экспорт = Новый ЭкспортВExcel;

Экспорт.Экспортировать(КомпоновщикМакета.Вывод.ПолучитьДанныеДляЭкспорта());

КонецПроцедуры

&НаКлиенте

Процедура ЭкспортироватьВPDF(Команда)

Экспорт = Новый ЭкспортВPDF;

Экспорт.Файл = Новый Файл("Отчет.pdf");

Экспорт.Экспортировать(КомпоновщикМакета.Вывод.ПолучитьДанныеДляЭкспорта());

Экспорт.Закрыть();

КонецПроцедуры

Пример 4: Интерактивные отчеты с расшифровкой

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

Процедура ПриРасшифровке(Элемент, ДанныеРасшифровки, СтандартнаяОбработка)

Если ДанныеРасшифровки.Тип = Тип("СправочникСсылка.Контрагенты") Тогда

ОткрытьФорму("ДокументыКонтрагента.ФормаСписка", Новый Структура("Контрагент", ДанныеРасшифровки.Значение));

КонецЕсли;

КонецПроцедуры

💡

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

8. Тестирование и отладка отчетов с СКД

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

1. Проверка корректности данных