Товар в упаковках и поштучно: быстрая смена единицы измерения (например, штрихкодом в чеке ККМ, Розница 2)

1. AlexeyPapanov 459 24.04.18 18:44 Сейчас в теме
Дано: товар в приходит от поставщика и лежит на витрине в упаковках, а продавать планируется поштучно. Клеить ШК на каждую единицу товара из условного коробка нет возможности.

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

Я предлагал:
1. Самое простое - продаешь в штуках, приходуй тоже в штуках. Но из-за особенностей бизнеса, такое не подходит.
2. Менять единицу измерения в самом документе "Чек ККМ". Такой вариант клиент не хочет, так как видит решение этой задачи более изящно.
По его замыслу: продавец сканирует ШК упаковки, а потом должна быть какая-то волшебная кнопка, которая подставляет не упаковку, а штуку найденной номенклатуры.
Или вместо кнопки клиент хочет вообще какой-то волшебный ШК, считав который, упаковка превратится в штуку.

Как можно красиво это реализовать?
Вознаграждение за ответ
Показать полностью
Найденные решения
10. independ 1520 24.04.18 22:17 Сейчас в теме +3 $m
(6) Да, именно так, я сделал так, причем алкономенклатуре даже не нужно иметь штрихкод вообще, он создастся программно, но один нюанс, акцизную марку приходится сканить дважды

&НаКлиенте
Процедура Расш_ДС_ККМВнешнееСобытие(Источник, Событие, Данные)
	
	УстановитьВыполнениеОбработчиковСобытия(Ложь);	
	
	СтандартнаяОбработка = Ложь;
	
	Если СтрДлина(Данные)=68 Тогда
		Данные=Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(Данные);
		Если ПустаяСтрока(Данные) Тогда
			ПоказатьПредупреждение(,"Данные не найдены",2);
		КонецЕсли;	
	КонецЕсли;	
	
	Если ВводДоступен() Тогда
		
		Если ВыполнятьЗамерыПроизводительности Тогда
			ТекущееВремяНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
		КонецЕсли;
		
		ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудованияРМК(ЭтотОбъект, Источник, Событие, Данные, ИсполняемаяОперацияЛогирования);
		
		Если ВыполнятьЗамерыПроизводительности Тогда
			ЗафиксироватьЗамерВремени();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(ШтрихКодЕГАИС)
	АлкоКод=Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС);
	Запрос=Новый Запрос;
	Запрос.УстановитьПараметр("АлкоКод", АлкоКод);
	Запрос.УстановитьПараметр("ТипШтрихкода",ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СоответствиеНоменклатурыЕГАИС.Номенклатура,
	|	ЕСТЬNULL(Штрихкоды.Штрихкод, """") КАК Штрихкод
	|ИЗ
	|	РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК СоответствиеНоменклатурыЕГАИС
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
	|		ПО СоответствиеНоменклатурыЕГАИС.Номенклатура = Штрихкоды.Владелец
	|			И (Штрихкоды.ТипШтрихкода = &ТипШтрихкода)
	|ГДЕ
	|	СоответствиеНоменклатурыЕГАИС.АлкогольнаяПродукция.Код = &АлкоКод";
	Выборка=Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Штрихкод=Выборка.Штрихкод;
		Если ПустаяСтрока(Выборка.Штрихкод) Тогда
			Штрихкод=ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
			РегШК = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
			РегШК.Штрихкод=Штрихкод;
			РегШК.Владелец=Выборка.Номенклатура;
			РегШК.ТипШтрихкода=ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
			РегШК.Записать();
		КонецЕсли;	
		Возврат Штрихкод;
	Иначе
		Возврат "";
	КонецЕсли;	
КонецФункции	

&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС)
	Зн = Сред(ШтрихКодЕГАИС,8,12);
	Рез = 0;
	Для Х = 1 По 12 Цикл
		М = 1;
		Для У = 1 По 12-Х Цикл
			М = М*36 
		КонецЦикла;
		Рез=Рез+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Зн,Х,1))-1)*М;
	КонецЦикла;
	Возврат (Формат(Рез, "ЧЦ=19; ЧВН=; ЧГ="));
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kuld 248 24.04.18 19:03 Сейчас в теме
(1) А на приемке/инвентаризации ШК упаковки нужен? Если нет, то привязать ШК упаковки к штуке и забыть про ШК упаковки.
5. AlexeyPapanov 459 24.04.18 21:28 Сейчас в теме
(2) Да, конечно все упирается в поступление. Товар будет приходить в упаковках. И соответственно штрихкоды будут привязаны к упаковке.
Я понимаю, что допиливать надо. Не пойму как.

Алгоритм типа такого:
Сканируем ШК. Добавляется строка с номенклатурой в документ.
Жмем какую-то кнопку или, как хочет клиент, считываем специальный ШК, и вместо упаковки ставим "штуку" этой номенклатуры в поле ЕдиницаИзмерения и пересчитываем цену номенклатуры.
12. kuld 248 24.04.18 22:56 Сейчас в теме
(5) А что если настроить в сканере ШК на кассе префикс (или суффикс) штрих-кода. Произвольный символ, например букву Z.
Складской сканер не трогать.
Когда работает складской сканер, он считает, например, 2900000005686 и это будет соответствовать упаковке. А когда работает сканер на кассе, он считает этот же ШК как Z2900000005686, и это уже будет соответствовать одной единице из упаковки.
Некоторое неудобство будет в том, что сканер на кассе будет добавлять ко всему, что считает префикс, и к "обычному" товару, который продается самым обычным способом без этих манипуляций придется прикреплять два штрих-кода, например 4893729011893 и Z4893729011893 на одну и ту же единицу хранения. Что бы это не было большой проблемой можно, например, поставить на кассу два сканера (он стоит 2200 руб.), один с префиксом, другой без, ну или написать небольшую внешнюю обработку, которая будет выявлять ШК без префикса и "клонировать" его с префиксом.
3. Xershi 1481 24.04.18 19:10 Сейчас в теме
(1) если ничего не допиливать, то так и есть продавец сканирует ШК, а в базе ШК лежит на штуках или штучных упаковках.
Проблема возникнет только если при поступлении будут ШК использовать, а ему вместо упаковки нужно будет пихать штуку.
Поэтому задача описана не до конца.
4. independ 1520 24.04.18 20:35 Сейчас в теме
(1) я для РМК Розницы делал расширение в котором подменял действие обработчика ВнешнееСобытие, чтобы можно было искать товар по алкокоду

&НаКлиенте
Процедура Расш_ДС_ККМВнешнееСобытие(Источник, Событие, Данные)
	
	УстановитьВыполнениеОбработчиковСобытия(Ложь);	
	
	СтандартнаяОбработка = Ложь;
	
	Если СтрДлина(Данные)=68 Тогда
		Данные=Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(Данные);
		Если ПустаяСтрока(Данные) Тогда
			ПоказатьПредупреждение(,"Данные не найдены",2);
		КонецЕсли;	
	КонецЕсли;	
Показать

в вашем случае можно поступить аналогично, найти номенклатуру по штрихкоду упаковки и в переменную Данные вернуть штрихкод штучный
6. AlexeyPapanov 459 24.04.18 21:38 Сейчас в теме
(4) Это интересно!
вот код процедуры:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	
	Если ВводДоступен() Тогда
		
		Если ВыполнятьЗамерыПроизводительности Тогда
			ТекущееВремяНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
		КонецЕсли;
		Если Объект.Товары.Количество() = 0 Тогда
			Объект.Дата = ТекущаяДата();
		КонецЕсли;
		
		ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудованияРМК(ЭтотОбъект, Источник, Событие, Данные, ИсполняемаяОперацияЛогирования);
		
		Если ВыполнятьЗамерыПроизводительности Тогда
			ЗафиксироватьЗамерВремени();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
Показать


Т.е. задача в том, чтобы в переменную Данные до вызова процедуры ВнешнееСобытиеОборудованияРМК() подсунуть штрихкод "штуки"?
10. independ 1520 24.04.18 22:17 Сейчас в теме +3 $m
(6) Да, именно так, я сделал так, причем алкономенклатуре даже не нужно иметь штрихкод вообще, он создастся программно, но один нюанс, акцизную марку приходится сканить дважды

&НаКлиенте
Процедура Расш_ДС_ККМВнешнееСобытие(Источник, Событие, Данные)
	
	УстановитьВыполнениеОбработчиковСобытия(Ложь);	
	
	СтандартнаяОбработка = Ложь;
	
	Если СтрДлина(Данные)=68 Тогда
		Данные=Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(Данные);
		Если ПустаяСтрока(Данные) Тогда
			ПоказатьПредупреждение(,"Данные не найдены",2);
		КонецЕсли;	
	КонецЕсли;	
	
	Если ВводДоступен() Тогда
		
		Если ВыполнятьЗамерыПроизводительности Тогда
			ТекущееВремяНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
		КонецЕсли;
		
		ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудованияРМК(ЭтотОбъект, Источник, Событие, Данные, ИсполняемаяОперацияЛогирования);
		
		Если ВыполнятьЗамерыПроизводительности Тогда
			ЗафиксироватьЗамерВремени();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(ШтрихКодЕГАИС)
	АлкоКод=Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС);
	Запрос=Новый Запрос;
	Запрос.УстановитьПараметр("АлкоКод", АлкоКод);
	Запрос.УстановитьПараметр("ТипШтрихкода",ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СоответствиеНоменклатурыЕГАИС.Номенклатура,
	|	ЕСТЬNULL(Штрихкоды.Штрихкод, """") КАК Штрихкод
	|ИЗ
	|	РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК СоответствиеНоменклатурыЕГАИС
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
	|		ПО СоответствиеНоменклатурыЕГАИС.Номенклатура = Штрихкоды.Владелец
	|			И (Штрихкоды.ТипШтрихкода = &ТипШтрихкода)
	|ГДЕ
	|	СоответствиеНоменклатурыЕГАИС.АлкогольнаяПродукция.Код = &АлкоКод";
	Выборка=Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Штрихкод=Выборка.Штрихкод;
		Если ПустаяСтрока(Выборка.Штрихкод) Тогда
			Штрихкод=ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
			РегШК = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
			РегШК.Штрихкод=Штрихкод;
			РегШК.Владелец=Выборка.Номенклатура;
			РегШК.ТипШтрихкода=ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
			РегШК.Записать();
		КонецЕсли;	
		Возврат Штрихкод;
	Иначе
		Возврат "";
	КонецЕсли;	
КонецФункции	

&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС)
	Зн = Сред(ШтрихКодЕГАИС,8,12);
	Рез = 0;
	Для Х = 1 По 12 Цикл
		М = 1;
		Для У = 1 По 12-Х Цикл
			М = М*36 
		КонецЦикла;
		Рез=Рез+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Зн,Х,1))-1)*М;
	КонецЦикла;
	Возврат (Формат(Рез, "ЧЦ=19; ЧВН=; ЧГ="));
КонецФункции
Показать
14. AlexeyPapanov 459 25.04.18 10:07 Сейчас в теме
(10) А зачем Вы эти две строчки пишете?
	УстановитьВыполнениеОбработчиковСобытия(Ложь);    

	СтандартнаяОбработка = Ложь;

Ведь по сути обработчики можно не отключать?
15. independ 1520 25.04.18 10:41 Сейчас в теме
(14) Этот код еще для платформы 8.3.8 и ниже, а для 8.3.9-10 можно/нужно сделать иначе
16. AlexeyPapanov 459 25.04.18 11:12 Сейчас в теме
(15) У меня получилось так.

&НаКлиенте
&Вместо("ВнешнееСобытие")
Процедура Расш1_ВнешнееСобытиеВместо(Источник, Событие, Данные)
	
	Данные = ПолучитьШтрихкодЕдиницыУпаковки(Данные);
	
	// ниже код по умолчанию из конфигурации поставщика
	Если ВводДоступен() Тогда
	// ....
Показать


А сама функция вот такая:

Функция ПолучитьШтрихкодЕдиницыУпаковки(Код)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Штрихкоды.Владелец КАК Владелец,
		|	Штрихкоды.Упаковка КАК Упаковка
		|ИЗ
		|	РегистрСведений.Штрихкоды КАК Штрихкоды
		|ГДЕ
		|	Штрихкоды.Штрихкод = &Штрихкод";
	
	Запрос.УстановитьПараметр("Штрихкод",Код);
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		// Проверим есть ли упаковка у найденного штрихкода товара
		Если Выборка.Упаковка = Справочники.УпаковкиНоменклатуры.ПустаяСсылка() Тогда
			// упаковки нет, поэтому ничего не делаем и просто возвращаем начальный штрихкод
			Возврат Код;
		Иначе
			// есть упаковка, поэтому создадим штрихкод на 1 штуку товара
			// попробуем найти штрихкод для номенклатуры-владельца упаковки
			
			Запрос2 = Новый Запрос;
			Запрос2.Текст = 
				"ВЫБРАТЬ ПЕРВЫЕ 1
				|	Штрихкоды.Штрихкод КАК Штрихкод
				|ИЗ
				|	РегистрСведений.Штрихкоды КАК Штрихкоды
				|ГДЕ
				|	Штрихкоды.Владелец = &Владелец
				|	И Штрихкоды.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)";
			
			Запрос2.УстановитьПараметр("Владелец", Выборка.Владелец);
			ВыборкаЗапрос2 = Запрос2.Выполнить().Выбрать();
			
			Если ВыборкаЗапрос2.Количество()<>0 Тогда
				
				Пока ВыборкаЗапрос2.Следующий() Цикл
					Код = ВыборкаЗапрос2.Штрихкод;
				КонецЦикла;
				Возврат ВыборкаЗапрос2;
			
			Иначе
				// Если штрихкода для единицы нет, то создаем его и возвращаем значение
			
				Менеджер = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
				Менеджер.Владелец = Выборка.Владелец;
				Менеджер.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
				
				СформированныйШтрихкод = ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
				
				Менеджер.Штрихкод = СформированныйШтрихкод;
				Попытка 			
					Менеджер.Записать();
					Возврат СформированныйШтрихкод;
				Исключение
					Сообщить(ОписаниеОшибки());
					Возврат Код;
				КонецПопытки;

			КонецЕсли;
		КонецЕсли;
	КонецЦикла;	
	
	Возврат Код;
КонецФункции
Показать


Поправили бы Вы меня?

Внешней обработкой функцию проверил. Возвращает то, что и требуется кодом.

Сканера под рукой нет, поэтому из РМК пока не проверил.
20. independ 1520 25.04.18 14:46 Сейчас в теме
(16) Да все ок, а для проверки сканер в РМК и не нужен, откройте панель нижних кнопок, там есть кнопка ввести штрихкод
28. AlexeyPapanov 459 25.04.18 17:37 Сейчас в теме
(20) Спасибо, Дмитрий! Очень помогли! Кстати, в РМК кнопка на форме это другая процедура. Но через нее я смог проверить работу кода. Ну и через ВнешнееСобытие тоже подмена ШК проходит как надо.
22. RocKeR_13 1321 25.04.18 15:10 Сейчас в теме
(1) при использовании неуникальных штрихкодов можно один ШК назначить как на штуку, так и на упаковку
Прикрепленные файлы:
23. Xershi 1481 25.04.18 15:28 Сейчас в теме
(22) в УТ 11.3 регистр сведений ШтрихкодыНоменклатуры имеет только 1 измерение штрих код. Что вы попробовали и какая у вас структура регистра не известно.
24. RocKeR_13 1321 25.04.18 15:52 Сейчас в теме
(23) в УТ да, до сих пор не сделали неуникальные штрихкоды. Но мы вроде в разделе 1С:Розница)
25. Xershi 1481 25.04.18 15:54 Сейчас в теме
(24) ну если там сделали измерение упаковка, то автору сам бог велел использовать этот механизм!
26. RocKeR_13 1321 25.04.18 15:56 Сейчас в теме
Ну вот я и приводил пример из типовой розницы
30. user1529982 24.01.21 13:45 Сейчас в теме
(1)Стоит такая же задача. Мне в штуках несложно оприходовать. А есть ли возможность назначить одному товару 2 штрих кода?
Связано вот с чем. Бывает делимый товар со сроком годности. При продаже оставляю ту часть, где указан срок годности, а часть со штрихкодом ушла покупателю. Но есть штрих код на общей упаковке. Он отличается.
7. RocKeR_13 1321 24.04.18 21:45 Сейчас в теме
А что мешает на штуки сформировать свой штрихкод и на коробку наклеить? Или вообще в тетрадь наклеить часто используемые штрихкоды? Если хотят универсальный ШК для перевода в штуки, то да, расширение запилить и там проверку сделать: если ШК для перевода в штуки, то стандартные обработчики не выполняем, а заменяем в строке/ТЧ упаковки на штуки
8. AlexeyPapanov 459 24.04.18 21:48 Сейчас в теме
(7) клиент не хочет лишних телодвижений. Я бы сам просто приходовал и продавал в штуках и не парился. Но человек хочет по другому.
Да, и представьте, ведь на каждую коробку товара надо присобачить ШК штучного товара. А если там этих товаров коробочных много? В общем, это не подойдет.
9. RocKeR_13 1321 24.04.18 21:51 Сейчас в теме
(8) Эти клиенты хотят ИИ, к тому же читающий мысли))) А потом сами не поймут, что там в чем хранится и почему отчеты показывают не то, что на самом деле)
11. RocKeR_13 1321 24.04.18 22:28 Сейчас в теме
(8) кстати, а если запилить один ШК и на штуки, и на упаковку? Розница будет спрашивать, что выбрать
13. Xershi 1481 25.04.18 02:25 Сейчас в теме
(11) ШТ это измерение в регистре в 1 экземпляре. Так сделать нельзя!
21. RocKeR_13 1321 25.04.18 15:05 Сейчас в теме
(13) Только что попробовал: отлично работает)
Прикрепленные файлы:
17. trdm 25.04.18 11:23 Сейчас в теме
По его замыслу: продавец сканирует ШК упаковки, а потом должна быть какая-то волшебная кнопка, которая подставляет не упаковку, а штуку найденной номенклатуры.

Заведите константу "ПрдаватьВРозницуПоштучно" и в документе "Чек ККМ" при обработке подбора подставляйте единицу измерения штуки, если константа установлена в "Да". Всего делов-то.
Если надо продавец вернет на "упаковку" с пересчетом цены.
18. AlexeyPapanov 459 25.04.18 11:52 Сейчас в теме
(17) Способ с перехватом штрихкода не требует создания констант. Т.е. можно не снимать конфигурацию с поддержки. Да и по объему кода все примерно одинаково будет.
29. trdm 25.04.18 22:35 Сейчас в теме
(18) само собой константа всего лишь элемент настройки. Обзательной не является.
19. AlexCherdakov 20 25.04.18 13:36 Сейчас в теме
однозначно расширение и менять упаковку пришедшую из регистра Штрихкоды на единицу измерения из реквизита номенклатуры, Мишарину вознаграждение
27. AlexeyPapanov 459 25.04.18 17:35 Сейчас в теме
(19) Согласен! Он предложил решение, которое подошло клиенту.
Все работает как надо. Сегодня проверил на рабочей базе со сканером.
31. user1529982 24.01.21 14:22 Сейчас в теме
Стоит такая же задача. Мне в штуках несложно оприходовать. А есть ли возможность назначить одному товару 2 штрих кода?
Связано вот с чем. Бывает делимый товар со сроком годности. При продаже оставляю ту часть, где указан срок годности, а часть со штрихкодом ушла покупателю. Но есть штрих код на общей упаковке. Он отличается.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот