INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Кучма Дмитрий | Руководитель сектора программирования | Консорциум "Беркат"

«Автоматизация сети магазинов, централизация. Методика, приёмы, обучение персонала, решение проблем.»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

57

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

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

См. также

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


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

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

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


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

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