Каталог решений - Вывод товаров в СКД как на весах в Ашане

Вывод товаров в СКД как на весах в Ашане

Вывод товаров в СКД как на весах в Ашане

В наличии

Небольшая хитрость, которая позволяет выводить информацию на СКД плиткой.

Категория:

Описание

Зачастую вывод информации в отчете на СКД списком не удобен — теряется много места на экране, и пользователю приходится скроллить. А хочется видеть максимум данных на одном листе.

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

Функция ПолучитьТЗНоменклатура()

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	НоменклатураСпр.ФайлКартинки КАК ФайлКартинки,
	|	НоменклатураСпр.Ссылка КАК Номенклатура
	|ИЗ
	|	Справочник.Номенклатура КАК НоменклатураСпр
	|ГДЕ
	|	(&ИерархияОтборНеЗадан
	|			ИЛИ НоменклатураСпр.Ссылка В ИЕРАРХИИ (&ИерархияОтбор))
	|	И НоменклатураСпр.ЭтоГруппа = ЛОЖЬ
	|
	|УПОРЯДОЧИТЬ ПО
	|	НоменклатураСпр.Наименование"
	;
	
	Запрос.УстановитьПараметр("ИерархияОтбор", ИерархияОтбор);
	Запрос.УстановитьПараметр("ИерархияОтборНеЗадан", Не ЗначениеЗаполнено(ИерархияОтбор));
	
	ТЗНоменклатура = Запрос.Выполнить().Выгрузить();
	ТЗНоменклатура.Колонки.Добавить("НомерСтроки");
	ТЗНоменклатура.Колонки.Добавить("НомерКолонки");
	Для каждого стрТЗНоменклатура Из ТЗНоменклатура Цикл
	
		стрТЗНоменклатура.НомерСтроки = Цел(ТЗНоменклатура.Индекс(стрТЗНоменклатура) / ЧислоКолонок) + 1;
		стрТЗНоменклатура.НомерКолонки = ТЗНоменклатура.Индекс(стрТЗНоменклатура) % ЧислоКолонок + 1;
	
	КонецЦикла;
	
	Возврат ТЗНоменклатура;

КонецФункции

Далее стандартный программный вывод СКД

Процедура ВывестиНоменклатуру()

    ОбработкаОб = РеквизитФормыВЗначение("Объект");
	
    СхемаКомпоновкиДанных = ОбработкаОб.ПолучитьМакет("Номенклатура");

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

    //Формируем макет, с помощью компоновщика макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    //Передаем в макет компоновки схему, настройки и данные расшифровки
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    //Выполним компоновку с помощью процессора компоновки
	ТЗНоменклатура = ПолучитьТЗНоменклатура();
	ВнешнийНаборДанных = Новый Структура("ТЗНоменклатура", ТЗНоменклатура);
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);

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

    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
КонецПроцедуры

Создаем макет СКД, указываем поля нашего исходного запроса, плюс "НомерСтроки" и "НомерКолонки", источник — из внешнего набора

Далее все наши исходные поля добавляем в ресурсы, выглядит не очень красиво, не спорю

А потом в настройках указываем вывод в виде таблицы, где в качестве группировок используются номера строк и колонок, а в качестве выбранных полей — наши исходные данные

Данная схема выглядит довольно коряво, но тем не менее, она работает. Ждем, когда в механизмы платформы добавят вывод плиткой в "штатном" режиме.

Добавлена работа с макетами СКД, чтобы красиво обвести картинку и название товара общей рамкой. При этом корректно работает расшифровка по ресурсу. Что интересно — если тип ресурса — ссылка, то через элементы расшифровки значение расшифровки соответствует этой ссылке. А если тип ресурса — число, то значение расшифровки в элементе расшифровки — null.

Пример сделан в виде внешней обработки, т.к. если сделать в виде внешнего отчета, вылезает один нюанс. Если сделать в виде внешнего отчета, то пользователь может указать отбор в настройках СКД. И этот отбор надо будет передать в функцию создания внешнего набора данных, иначе разбивка по строкам и колонкам пройдет не корректно. Самое простое было бы выполнить какую-то вспомогательную схему компоновки данных, которая бы учитывала настройки пользователя, и полученную информацию использовать для отбора в нашем запросе. Но на внешнем отчете это нельзя сделать, т.к. мы перехватываем процедуру ПриКомпоновке для программного вывода. И даже если мы создаем СКД из другого макета, не основного, все равно вызывается эта процедура. Выхода тут два — либо вынести в модуль, где уже не будет перехватываться событие ПриКомпоновке, либо обработать отборы пользователя на уровне логики алгоритма. Оба этих варианта выходят за рамки статьи.

Протестировано на платформе 8.3.11.3034

has been added to your cart:
Оформление заказа