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

28.01.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Вывод товаров в СКД как на весах в Ашане:
.epf 12,16Kb
8
8 Скачать (2 SM) Купить за 2 150 руб.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    161480    893    399    

873

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

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

15.05.2024    9097    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    7242    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3199    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10976    24    John_d    25    

124

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

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

05.12.2023    8260    PROSTO-1C    15    

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


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

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

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


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

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