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

28.01.19

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

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

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

13000 руб.

02.09.2020    119912    656    389    

701

Генератор схемы компоновки данных (СКД), написание кода схемы программно

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

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

3 стартмани

05.02.2024    3889    24    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

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

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

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

СКД на JavaScript в 1С

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

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

2 стартмани

11.12.2023    8027    20    John_d    25    

122

Использование менеджера временных таблиц в СКД

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

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

05.12.2023    4528    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5708    15    kalyaka    5    

85

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

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

18.09.2023    6329    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

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

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

01.09.2023    4407    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. 🅵🅾️🆇 522 23.05.18 14:53 Сейчас в теме
Здорово.
Но всеже, как мне кажется, для такой задачи лучше использовать HTML/CSS, это добавит адаптивности и универсальности, хоть http запросом получай отчет :3
citicat; Vanch90; Soloist; +3 1 Ответить
2. RustIG 1301 23.05.18 15:31 Сейчас в теме
(1) вы решали когда-нибудь подобные задачи?
на чем основывается ваш совет? на личном опыте?
7. 🅵🅾️🆇 522 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
nbeliaev; PetrPan; beefit; +3 Ответить
8. пользователь 24.05.18 05:43
Сообщение было скрыто модератором.
...
3. RustIG 1301 23.05.18 15:34 Сейчас в теме
(0) слишком мудрено решили задачу!
я бы упростил решение до вывода картинок в табличный документ без СКД - обычными методами Табличного документа.
не понял, в чем соль везде и повсюду использовать СКД?
СКД придумали для пользователей - чтобы они имели свой интерфейс настроек...
Serega-artem; Flover; +2 1 Ответить
4. Kutuzov 736 23.05.18 15:44 Сейчас в теме
(3) Лень прописывать формирование макета. А на СКД оно как-то все само...
atroxa; Jimbo; +2 Ответить
5. RustIG 1301 23.05.18 15:46 Сейчас в теме
(4) сколько часов потратили на свою плитку?
есть типовые обработки для печати ценников - в виде вашей плитки
осталось вместо описания - картинки подставить
6. Kutuzov 736 23.05.18 15:55 Сейчас в теме
(5) Спасибо за еще один метод решения вопроса
wowik; Чародей; +2 Ответить
9. Serj1C 483 24.05.18 07:22 Сейчас в теме
Запросом вполне можно было получить номер колонки и строки, без предварительного заполнения запросом и циклом.
А тема вывода изображения как-то не раскрыта...
10. Kutuzov 736 24.05.18 08:09 Сейчас в теме
11. dusha0020 1103 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 736 05.07.18 13:09 Сейчас в теме
(11) Когда элегантность решения сильно мешает простоте (понимания кода), я выбираю простоту :)
13. dusha0020 1103 05.07.18 13:40 Сейчас в теме
(12) Код только на вид кажется сложным. В общем-то все как у Вас реализовано, но из-за того, что в запросах 1С нельзя округлять вверх/вниз и использовать оператор "%" пришлось отсекать дробную часть через РАЗНОСТЬДАТ.
Писал для того, чтобы было понимание у читателей того, что такие задачи действительно можно решать в запросах. А уж использовать или нет - дело Ваше и их:)
14. Kutuzov 736 05.07.18 14:53 Сейчас в теме
(13) ну вообще да, глядя на ваши публикации, приведенный пример кода кажется уже не таким и сложным ;)
15. kondrat1C 55 31.07.18 14:14 Сейчас в теме
И даже если мы создаем СКД из другого макета, не основного, все равно вызывается эта процедура. Выхода тут два - либо вынести в модуль, где уже не будет перехватываться событие ПриКомпоновке, либо обработать отборы пользователя на уровне логики алгоритма


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

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

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


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

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