gifts2017

Отбор в обычной форме на основе СКД в 1С

Опубликовал Сергей Кононов (KonanSS) в раздел Программирование - Практика программирования

Отбор в обычной форме на основе СКД в 1С

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

ВЫБРАТЬ
     Контрагенты.Ссылка КАК Контрагент
ИЗ
    Справочник.Контрагенты КАК Контрагенты

 

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

 

   Сколько трудов стоит описать программисту разные виды сравнения (равно, не равно, в списке, в группе…) и исходя из этих видов сравнения дорабатывать свой конечный запрос получения данных.

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

 

На вкладке Настройки добавим новую группировку без детализации и, в нашем примере, поле Контрагент, так как в итоге мы получим все в таблицу значений:

И на вкладке Отбор добавим в отбор Контрагента:

 

Далее в самой обработке создадим реквизит Компоновщик типа КомпоновщикНастроекКомпоновкиДанных:

 

Теперь займемся оформлением формы. Выведем на форму самой обработки Отбор, с которым будет работать пользователь. На форму выведем элемент типа Табличное поле и дадим ему имя Отбор с типом данных Компоновщик.Настройки.Отбор:

 

Далее ниже выведем эелемент Табличное поле с именем Результат и типом ТаблицаЗначений и кнопку Выполнить, по которой и будем выводить таблицу с контрагентами:

Теперь создадим обработчики событий формы ПриОткрытии и обработчик нажатия кнопки Выполнить, код представлен ниже:

Перем Макет;

Процедура КнопкаВыполнитьНажатие(Кнопка)

    Результат.Очистить();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Макет, Компоновщик.ПолучитьНастройки(),,,
                                                    Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    Если ЭлементыФормы.Результат.Колонки.Количество() = 0 Тогда
        ЭлементыФормы.Результат.СоздатьКолонки();
    КонецЕсли;

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

Процедура ПриОткрытии()

    Макет = ПолучитьМакет("Макет");

    ИсточникДоступныхНастроек  = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Макет);

    Компоновщик.Инициализировать(ИсточникДоступныхНастроек);
    Компоновщик.ЗагрузитьНастройки(Макет.НастройкиПоУмолчанию);

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

Обработка готова, запустив ее, можно при запуске сразу увидеть в нашем Отборе появившегося Контрагента, у которого можно выбирать любой тип сравнения, а также и добавлять дополнительные строки отбора по реквизитам справочника Контрагенты:

На этом все, надеюсь, данная статья поможет Вам улучшить гибкость отборов в Ваших обработках.

Кононов Сергей

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Семенов (cerg110) 22.09.15 10:24
А лучше сделать по отдельным вкладкам(Результат, отбор).
2. Виталий Васильев (orfos) 22.09.15 11:46
Знаем, делали :) На УФ стало еще проще выводить отборы на форму отчета.
3. Марина Чирина (chmv) 22.09.15 13:20
4. Xer shi (Xershi) 22.09.15 13:26
Для реквизитов используем типовую обработку ПоискОбъектовВСпискахДанных.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа