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

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

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

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

Как можно красиво это реализовать?
Вознаграждение за ответ
Показать полностью
Найденные решения
10. independ 1519 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 458 24.04.18 21:28 Сейчас в теме
(2) Да, конечно все упирается в поступление. Товар будет приходить в упаковках. И соответственно штрихкоды будут привязаны к упаковке.
Я понимаю, что допиливать надо. Не пойму как.

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

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

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


Т.е. задача в том, чтобы в переменную Данные до вызова процедуры ВнешнееСобытиеОборудованияРМК() подсунуть штрихкод "штуки"?
10. independ 1519 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 458 25.04.18 10:07 Сейчас в теме
(10) А зачем Вы эти две строчки пишете?
	УстановитьВыполнениеОбработчиковСобытия(Ложь);    

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

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

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


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

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

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


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

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

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

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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)