Реализация отборов на форме с помощью СКД

22.03.22

Разработка - СКД

В статье описана практическая методика использования системы компоновки данных (СКД) для реализации отборов на любых формах конфигурации.

Введение

Всем доброго времени суток!

В данной статье предлагаю рассмотреть (в качестве шпаргалки) хорошо известный способ (некоторым) использования системы компоновки данных (СКД) на формах обработок, справочников или документов с целью создания отбора по таблице, сформированной произвольным запросом. Разработку я буду вести на конфигурации Управление торговлей 11.4. - полная версия 11.4.13.282. Тестирование практических примеров осуществляется для Платформе 1с 8.3.19.1264. Вероятно, что данный подход можно использовать в любой конфигурации (в том числе и самописной).

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

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

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

 

Создание основного макета, описание компоновщика отбора

Самым первым шагом в новой обработке создадим макет схемы компоновки данных, содержащий вот такой простейший тестовый запрос:

 
 Тестовый запрос в макете "Схема компоновки данных"

 

ВЫБРАТЬ
	МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод,
	ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ШтрихКоды
ИЗ
	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры

СГРУППИРОВАТЬ ПО
	ШтрихкодыНоменклатуры.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка,
	Номенклатура.Код КАК Код,
	Номенклатура.Артикул КАК Артикул,
	Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	Номенклатура.СтавкаНДС КАК СтавкаНДС,
	Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.ЭтоГруппа = ЛОЖЬ
	И Номенклатура.ПометкаУдаления = ЛОЖЬ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены
ПОМЕСТИТЬ ВТ_ВидыЦен
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Номенклатура.Ссылка КАК Ссылка,
	ВТ_Номенклатура.Код КАК Код,
	ВТ_Номенклатура.Артикул КАК Артикул,
	ВТ_Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	ВТ_Номенклатура.СтавкаНДС КАК СтавкаНДС,
	ВТ_Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	ЕСТЬNULL(ВТ_ВидыЦен.Цена, 0) КАК Цена,
	ЕСТЬNULL(ВТ_ШтрихКоды.Штрихкод, "") КАК Штрихкод,
	ВТ_ВидыЦен.ВидЦены КАК ВидЦены
ИЗ
	ВТ_Номенклатура КАК ВТ_Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ШтрихКоды КАК ВТ_ШтрихКоды
		ПО ВТ_Номенклатура.Ссылка = ВТ_ШтрихКоды.Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВидыЦен КАК ВТ_ВидыЦен
		ПО ВТ_Номенклатура.Ссылка = ВТ_ВидыЦен.Номенклатура

 

 

В данном запросе мы выбираем номенклатуру, ее штрихкод и последнюю цену по виду цены. Запрос можно оптимизировать, сократить временные таблицы, но для "по-шаговости" я сделал его предельно понятным. Далее, так же в макете пропишем следующие параметры (по факту - единственный параметр Период, который будет определять текущий срез цен) и настройки (см. рис):

 

Рис.1. Параметр "Период" - использую функцию ТекущаяДата().

 

Рис.2. Выбранные поля в макете.  В выбранных полях определим "колонки будущей таблицы".

 

Рис.3. Установка отбора по-умолчанию - будем выбирать "Только товары" в группе и с выбранным типом цены (этот отбор увидит пользователь при открытии обработки).

 

Так, с макетом мы закончили, теперь перейдем к созданию КомпоновщикНастроекКомпоновкиДанных на форме.

Для этого на форме создаем элемент Отбор КомпоновщикНастроек с типом КомпоновщикНастроекКомпоновкиДанных.

Рис.4. Установка КомпоновщикаНастроекКомпоновкиДанных. Выбираем его из окна "Редактирование типов данных".

 

Из компоновщика берем Отбор и размещаем его на форме в виде таблицы. Выглядит это вот так.

Рис.5. Размещение отбора компоновки данных на форме.

 

Далее, переходим к написанию "кода привязки" схемы компоновки к форме через компоновщик отбора.

 

Привязка схемы компоновки к форме через компоновщик

Здесь первым делом создаем процедуру основной формы ПриСозданииНаСервере(Отказ, СтандартнаяОбработка).

Выглядит она вот так (работаем только через временное хранилище, по-скольку используем тонкий клиент) - возьмите за правило работать через временное хранилище:

 
 ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

 

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    СхемаКомпоновки = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
	АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(СхемаКомпоновки , УникальныйИдентификатор);
	
	ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВоВременномХранилище);
	
	КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
	
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);	
	
КонецПроцедуры

 

 

Далее, создаем и размещаем кнопку на форме "Получение номенклатуры" и привязываем к ней вот такой код:

 
 Привязка кода к кнопке "Получение номенклатуры"

 

&НаКлиенте
Процедура ПолучитьНоменклатуру(Команда)
	
    // разместим на форме объекта табличную часть "Наглядный отбор"

	Объект.НаглядныйОтбор.Очистить();
	ОбработатьНоменклатуруНаСервере();

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

&НаСервере
Процедура ОбработатьНоменклатуруНаСервере()
	
	СхемаКомпоновки     = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
	НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
	
	КомпоновщикМакета 	= Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки1 	= КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки1);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ТабЗнач = Новый ТаблицаЗначений;
	
	ПроцессорВывода.УстановитьОбъект(ТабЗнач);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);

	// разместим на форме объекта табличную часть "Наглядный отбор". Это уже готовая ТЗ с 
    // отбором

	Для Каждого СтрокаТЗ ИЗ ТабЗнач Цикл
		
		ЗаполнитьЗначенияСвойств(Объект.НаглядныйОтбор.Добавить(), СтрокаТЗ);		
		
	КонецЦикла;		
	
КонецПроцедуры	

 

 

Получение отбором необходимой выборки

Полный код формы данной обработки выглядит вот так:

Код

 

На видео показана возможность работы - отбора по таблице с произвольным запросом:

 

Рис.6. Демонстрация работы отбора по таблице, сформированной произвольным запросом.

 

Пожалуй, на этом все. Мы разобрали самый типовой пример работы с компоновщиком настроек системы компоновки данных. Статья естественно не претендует на открытие какой-то новизны. Это формат кода - шпаргалки, который можно использовать при любой удобной возможности.

 

Мои материалы по возможностям Библиотеки стандартных подсистем (БСП)

Спасибо всем, кто прочитал до данного момента.

 

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

 

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

 

Возможности администрирования баз и кластера с помощью библиотеки стандартных подсистем:

Профили управления доступом к объектам в любой конфигурации на БСП

Журнал регистрации - основные методы работы через БСП

Базовые приемы работы с кластером 1С при помощи БСП

 

Запуск длительных операций с помощью библиотеки стандартных подсистем:

Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1]

Запуск почти любых процедур и функции конфигураций в асинхронном режиме - БСП - Длительные операции [Часть 2]

БСП - рабочие примеры асинхронного запуска функций и процедур

 

Работа со штрихкодами и печатными макетами с помощью библиотеки стандартных подсистем:

Генерация штрихкодов с помощью БСП для программистов

Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Печать макета MS Word в любом документе с помощью БСП

Префиксация объектов - полезный типовой функционал БСП

Работаем с контактной информацией в конфигурациях на БСП

 

Разные прикладные разработки:

Генератор маршрута по "документам отгрузки" в Google.Maps

Честный знак - запрос содержания упаковки по ее коду [табачная продукция]

Универсальный журнал документов для типовых конфигураций

скд отборы компоновка формы

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159431    872    399    

861

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8684    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

3 стартмани

05.02.2024    6996    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3148    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10804    23    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    8017    PROSTO-1C    15    

68
Отзывы
6. quazare 3800 08.04.22 07:32 Сейчас в теме
Всем желающим скачать разные примеры работы с БСП - можете на моем телеграмм канале
dutlovva; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. frkbvfnjh 805 29.12.21 07:28 Сейчас в теме
Спасибо, хорошо написано - сохранен баланс между тем, что бы не описывать совсем базовые понятия и между тем, что бы описать довольно подробно и наглядно процесс создания заявленного функционала, т.е. баланс между краткостью и понятностью.
crosby; bulpi; quazare; +3 Ответить
12. crosby 280 18.07.24 12:28 Сейчас в теме
(1) 100%. Что называется, с языка сняли :) Могу только добавить, что и оформленно всё со вкусом.
4. triviumfan 97 31.12.21 11:30 Сейчас в теме
(2) об этом кто только не писал :)
9. DELOVOYDOM 19.02.24 23:33 Сейчас в теме
(4) никто не писал про программное создание схемы в форме справочника, без макетов без отчетов. Чтобы красиво работали настройки отбора и условного оформления в пользовательском режиме.
11. vozhd 209 21.06.24 10:29 Сейчас в теме
(9)
оздание схемы в форме справочника, без макетов без отчетов. Чтобы красиво работали настройки отбора и услов


&НаСервере
Процедура ЗаполнитьСхемуКомпоновки()

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

НаборДанныхОбъектСхемыКомпоновкиДанных = СхемаКомпоновкиУсловия.НаборыДанных.Запрос;
НаборДанныхОбъектСхемыКомпоновкиДанных.Запрос = "ВЫБРАТЬ * ИЗ " + "Справочник.Пользователи (например)" + " ГДЕ ЛОЖЬ";
НастройкиКомпоновки = КомпоновщикУсловия.Настройки;

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

Это для отборов, применяю для настройки назначения дополнительных реквизитов - чтобы выводились только при некоторых комбинациях реквизитов.
8. DELOVOYDOM 19.02.24 23:32 Сейчас в теме
(2) Почти никто не пишет как создать отборы в форме справочника с программным формированием схемы. Через макет вообще не интересно, смысла нет в этом. Смысл есть когда в пользовательском интерфейсе можно задавать источники. А тут только программное создание схемы. Везде где пишут про программное создание везде используют формы отчетов и табличные документы
3. vld1973 90 29.12.21 10:45 Сейчас в теме
Спасибо за материал
5. eufes 03.01.22 11:10 Сейчас в теме
Да тема два раза встречалась уже такая. На мой взгляд, стоило уделить внимание красоте отборов на форме при таких подходах - может быть какое-то программное выведение их после добавления их пользователем в отдельном окне как раз в этой табличной части отборов. Просто табличная часть генерируемая платформой не очень, да и если использовать группировки в отборах, тоже не всегда корректно отображаются. Интерфейс тоже немаловажная часть.
10. DELOVOYDOM 19.02.24 23:36 Сейчас в теме
(5) потому что ума не надо написать про НЕ программное создание схемы, да еще и в форме отчета да еще и в табличный документ. Авторы сами не разобрались в скд, потому просто скопипастили и все. Уверен, программная часть по скд у них хромает, где то даже встречал такую нелепую фразу "программное изменение схемы почти не используется". Ну конечно! Не используется. Везде используется пользователями, когда надо добавлять разные типы документов в отборы
6. quazare 3800 08.04.22 07:32 Сейчас в теме
Всем желающим скачать разные примеры работы с БСП - можете на моем телеграмм канале
dutlovva; +1 Ответить
7. alex85sh 11.10.23 10:22 Сейчас в теме
Спасибо! Здесь еще не хватает реализации сохранения пользовательских настроек. При повторном открытии должны открываться последние настройки пользователя.
IVKuzmin; KoC_one; Wrols; +3 Ответить
13. IVKuzmin 17.10.24 14:55 Сейчас в теме
(7) Здравствуйте! Решили это как-нибудь?
Оставьте свое сообщение