Введение
Всем доброго времени суток!
В данной статье предлагаю рассмотреть (в качестве шпаргалки) хорошо известный способ (некоторым) использования системы компоновки данных (СКД) на формах обработок, справочников или документов с целью создания отбора по таблице, сформированной произвольным запросом. Разработку я буду вести на конфигурации Управление торговлей 11.4. - полная версия 11.4.13.282. Тестирование практических примеров осуществляется для Платформе 1с 8.3.19.1264. Вероятно, что данный подход можно использовать в любой конфигурации (в том числе и самописной).
Публикация будет полезна всем программистам - разработчикам, а так же пользователям, желающим познакомиться с возможностями системы компоновки данных, которую можно использовать не только для сборки отчетов.
Материал статьи представляет разбор пошагового практического примера с комментариями и объяснениями. Примеры публикации актуальны для серверных и файловых баз. Библиотека стандартных подсистем не используется.
Сразу отмечу, что для специалистов в статье не будет ничего нового, но в качестве шпаргалки - вполне сойдет. Давайте перейдем к разбору примера:
Создание основного макета, описание компоновщика отбора
Самым первым шагом в новой обработке создадим макет схемы компоновки данных, содержащий вот такой простейший тестовый запрос:
ВЫБРАТЬ
МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод,
ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ШтрихКоды
ИЗ
РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
СГРУППИРОВАТЬ ПО
ШтрихкодыНоменклатуры.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Код КАК Код,
Номенклатура.Артикул КАК Артикул,
Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
Номенклатура.СтавкаНДС КАК СтавкаНДС,
Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И Номенклатура.ПометкаУдаления = ЛОЖЬ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены
ПОМЕСТИТЬ ВТ_ВидыЦен
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Номенклатура.Ссылка КАК Ссылка,
ВТ_Номенклатура.Код КАК Код,
ВТ_Номенклатура.Артикул КАК Артикул,
ВТ_Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
ВТ_Номенклатура.СтавкаНДС КАК СтавкаНДС,
ВТ_Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
ЕСТЬNULL(ВТ_ВидыЦен.Цена, 0) КАК Цена,
ЕСТЬNULL(ВТ_ШтрихКоды.Штрихкод, "") КАК Штрихкод,
ВТ_ВидыЦен.ВидЦены КАК ВидЦены
ИЗ
ВТ_Номенклатура КАК ВТ_Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ШтрихКоды КАК ВТ_ШтрихКоды
ПО ВТ_Номенклатура.Ссылка = ВТ_ШтрихКоды.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВидыЦен КАК ВТ_ВидыЦен
ПО ВТ_Номенклатура.Ссылка = ВТ_ВидыЦен.Номенклатура
В данном запросе мы выбираем номенклатуру, ее штрихкод и последнюю цену по виду цены. Запрос можно оптимизировать, сократить временные таблицы, но для "по-шаговости" я сделал его предельно понятным. Далее, так же в макете пропишем следующие параметры (по факту - единственный параметр Период, который будет определять текущий срез цен) и настройки (см. рис):
Рис.1. Параметр "Период" - использую функцию ТекущаяДата().
Рис.2. Выбранные поля в макете. В выбранных полях определим "колонки будущей таблицы".
Рис.3. Установка отбора по-умолчанию - будем выбирать "Только товары" в группе и с выбранным типом цены (этот отбор увидит пользователь при открытии обработки).
Так, с макетом мы закончили, теперь перейдем к созданию КомпоновщикНастроекКомпоновкиДанных на форме.
Для этого на форме создаем элемент Отбор КомпоновщикНастроек с типом КомпоновщикНастроекКомпоновкиДанных.
Рис.4. Установка КомпоновщикаНастроекКомпоновкиДанных. Выбираем его из окна "Редактирование типов данных".
Из компоновщика берем Отбор и размещаем его на форме в виде таблицы. Выглядит это вот так.
Рис.5. Размещение отбора компоновки данных на форме.
Далее, переходим к написанию "кода привязки" схемы компоновки к форме через компоновщик отбора.
Привязка схемы компоновки к форме через компоновщик
Здесь первым делом создаем процедуру основной формы ПриСозданииНаСервере(Отказ, СтандартнаяОбработка).
Выглядит она вот так (работаем только через временное хранилище, по-скольку используем тонкий клиент) - возьмите за правило работать через временное хранилище:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СхемаКомпоновки = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(СхемаКомпоновки , УникальныйИдентификатор);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВоВременномХранилище);
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
КонецПроцедуры
Далее, создаем и размещаем кнопку на форме "Получение номенклатуры" и привязываем к ней вот такой код:
&НаКлиенте
Процедура ПолучитьНоменклатуру(Команда)
// разместим на форме объекта табличную часть "Наглядный отбор"
Объект.НаглядныйОтбор.Очистить();
ОбработатьНоменклатуруНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбработатьНоменклатуруНаСервере()
СхемаКомпоновки = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки1 = КомпоновщикМакета.Выполнить(СхемаКомпоновки, НастройкиКомпоновки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки1);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТабЗнач = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТабЗнач);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// разместим на форме объекта табличную часть "Наглядный отбор". Это уже готовая ТЗ с
// отбором
Для Каждого СтрокаТЗ ИЗ ТабЗнач Цикл
ЗаполнитьЗначенияСвойств(Объект.НаглядныйОтбор.Добавить(), СтрокаТЗ);
КонецЦикла;
КонецПроцедуры
Получение отбором необходимой выборки
Полный код формы данной обработки выглядит вот так:
На видео показана возможность работы - отбора по таблице с произвольным запросом:
Рис.6. Демонстрация работы отбора по таблице, сформированной произвольным запросом.
Пожалуй, на этом все. Мы разобрали самый типовой пример работы с компоновщиком настроек системы компоновки данных. Статья естественно не претендует на открытие какой-то новизны. Это формат кода - шпаргалки, который можно использовать при любой удобной возможности.
Мои материалы по возможностям Библиотеки стандартных подсистем (БСП)
Спасибо всем, кто прочитал до данного момента.
Если вам интересен мой практический подход и информация, которую вы сможете реально использовать, если у вас есть желание, чтобы данный комплекс статей наполнялся практическими материалы для программистов - я не откажусь от поддержки как данной статьи, так и всего комплекса статей в целом.
Также прошу ознакомиться с другими моими статьями по интересному функционалу типовых конфигураций в рамках библиотеки стандартных подсистем и по разделам. Я накопил достаточный объем знаний по данной библиотеки, вот наиболее интересные статьи по ней:
Возможности администрирования баз и кластера с помощью библиотеки стандартных подсистем:
Профили управления доступом к объектам в любой конфигурации на БСП
Журнал регистрации - основные методы работы через БСП
Базовые приемы работы с кластером 1С при помощи БСП
Запуск длительных операций с помощью библиотеки стандартных подсистем:
БСП - рабочие примеры асинхронного запуска функций и процедур
Работа со штрихкодами и печатными макетами с помощью библиотеки стандартных подсистем:
Генерация штрихкодов с помощью БСП для программистов
Печать макета MS Word в любом документе с помощью БСП
Префиксация объектов - полезный типовой функционал БСП
Работаем с контактной информацией в конфигурациях на БСП
Разные прикладные разработки:
Генератор маршрута по "документам отгрузки" в Google.Maps
Честный знак - запрос содержания упаковки по ее коду [табачная продукция]