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

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

При разработке гибких отчетов и настраиваемых подсистем в 1С часто возникает задача предоставить пользователю возможность интерактивно настроить схему компоновки данных прямо в режиме «1С:Предприятие», после чего сохранить готовую схему в XML-формате в реквизит справочника или текстовый файл. Разберем по шагам, как правильно реализовать этот механизм в обычном приложении, почему может не срабатывать процедура ОбработкаВыбора и как сохранить полученный результат.

Принцип работы конструктора СКД в коде

Для интерактивного редактирования схемы компоновки данных в платформе 1С предусмотрен специальный объект КонструкторСхемыКомпоновкиДанных. Обратите внимание: данный объект и его интерфейсное окно функционируют только в толстом клиенте. В тонком и веб-клиенте вызов интерактивного конструктора схемы не поддерживается.

Проанализируем алгоритм открытия конструктора:

  1. Создаем новый экземпляр схемы компоновки или получаем уже сохраненную из реквизита.
  2. Инициализируем объект КонструкторСхемыКомпоновкиДанных и передаем ему схему методом УстановитьСхему().
  3. Вызываем метод Редактировать(), передавая в качестве параметра форму-владельца (например, ЭтаФорма).
  4. После редактирования пользователь нажимает кнопку «ОК», и управление передается в обработчик события формы ОбработкаВыбора.

Реализация вызова конструктора схемы компоновки данных

Посмотрим на пример кода кнопки вызова конструктора из формы элемента:


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

Функция ПолучитьСхемуКомпоновкиДанных()
    // Если схема ранее не сохранялась, возвращаем пустую схему
    Возврат Новый СхемаКомпоновкиДанных;
КонецФункции

Почему управление не попадает в процедуру ОбработкаВыбора?

Выясним причину частой ошибки, с которой сталкиваются разработчики: метод КонструкторСКД.Редактировать(ЭтаФорма) отрабатывает, окно конструктора успешно открывается, пользователь нажимает «ОК», но программный код в процедуре ОбработкаВыбора не выполняется.

Рассмотрим две ключевые причины такого поведения:

  1. Процедура не привязана к событию формы: создание текста процедуры Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) в модуле формы вручную не означает, что платформа автоматически назначит ее обработчиком. Необходимо обязательно открыть свойства самой формы в конфигураторе, найти в палитре свойств строку события ОбработкаВыбора и убедиться, что напротив него выбрано имя вашей процедуры.
  2. Пользователь нажал «Отмена» или закрыл окно крестиком: событие ОбработкаВыбора генерируется только при подтверждении изменений по кнопке «ОК». При отмене диалог закрывается без оповещения формы-владельца.

Извлечение и сериализация схемы в XML

После того как пользователь нажал кнопку «ОК», в процедуру формы ОбработкаВыбора в качестве первого параметра (ВыбранноеЗначение) передается готовый объект СхемаКомпоновкиДанных. Разберем подробнее, как преобразовать этот объект в XML-строку для сохранения в реквизит и как восстановить схему обратно при повторном открытии.

Посмотрим на пример обработки результата выбора с использованием механизма СериализаторXDTO:


Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если ТипЗнч(ВыбранноеЗначение) = Тип("СхемаКомпоновкиДанных") Тогда
        // Сериализуем схему СКД в строку XML
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ВыбранноеЗначение);
        
        ТекстСхемыXML = ЗаписьXML.Закрыть();
        
        // Сохраняем строку в реквизит объекта или формы
        ЭтотОбъект.ХранилищеСхемыXML = ТекстСхемыXML;
    КонецЕсли;
КонецПроцедуры

Теперь рассмотрим, как восстановить схему из сохраненной XML-строки при следующем вызове функции ПолучитьСхемуКомпоновкиДанных():


Функция ПолучитьСхемуКомпоновкиДанных()
    Если ПустаяСтрока(ЭтотОбъект.ХранилищеСхемыXML) Тогда
        Возврат Новый СхемаКомпоновкиДанных;
    КонецЕсли;
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ЭтотОбъект.ХранилищеСхемыXML);
    Схема = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("СхемаКомпоновкиДанных"));
    ЧтениеXML.Закрыть();
    
    Возврат Схема;
КонецФункции

Вопросы безопасности и прав доступа

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

Если задача заключается только в том, чтобы дать пользователю возможность настраивать отборы, порядок, группировки и оформление без права изменения самого текста запроса, рекомендуется использовать не сам конструктор схемы, а форму настройки через объект КомпоновщикНастроекКомпоновкиДанных. Это позволит разграничить права доступа и избежать непреднамеренного нарушения логики работы отчета.

← На главную