Обработка СКД

До недавнего времени при разработке обработок для пользователей, которые предназначались для выполнения различных действий с получаемым набором данных (рабочее место менеджера, формирование платежного календаря и т.д.), я использовал для вывода информации на форму обычные запросы. В данной схеме реализации неудобно было работать с отборами пользователей:
- Каждый новый отбор по требованиям пользователей нужно было выводить на форму;
- При каждом новом отборе необходимо было модернизировать запрос в коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//Через параметры ТекстЗапрос = "ВЫБРАТЬ | Подразделения.Ссылка КАК Ссылка |ИЗ | Справочник.Подразделения КАК Подразделения |ГДЕ | НЕ &РуководительЗаполнен ИЛИ Подразделения.Руководитель = &Руководитель"; Запрос = Новый Запрос(ТекстЗапрос); Запрос.УстановитьПараметр("РуководительЗаполнен", ЗначениеЗаполнено(Руководитель)); Запрос.УстановитьПараметр("Руководитель" , Руководитель); //Через условия ЕстьУсловия = Истина; ТекстЗапрос = "ВЫБРАТЬ | Подразделения.Ссылка КАК Ссылка |ИЗ | Справочник.Подразделения КАК Подразделения"; Если ЕстьУсловия Тогда ТекстЗапрос = ТекстЗапрос + " ГДЕ "; КонецЕсли; Если ЗначениеЗаполнено(Руководитель) Тогда ТекстЗапрос = ТекстЗапрос + " Руководитель = &Руководитель"; КонецЕсли; Запрос = Новый Запрос(ТекстЗапрос); Запрос.УстановитьПараметр("Руководитель" , Руководитель); |
И делал я так до тех пор, пока один хранитель тайн 1с не поведал мне мудрость, хранившую годами: “Ты че дебил, так давно уже никто не делает – используй СКД!”. И действительно – это намного удобнее и правильнее. И так поделюсь с вами этой мудростью.
Задача: вывести на форму обработки список документов (в виде таблицы значений) со всевозможными отборами, для дальнейшего изменения реквизитов в них прямо на форме (это дополнительная, не основная задача, в рамках этой статьи реализована не будет).
Создаем новую обработку и добавляем реквизит “КомпоновщикНастроек”:
Создаем новую форму и добавляем на ней следующие реквизиты: “АдресСхемыКомпоновкиДанных” (тип “Строка”), “ТаблицаЗарплат” (тип “ТаблицаЗначений” с нужными нам колонками) + команду “Сформировать”. Формируем красивое расположение элементов на форме (не в моем случае):
Далее добавляем макет схемы компоновки данных в нашу обработку, где описываем какие данные и в каком виде мы будем получать (в нашем случае нужен просто список документов):

Параметры запроса “&НачалоПериода” и “&КонецПериода” преобразуем в один параметр “СтандартныйПериод” с типом “СтандартныйПериод” (удобнее работать на форме с одним параметром, чем с двумя):

Описываем настройки выводимых данных:

И добавляем отборы и параметры для нашего компоновщика настроек:
Открываем нашу обработку и… Ничего не видим. Правильно – настало время программировать.
И так, первое что мы сделаем, это при создании на сервере инициализируем компоновщик настроек и поместим нашу СКД во временное хранилище:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) АдресСхемыКомпоновкиДанных = ИнициализироватьКомпоновщик(Объект.КомпоновщикНастроек, "ОсновнойМакетСКД", УникальныйИдентификатор); КонецПроцедуры &НаСервере Функция ИнициализироватьКомпоновщик(Компоновщик, ИмяМакета, УникальныйИдентификатор) ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); СхемаКомпоновкиДанных = ОбработкаОбъект.ПолучитьМакет(ИмяМакета); АдресСКД = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); Компоновщик.Инициализировать(ИсточникНастроек); Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); Возврат АдресСКД; КонецФункции // ИнициализироватьКомпоновщик() |
И о чудо, теперь при открытии нашей обработки появляются наши отборы для пользователей:

Теперь дело за малым: осталось при нажатии на кнопку “Сформировать” вывести данные в таблицу на форму. Проще простого:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
&НаСервере Процедура СформироватьНаСервере() // Получим данные по настроенной СКД СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресСхемыКомпоновкиДанных); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Объект.КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки); // Таблица с данными, полученными из СКД РезТаблица = Новый ТаблицаЗначений; ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(РезТаблица); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); ТаблицаЗарплат.Загрузить(РезТаблица); КонецПроцедуры |
Для вывода результатов СКД в таблицу значений используем параметр метода “Выполнить” “Тип(“ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений”)” и конструкцию ПроцессорВывода.УстановитьОбъект(РезТаблица);
Открываем обработку и формируем нашу таблицу с любыми параметрами и отборами, что бы к примеру отредактировать зарплату Чак Норисса:

Как оказалось ничего сложного в этом механизме нет, и элементарное решение делается буквально за полчаса. В этой статье даны основы реализации СКД через обработку. Возможностей здесь гораздо больше: можно устанавливать программно параметры запроса, выводить данные в виде дерева значений, сохранять настройки пользователей и т.д.
Для примера если в запросе СКД есть параметры, то их можно легко устанавливать программно:
1 2 |
Объект.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ПараметрЗапроса", "ЗначениеПараметра"); |
В общем тренируйтесь и развивайтесь! Готовое решение можете скачать по ссылке “СКД в обработке”. Удачи!
Спасибо. Помогло.