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