Создание собственного интерфейса для кассира — задача, с которой часто сталкиваются разработчики при автоматизации небольших торговых точек или создании узкоспециализированных решений на базе 1С. Типовые РМК из конфигураций вроде «Розница» или «Управление торговлей» часто перегружены лишними связями и оборудованием. В этой статье мы разберем, как построить легкое и быстрое РМК, ориентируясь на конкретные потребности: палитру быстрых товаров, калькулятор и основные виды оплаты.
Для начала проанализируем, как должно выглядеть профессиональное окно кассира. Главное требование здесь — отсутствие отвлекающих факторов. Мы должны максимально ограничить доступ пользователя к основному интерфейсу системы. Разберем, как это реализовать технически.
Во-первых, при проектировании управляемой формы в свойстве РежимОткрытияОкна следует выбрать значение БлокироватьВесьИнтерфейс. Однако более профессиональным подходом будет использование режима рабочего стола. Рассмотрим программный способ настройки формы при открытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Скрываем панели навигации и разделов для текущего окна
ЭтаФорма.ОтображениеПанелиНавигации = Ложь;
ЭтаФорма.ТолькоПросмотр = Ложь;
// Устанавливаем полноэкранный режим
ЭтаФорма.РежимРабочегоСтола = Истина;
КонецПроцедуры
Такой подход гарантирует, что кассир будет работать в чистом интерфейсе, где все внимание сосредоточено на подборе товаров и расчетах с покупателем.
Палитра быстрых товаров — это графическая сетка кнопок с наиболее востребованными позициями (хлеб, пакеты и т.д.). Вместо того чтобы рисовать каждую кнопку вручную в конфигураторе, мы реализуем механизм динамического создания элементов. Это позволит администратору магазина самостоятельно менять список быстрых товаров через справочник без участия программиста.
Выясним алгоритм создания такой палитры. Сначала создадим в справочнике Номенклатура дополнительный реквизит (флаг) «БыстрыйТовар». Затем при создании формы на сервере программно сформируем кнопки:
&НаСервере
Процедура СоздатьПалитруКнопок()
// Выбираем товары, отмеченные как быстрые
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.БыстрыйТовар = ИСТИНА";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ИмяКнопки = "КнопкаТовар_" + СтрЗаменить(Строка(Результат.Ссылка.УникальныйИдентификатор()), "-", "");
НовыйЭлемент = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), Элементы.ГруппаПалитра);
НовыйЭлемент.Заголовок = Результат.Наименование;
НовыйЭлемент.ИмяКоманды = "КомандаВыборТовара";
КонецЦикла;
КонецПроцедуры
Важно назначить всем кнопкам одну общую команду КомандаВыборТовара. Внутри этой команды мы будем определять, на какой товар нажал пользователь, используя свойство кнопки Имя или дополнительные параметры, сохраненные в структуре на сервере.
Любое РМК должно поддерживать работу со сканером штрихкодов. Рассмотрим ситуацию, когда мы не хотим внедрять всю тяжелую Библиотеку Подключаемого Оборудования (БПО), но нам нужен надежный отклик. Проанализируем механизм «Внешнее событие».
Для корректной работы сканера форма должна уметь перехватывать данные. В коде формы обязательно должна присутствовать предопределенная процедура ВнешнееСобытие. Рассмотрим пример обработки данных:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Событие = "Barcode" Тогда
Штрихкод = СокрЛП(Данные);
// Вызываем серверную процедуру поиска товара по штрихкоду
ДобавитьТоварВЧекПоШтрихкоду(Штрихкод);
КонецЕсли;
КонецПроцедуры
Если вы используете современное оборудование, крайне рекомендуем подключить хотя бы «облегченный» модуль БПО для работы с драйверами. Это избавит вас от проблем с разными типами интерфейсов сканеров (COM, клавиатурный клин, USB-HID).
Кассиру необходимо видеть итоговую сумму и быстро рассчитывать сдачу. Разберем, как организовать этот блок данных. Для этого используем декорации (надписи) с увеличенным шрифтом для вывода итогов.
Проанализируем логику расчета трех видов оплаты: наличные, карта и смешанная оплата. Создадим на форме реквизиты СуммаНаличные, СуммаБезналичные и СуммаЧека. При изменении суммы наличных программа должна моментально считать сдачу:
&НаКлиенте
Процедура СуммаНаличныеПриИзменении(Элемент)
РассчитатьИтогиОплаты();
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьИтогиОплаты()
ВсегоОплачено = СуммаНаличные + СуммаБезналичные;
Сдача = ВсегоОплачено - Объект.СуммаДокумента;
Если Сдача < 0 Тогда
Элементы.НадписьСдача.Заголовок = "Недостаточно средств";
Иначе
Элементы.НадписьСдача.Заголовок = Формат(Сдача, "ЧЦ=15; ЧДЦ=2");
КонецЕсли;
КонецПроцедуры
Важный момент: Для удобства работы без мыши назначьте кнопкам быстрые клавиши (HotKeys). Например, клавиша F12 может вызывать процедуру пробития чека, а клавиша + на цифровой клавиатуре — переходить в поле ввода суммы наличных.
Скорость работы РМК напрямую влияет на очереди в магазине. Выясним, как ускорить поиск товара и расчет цен. Постоянное обращение к базе данных при каждом сканировании — плохая практика.
Рассмотрим вариант кэширования цен и остатков. При открытии формы РМК мы можем выгрузить актуальные цены для «быстрых товаров» в таблицу значений на сервере и сохранить ее в РеквизитФормыВЗначение. Тогда при нажатии на кнопку в палитре цена будет подставляться мгновенно без запроса к базе. Также используйте временные таблицы (ТЗ на форме) для хранения состава текущего чека, и записывайте документ в базу только в момент финального нажатия кнопки «Пробить чек».
Даже в самописном РМК вы обязаны выдавать фискальный чек. Для этого потребуется интеграция с ККТ (контрольно-кассовой техникой). Самый простой путь — использовать драйверы от производителей (Атол, Штрих-М) через их COM-объекты или компоненты.
Проанализируем минимальный набор команд для печати:
ПодключитьОборудование() — инициализация связи с кассой.ОткрытьЧек() — регистрация начала операции.Регистрация() — отправка каждой позиции из табличной части чека в ККТ.ЗакрытьЧек() — финальная печать и отправка данных в ОФД.Использование стандартных методов 1С из состава БПО, таких как ВыполнитьКоманду("PrintCheck"), значительно упростит вам жизнь, так как они автоматически формируют структуру XML-пакета, необходимую для драйвера.
В завершение разберем визуальные аспекты. Работа кассира связана с высокой нагрузкой на глаза.
Следуя этим шагам, мы создадим легкое, надежное и быстрое рабочее место, которое будет полностью отвечать потребностям конкретного бизнеса, не перегружая систему лишним функционалом.