Как в 1С:Розница 2 организовать быструю смену упаковки на штуки при сканировании штрихкода?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В розничной торговле часто возникает ситуация, когда товар поступает от поставщика и хранится на складе в упаковках (коробках, блоках), но продаваться должен поштучно. Основная сложность заключается в том, что штрихкод (ШК) нанесен только на общую упаковку, а клеить индивидуальные этикетки на каждую единицу внутри коробки трудозатратно или невозможно. Рассмотрим, как реализовать «изящное» решение, при котором кассир сканирует код с коробки, а в чеке ККМ автоматически появляется одна штука товара.

Анализ проблемы и постановка задачи

Типовой функционал 1С:Розница 2 предполагает, что если штрихкод привязан к конкретной упаковке, то при сканировании в документ будет подставлена именно эта упаковка. Клиенты часто просят реализовать «волшебную кнопку» или автоматическую подмену, чтобы избежать лишних действий кассира по ручному выбору единицы измерения. Разберем основные способы реализации этой задачи: от настроек системы до написания программного кода в расширении.

Способ 1. Программный перехват события сканирования (Расширение)

Это наиболее гибкий и автоматизированный метод. Мы создадим расширение, которое будет «подглядывать» в данные, приходящие от сканера, и, если это код упаковки, подменять его на код штучного товара еще до того, как типовой механизм обработки начнет поиск номенклатуры. Проанализируем программную реализацию в модуле формы ФормаРМК или ЧекККМ.

Нам потребуется перехватить процедуру ВнешнееСобытие. Основная логика заключается в поиске владельца штрихкода и проверке, является ли считанная единица упаковкой. Если да — мы находим или создаем штрихкод для базовой единицы (штуки).


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

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

Рассмотрим подробнее функцию генерации. В 1С:Розница есть встроенные методы для формирования штрихкодов в формате EAN13. Если мы не нашли штучный код, лучше его создать один раз, чтобы в будущем система работала быстрее.


&НаСервереБезКонтекста
Функция СгенерироватьИЗаписатьШтрихкодШтуки(Номенклатура)
    Менеджер = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
    Менеджер.Владелец = Номенклатура;
    Менеджер.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
    
    НовыйШК = ПодключаемоеОборудованиеРТВызовСервера.СформироватьШтрихкод();
    Менеджер.Штрихкод = НовыйШК;
    Менеджер.Упаковка = Справочники.УпаковкиНоменклатуры.ПустаяСсылка;
    
    Попытка
        Менеджер.Записать();
        Возврат НовыйШК;
    Исключение
        Возврат ""; // Ошибка записи
    КонецПопытки;
КонецФункции

Способ 2. Использование неуникальных штрихкодов

Выясним интересный нюанс конфигурации «1С:Розница». В отличие от «1С:Управление торговлей», розничная конфигурация позволяет назначать один и тот же штрихкод разным единицам измерения одного товара. Проанализируем, как это работает:

  1. Откройте карточку номенклатуры.
  2. Перейдите в список штрихкодов.
  3. Создайте штрихкод для упаковки (например, коробка 10 шт.).
  4. Создайте точно такой же штрихкод, но в поле Упаковка оставьте значение «Пусто» (штука).

В этом случае при сканировании в РМК система обнаружит два совпадения и выведет диалоговое окно с вопросом: «Что именно вы продаете?». Кассиру останется только выбрать «Штука». Это не автоматическая подмена, но штатный механизм, не требующий программирования.

Способ 3. Префиксы сканера и «волшебный штрихкод»

Рассмотрим ситуацию, когда клиент хочет сканировать специальный код, чтобы переключить режим работы. Посмотрим на техническую реализацию:

Программируем сканер так, чтобы при определенных условиях он добавлял префикс (например, букву "S" для Small). В расширении в процедуре ВнешнееСобытие проверяем: если Данные начинаются на "S", отрезаем этот символ и принудительно ищем товар в штуках. Это позволяет кассиру иметь на рабочем месте распечатанный управляющий штрихкод, после считывания которого сканер временно (или для следующей позиции) меняет логику подбора.

Способ 4. Настройка «Запрашивать упаковку»

В 1С:Розница существует стандартная настройка в карточке номенклатуры. Проанализируем её использование. Если установить флаг «Запрашивать упаковку при продаже», то вне зависимости от того, какой штрихкод был считан, система предложит выбрать единицу измерения из списка доступных. Это гарантирует, что кассир не продаст случайно целую коробку по цене одной штуки.

Резюме и рекомендации

Подведем итог. Выбор решения зависит от готовности менять код программы:

Рассмотренные методы позволяют эффективно решить проблему продажи поштучно из коробок, сохраняя при этом порядок в складском учете, где приход по-прежнему фиксируется в упаковках от поставщика.

← На главную