Товар в упаковках и поштучно: быстрая смена единицы измерения (например, штрихкодом в чеке ККМ, Розница 2)
Дано: товар в приходит от поставщика и лежит на витрине в упаковках, а продавать планируется поштучно. Клеить ШК на каждую единицу товара из условного коробка нет возможности.
Клиент где-то видел, что в каком-то магазине кассиры считывают штрихкод с коробки, а в документ попадает штука.
Я предлагал:
1. Самое простое - продаешь в штуках, приходуй тоже в штуках. Но из-за особенностей бизнеса, такое не подходит.
2. Менять единицу измерения в самом документе "Чек ККМ". Такой вариант клиент не хочет, так как видит решение этой задачи более изящно.
По его замыслу: продавец сканирует ШК упаковки, а потом должна быть какая-то волшебная кнопка, которая подставляет не упаковку, а штуку найденной номенклатуры.
Или вместо кнопки клиент хочет вообще какой-то волшебный ШК, считав который, упаковка превратится в штуку.
Как можно красиво это реализовать?
Клиент где-то видел, что в каком-то магазине кассиры считывают штрихкод с коробки, а в документ попадает штука.
Я предлагал:
1. Самое простое - продаешь в штуках, приходуй тоже в штуках. Но из-за особенностей бизнеса, такое не подходит.
2. Менять единицу измерения в самом документе "Чек ККМ". Такой вариант клиент не хочет, так как видит решение этой задачи более изящно.
По его замыслу: продавец сканирует ШК упаковки, а потом должна быть какая-то волшебная кнопка, которая подставляет не упаковку, а штуку найденной номенклатуры.
Или вместо кнопки клиент хочет вообще какой-то волшебный ШК, считав который, упаковка превратится в штуку.
Как можно красиво это реализовать?
Найденные решения
(6) Да, именно так, я сделал так, причем алкономенклатуре даже не нужно иметь штрихкод вообще, он создастся программно, но один нюанс, акцизную марку приходится сканить дважды
&НаКлиенте
Процедура Расш_ДС_ККМВнешнееСобытие(Источник, Событие, Данные)
УстановитьВыполнениеОбработчиковСобытия(Ложь);
СтандартнаяОбработка = Ложь;
Если СтрДлина(Данные)=68 Тогда
Данные=Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(Данные);
Если ПустаяСтрока(Данные) Тогда
ПоказатьПредупреждение(,"Данные не найдены",2);
КонецЕсли;
КонецЕсли;
Если ВводДоступен() Тогда
Если ВыполнятьЗамерыПроизводительности Тогда
ТекущееВремяНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
КонецЕсли;
ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудованияРМК(ЭтотОбъект, Источник, Событие, Данные, ИсполняемаяОперацияЛогирования);
Если ВыполнятьЗамерыПроизводительности Тогда
ЗафиксироватьЗамерВремени();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(ШтрихКодЕГАИС)
АлкоКод=Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС);
Запрос=Новый Запрос;
Запрос.УстановитьПараметр("АлкоКод", АлкоКод);
Запрос.УстановитьПараметр("ТипШтрихкода",ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СоответствиеНоменклатурыЕГАИС.Номенклатура,
| ЕСТЬNULL(Штрихкоды.Штрихкод, """") КАК Штрихкод
|ИЗ
| РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК СоответствиеНоменклатурыЕГАИС
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
| ПО СоответствиеНоменклатурыЕГАИС.Номенклатура = Штрихкоды.Владелец
| И (Штрихкоды.ТипШтрихкода = &ТипШтрихкода)
|ГДЕ
| СоответствиеНоменклатурыЕГАИС.АлкогольнаяПродукция.Код = &АлкоКод";
Выборка=Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Штрихкод=Выборка.Штрихкод;
Если ПустаяСтрока(Выборка.Штрихкод) Тогда
Штрихкод=ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
РегШК = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
РегШК.Штрихкод=Штрихкод;
РегШК.Владелец=Выборка.Номенклатура;
РегШК.ТипШтрихкода=ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
РегШК.Записать();
КонецЕсли;
Возврат Штрихкод;
Иначе
Возврат "";
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС)
Зн = Сред(ШтрихКодЕГАИС,8,12);
Рез = 0;
Для Х = 1 По 12 Цикл
М = 1;
Для У = 1 По 12-Х Цикл
М = М*36
КонецЦикла;
Рез=Рез+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Зн,Х,1))-1)*М;
КонецЦикла;
Возврат (Формат(Рез, "ЧЦ=19; ЧВН=; ЧГ="));
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Да, конечно все упирается в поступление. Товар будет приходить в упаковках. И соответственно штрихкоды будут привязаны к упаковке.
Я понимаю, что допиливать надо. Не пойму как.
Алгоритм типа такого:
Я понимаю, что допиливать надо. Не пойму как.
Алгоритм типа такого:
Сканируем ШК. Добавляется строка с номенклатурой в документ.
Жмем какую-то кнопку или, как хочет клиент, считываем специальный ШК, и вместо упаковки ставим "штуку" этой номенклатуры в поле ЕдиницаИзмерения и пересчитываем цену номенклатуры.
Жмем какую-то кнопку или, как хочет клиент, считываем специальный ШК, и вместо упаковки ставим "штуку" этой номенклатуры в поле ЕдиницаИзмерения и пересчитываем цену номенклатуры.
(5) А что если настроить в сканере ШК на кассе префикс (или суффикс) штрих-кода. Произвольный символ, например букву Z.
Складской сканер не трогать.
Когда работает складской сканер, он считает, например, 2900000005686 и это будет соответствовать упаковке. А когда работает сканер на кассе, он считает этот же ШК как Z2900000005686, и это уже будет соответствовать одной единице из упаковки.
Некоторое неудобство будет в том, что сканер на кассе будет добавлять ко всему, что считает префикс, и к "обычному" товару, который продается самым обычным способом без этих манипуляций придется прикреплять два штрих-кода, например 4893729011893 и Z4893729011893 на одну и ту же единицу хранения. Что бы это не было большой проблемой можно, например, поставить на кассу два сканера (он стоит 2200 руб.), один с префиксом, другой без, ну или написать небольшую внешнюю обработку, которая будет выявлять ШК без префикса и "клонировать" его с префиксом.
Складской сканер не трогать.
Когда работает складской сканер, он считает, например, 2900000005686 и это будет соответствовать упаковке. А когда работает сканер на кассе, он считает этот же ШК как Z2900000005686, и это уже будет соответствовать одной единице из упаковки.
Некоторое неудобство будет в том, что сканер на кассе будет добавлять ко всему, что считает префикс, и к "обычному" товару, который продается самым обычным способом без этих манипуляций придется прикреплять два штрих-кода, например 4893729011893 и Z4893729011893 на одну и ту же единицу хранения. Что бы это не было большой проблемой можно, например, поставить на кассу два сканера (он стоит 2200 руб.), один с префиксом, другой без, ну или написать небольшую внешнюю обработку, которая будет выявлять ШК без префикса и "клонировать" его с префиксом.
(1) если ничего не допиливать, то так и есть продавец сканирует ШК, а в базе ШК лежит на штуках или штучных упаковках.
Проблема возникнет только если при поступлении будут ШК использовать, а ему вместо упаковки нужно будет пихать штуку.
Поэтому задача описана не до конца.
Проблема возникнет только если при поступлении будут ШК использовать, а ему вместо упаковки нужно будет пихать штуку.
Поэтому задача описана не до конца.
(1) я для РМК Розницы делал расширение в котором подменял действие обработчика ВнешнееСобытие, чтобы можно было искать товар по алкокоду
в вашем случае можно поступить аналогично, найти номенклатуру по штрихкоду упаковки и в переменную Данные вернуть штрихкод штучный
&НаКлиенте
Процедура Расш_ДС_ККМВнешнееСобытие(Источник, Событие, Данные)
УстановитьВыполнениеОбработчиковСобытия(Ложь);
СтандартнаяОбработка = Ложь;
Если СтрДлина(Данные)=68 Тогда
Данные=Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(Данные);
Если ПустаяСтрока(Данные) Тогда
ПоказатьПредупреждение(,"Данные не найдены",2);
КонецЕсли;
КонецЕсли;
Показатьв вашем случае можно поступить аналогично, найти номенклатуру по штрихкоду упаковки и в переменную Данные вернуть штрихкод штучный
(4) Это интересно!
вот код процедуры:
Т.е. задача в том, чтобы в переменную Данные до вызова процедуры ВнешнееСобытиеОборудованияРМК() подсунуть штрихкод "штуки"?
вот код процедуры:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если ВводДоступен() Тогда
Если ВыполнятьЗамерыПроизводительности Тогда
ТекущееВремяНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
КонецЕсли;
Если Объект.Товары.Количество() = 0 Тогда
Объект.Дата = ТекущаяДата();
КонецЕсли;
ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудованияРМК(ЭтотОбъект, Источник, Событие, Данные, ИсполняемаяОперацияЛогирования);
Если ВыполнятьЗамерыПроизводительности Тогда
ЗафиксироватьЗамерВремени();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьТ.е. задача в том, чтобы в переменную Данные до вызова процедуры ВнешнееСобытиеОборудованияРМК() подсунуть штрихкод "штуки"?
(6) Да, именно так, я сделал так, причем алкономенклатуре даже не нужно иметь штрихкод вообще, он создастся программно, но один нюанс, акцизную марку приходится сканить дважды
&НаКлиенте
Процедура Расш_ДС_ККМВнешнееСобытие(Источник, Событие, Данные)
УстановитьВыполнениеОбработчиковСобытия(Ложь);
СтандартнаяОбработка = Ложь;
Если СтрДлина(Данные)=68 Тогда
Данные=Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(Данные);
Если ПустаяСтрока(Данные) Тогда
ПоказатьПредупреждение(,"Данные не найдены",2);
КонецЕсли;
КонецЕсли;
Если ВводДоступен() Тогда
Если ВыполнятьЗамерыПроизводительности Тогда
ТекущееВремяНачалаЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
КонецЕсли;
ПодключаемоеОборудованиеРТКлиент.ВнешнееСобытиеОборудованияРМК(ЭтотОбъект, Источник, Событие, Данные, ИсполняемаяОперацияЛогирования);
Если ВыполнятьЗамерыПроизводительности Тогда
ЗафиксироватьЗамерВремени();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьШтрихкодПоАлкоКоду(ШтрихКодЕГАИС)
АлкоКод=Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС);
Запрос=Новый Запрос;
Запрос.УстановитьПараметр("АлкоКод", АлкоКод);
Запрос.УстановитьПараметр("ТипШтрихкода",ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СоответствиеНоменклатурыЕГАИС.Номенклатура,
| ЕСТЬNULL(Штрихкоды.Штрихкод, """") КАК Штрихкод
|ИЗ
| РегистрСведений.СоответствиеНоменклатурыЕГАИС КАК СоответствиеНоменклатурыЕГАИС
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
| ПО СоответствиеНоменклатурыЕГАИС.Номенклатура = Штрихкоды.Владелец
| И (Штрихкоды.ТипШтрихкода = &ТипШтрихкода)
|ГДЕ
| СоответствиеНоменклатурыЕГАИС.АлкогольнаяПродукция.Код = &АлкоКод";
Выборка=Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Штрихкод=Выборка.Штрихкод;
Если ПустаяСтрока(Выборка.Штрихкод) Тогда
Штрихкод=ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
РегШК = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
РегШК.Штрихкод=Штрихкод;
РегШК.Владелец=Выборка.Номенклатура;
РегШК.ТипШтрихкода=ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
РегШК.Записать();
КонецЕсли;
Возврат Штрихкод;
Иначе
Возврат "";
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
Функция Расш_ДС_ККМ_ПолучитьАлкоКод(ШтрихКодЕГАИС)
Зн = Сред(ШтрихКодЕГАИС,8,12);
Рез = 0;
Для Х = 1 По 12 Цикл
М = 1;
Для У = 1 По 12-Х Цикл
М = М*36
КонецЦикла;
Рез=Рез+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Зн,Х,1))-1)*М;
КонецЦикла;
Возврат (Формат(Рез, "ЧЦ=19; ЧВН=; ЧГ="));
КонецФункции
Показать
(15) У меня получилось так.
А сама функция вот такая:
Поправили бы Вы меня?
Внешней обработкой функцию проверил. Возвращает то, что и требуется кодом.
Сканера под рукой нет, поэтому из РМК пока не проверил.
&НаКлиенте
&Вместо("ВнешнееСобытие")
Процедура Расш1_ВнешнееСобытиеВместо(Источник, Событие, Данные)
Данные = ПолучитьШтрихкодЕдиницыУпаковки(Данные);
// ниже код по умолчанию из конфигурации поставщика
Если ВводДоступен() Тогда
// ....
ПоказатьА сама функция вот такая:
Функция ПолучитьШтрихкодЕдиницыУпаковки(Код)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Владелец КАК Владелец,
| Штрихкоды.Упаковка КАК Упаковка
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод",Код);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверим есть ли упаковка у найденного штрихкода товара
Если Выборка.Упаковка = Справочники.УпаковкиНоменклатуры.ПустаяСсылка() Тогда
// упаковки нет, поэтому ничего не делаем и просто возвращаем начальный штрихкод
Возврат Код;
Иначе
// есть упаковка, поэтому создадим штрихкод на 1 штуку товара
// попробуем найти штрихкод для номенклатуры-владельца упаковки
Запрос2 = Новый Запрос;
Запрос2.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Владелец
| И Штрихкоды.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)";
Запрос2.УстановитьПараметр("Владелец", Выборка.Владелец);
ВыборкаЗапрос2 = Запрос2.Выполнить().Выбрать();
Если ВыборкаЗапрос2.Количество()<>0 Тогда
Пока ВыборкаЗапрос2.Следующий() Цикл
Код = ВыборкаЗапрос2.Штрихкод;
КонецЦикла;
Возврат ВыборкаЗапрос2;
Иначе
// Если штрихкода для единицы нет, то создаем его и возвращаем значение
Менеджер = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
Менеджер.Владелец = Выборка.Владелец;
Менеджер.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
СформированныйШтрихкод = ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
Менеджер.Штрихкод = СформированныйШтрихкод;
Попытка
Менеджер.Записать();
Возврат СформированныйШтрихкод;
Исключение
Сообщить(ОписаниеОшибки());
Возврат Код;
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Код;
КонецФункции
ПоказатьПоправили бы Вы меня?
Внешней обработкой функцию проверил. Возвращает то, что и требуется кодом.
Сканера под рукой нет, поэтому из РМК пока не проверил.
(1)Стоит такая же задача. Мне в штуках несложно оприходовать. А есть ли возможность назначить одному товару 2 штрих кода?
Связано вот с чем. Бывает делимый товар со сроком годности. При продаже оставляю ту часть, где указан срок годности, а часть со штрихкодом ушла покупателю. Но есть штрих код на общей упаковке. Он отличается.
Связано вот с чем. Бывает делимый товар со сроком годности. При продаже оставляю ту часть, где указан срок годности, а часть со штрихкодом ушла покупателю. Но есть штрих код на общей упаковке. Он отличается.
А что мешает на штуки сформировать свой штрихкод и на коробку наклеить? Или вообще в тетрадь наклеить часто используемые штрихкоды? Если хотят универсальный ШК для перевода в штуки, то да, расширение запилить и там проверку сделать: если ШК для перевода в штуки, то стандартные обработчики не выполняем, а заменяем в строке/ТЧ упаковки на штуки
(7) клиент не хочет лишних телодвижений. Я бы сам просто приходовал и продавал в штуках и не парился. Но человек хочет по другому.
Да, и представьте, ведь на каждую коробку товара надо присобачить ШК штучного товара. А если там этих товаров коробочных много? В общем, это не подойдет.
Да, и представьте, ведь на каждую коробку товара надо присобачить ШК штучного товара. А если там этих товаров коробочных много? В общем, это не подойдет.
По его замыслу: продавец сканирует ШК упаковки, а потом должна быть какая-то волшебная кнопка, которая подставляет не упаковку, а штуку найденной номенклатуры.
Заведите константу "ПрдаватьВРозницуПоштучно" и в документе "Чек ККМ" при обработке подбора подставляйте единицу измерения штуки, если константа установлена в "Да". Всего делов-то.
Если надо продавец вернет на "упаковку" с пересчетом цены.
Стоит такая же задача. Мне в штуках несложно оприходовать. А есть ли возможность назначить одному товару 2 штрих кода?
Связано вот с чем. Бывает делимый товар со сроком годности. При продаже оставляю ту часть, где указан срок годности, а часть со штрихкодом ушла покупателю. Но есть штрих код на общей упаковке. Он отличается.
Связано вот с чем. Бывает делимый товар со сроком годности. При продаже оставляю ту часть, где указан срок годности, а часть со штрихкодом ушла покупателю. Но есть штрих код на общей упаковке. Он отличается.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот