IE 2018

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

Программирование - Практика программирования

СКД вывод плиткой вывод картинок в СКД программная работа с СКД работа с расшифровкой СКД

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

57

Скачать файлы

Наименование Файл Версия Размер
Вывод товаров в СКД как на весах в Ашане:
.epf 11,49Kb
23.05.18
6
.epf 11,49Kb 6 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. 🅵🅾️🆇 23.05.18 14:53 Сейчас в теме
Здорово.
Но всеже, как мне кажется, для такой задачи лучше использовать HTML/CSS, это добавит адаптивности и универсальности, хоть http запросом получай отчет :3
citicat; Vanch90; Soloist; +3 1 Ответить
2. Rustig 996 23.05.18 15:31 Сейчас в теме
(1) вы решали когда-нибудь подобные задачи?
на чем основывается ваш совет? на личном опыте?
7. 🅵🅾️🆇 23.05.18 16:45 Сейчас в теме
(2)
Тегу <IMG> присвоить:
http://htmlbook.ru/css/float для того, чтоб плитки шли одна за другой и переносились на следующую строку, когда текущая заполнится.

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

Ну и напоминаю про:
<MET A HTTP-EQUIV='X-UA-Compatible' CONTENT='text/html;IE=11'>


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

Вот и все решение, если вкратце:
<ht ml>
<head>
	<st yle>
		img {
			background: url(my_url.png) no-repeat center center #fff;
			width: 250px;
			height: 250px;
			float: left;
		}
	</style>
</head>
<body>
	<img/><img/><img/><img/><img/><img/><img/>
	<img/><img/><img/><img/><img/><img/><img/>
	<img/><img/><img/><img/><img/><img/><img/>
	<img/><img/><img/><img/><img/><img/><img/>
	<img/><img/><img/><img/><img/><img/><img/>
</body>
</html>
Показать


PS: адаптивность наше все, без нее любой кроссплатформенный интерфейс - не интерфейс.
Табличный документ 1с (если, конечно, мы говорим не про вывод на печать) тут не годиться.
Прикрепленные файлы:
test.html
fr13; PetrPan; beefit; +3 Ответить
3. Rustig 996 23.05.18 15:34 Сейчас в теме
(0) слишком мудрено решили задачу!
я бы упростил решение до вывода картинок в табличный документ без СКД - обычными методами Табличного документа.
не понял, в чем соль везде и повсюду использовать СКД?
СКД придумали для пользователей - чтобы они имели свой интерфейс настроек...
Serega-artem; Flover; +2 1 Ответить
4. Kutuzov 430 23.05.18 15:44 Сейчас в теме
(3) Лень прописывать формирование макета. А на СКД оно как-то все само...
atroxa; Jimbo; +2 Ответить
5. Rustig 996 23.05.18 15:46 Сейчас в теме
(4) сколько часов потратили на свою плитку?
есть типовые обработки для печати ценников - в виде вашей плитки
осталось вместо описания - картинки подставить
6. Kutuzov 430 23.05.18 15:55 Сейчас в теме
(5) Спасибо за еще один метод решения вопроса
wowik; Чародей; +2 Ответить
9. Serj1C 472 24.05.18 07:22 Сейчас в теме
Запросом вполне можно было получить номер колонки и строки, без предварительного заполнения запросом и циклом.
А тема вывода изображения как-то не раскрыта...
10. Kutuzov 430 24.05.18 08:09 Сейчас в теме
11. dusha0020 789 05.07.18 12:00 Сейчас в теме
(9) Согласен. Как-то так:
"
|ВЫБРАТЬ
|	Номенклатура.Ссылка,
|	1 КАК Единичка
|ПОМЕСТИТЬ НоменклатураПоОтбору
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|	Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаОтбор)
|	И Номенклатура.ЭтоГруппа = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО
|	Номенклатура.Ссылка
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	НоменклатураПоОтбору.Ссылка,
|	ВЫРАЗИТЬ((СУММА(ВложенныйЗапрос.Единичка) /&КвоСтолбцов - РазностьДат(ДатаВремя(1,1,1,0,0,0),ДобавитьКДате(ДатаВремя(1,1,1,0,0,0),СЕКУНДА,СУММА(ВложенныйЗапрос.Единичка)/&КвоСтолбцов-0.000000000001),СЕКУНДА)) * &КвоСтолбцов КАК ЧИСЛО(5,0)) КАК НомерСтолбца,
|	РазностьДат(ДатаВремя(1,1,1,0,0,0),ДобавитьКДате(ДатаВремя(1,1,1,0,0,0),СЕКУНДА,СУММА(ВложенныйЗапрос.Единичка)/&КвоСтолбцов-0.000000000001),СЕКУНДА)+1 КАК НомерСтроки
|ИЗ
|	НоменклатураПоОтбору КАК НоменклатураПоОтбору
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|			НоменклатураПоОтбору.Ссылка КАК Ссылка,
|			НоменклатураПоОтбору.Единичка КАК Единичка
|		ИЗ
|			НоменклатураПоОтбору КАК НоменклатураПоОтбору) КАК ВложенныйЗапрос
|		ПО НоменклатураПоОтбору.Ссылка >= ВложенныйЗапрос.Ссылка
|
|СГРУППИРОВАТЬ ПО
|	НоменклатураПоОтбору.Ссылка,
|	ВложенныйЗапрос.Единичка
|";
Показать
12. Kutuzov 430 05.07.18 13:09 Сейчас в теме
(11) Когда элегантность решения сильно мешает простоте (понимания кода), я выбираю простоту :)
13. dusha0020 789 05.07.18 13:40 Сейчас в теме
(12) Код только на вид кажется сложным. В общем-то все как у Вас реализовано, но из-за того, что в запросах 1С нельзя округлять вверх/вниз и использовать оператор "%" пришлось отсекать дробную часть через РАЗНОСТЬДАТ.
Писал для того, чтобы было понимание у читателей того, что такие задачи действительно можно решать в запросах. А уж использовать или нет - дело Ваше и их:)
14. Kutuzov 430 05.07.18 14:53 Сейчас в теме
(13) ну вообще да, глядя на ваши публикации, приведенный пример кода кажется уже не таким и сложным ;)
15. kondrat1C 52 31.07.18 14:14 Сейчас в теме
И даже если мы создаем СКД из другого макета, не основного, все равно вызывается эта процедура. Выхода тут два - либо вынести в модуль, где уже не будет перехватываться событие ПриКомпоновке, либо обработать отборы пользователя на уровне логики алгоритма


а что мешает переопределить обработку "ПриКомпоновкеРезультата" в модуле отчёта?

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

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


вот именно этот метод
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();

схлопывает Настройки, ПользовательскиеНастройки и ФиксированныеНастройки.
И в результате разработчику плевать какие там отборы наложил пользователь
Оставьте свое сообщение