В процессе автоматизации розничной торговли перед разработчиками часто возникает задача кастомизации работы Рабочего места кассира (РМК). Типичный сценарий — необходимость распечатать предварительный чек (пречек) для клиента перед оплатой или провести документ ЧекККМ в базе данных без физической печати бумажной ленты и отправки данных в ОФД (например, при обучении персонала, тестировании или специфических бизнес-процессах). Рассмотрим подробнее, как решить эти задачи в конфигурации «1С:Розница» версий 2.3 и 3.0 с использованием механизма расширений.
Если нам необходимо провести документ ЧекККМ по учету (чтобы списать товары со склада и зафиксировать выручку), но при этом полностью исключить его фискализацию, нам потребуется обойти вызовы процедур Библиотеки подключаемого оборудования (БСП). Разберем по шагам, как это реализовать в расширении.
Основная задача — перехватить процесс пробития чека и перенаправить его в обход общего модуля МенеджерОборудованияКлиент. Проанализируем ситуацию: при обычном пробитии вызывается процедура фискализации чека. Мы можем добавить на форму РМК собственную кнопку «Провести без чека» и привязать к ней процедуру, выполняющую только запись и проведение документа.
Посмотрим на пример кода, который можно использовать в модуле формы РМК:
&НаКлиенте
Процедура Расш_ПробитьБезЧекаПоследовательность()
// Подготавливаем параметры для проведения чека мимо ККТ
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("БезПечатиЧека", Истина);
// Вызываем серверный метод записи и проведения документа
Если ЗаписатьИПровестиЧекНаСервере() Тогда
ПоказатьОповещениеПользователя("Успешно", , "Документ проведен по учету без отправки в ОФД", КартинкаОповещения.Информация);
ОчиститьФормуРМК();
КонецЕсли;
КонецПроцедуры
При этом на сервере документ записывается со статусом Пробит, но вызовы интеграции с ККТ подавляются. Этот подход сохраняет целостность партионного учета и складских остатков, а данные корректно попадут в итоговый ОтчетОРозничныхПродажах при закрытии кассовой смены.
Пречек необходим для предварительного ознакомления покупателя со списком товаров и ценами. В «1С:Розница» наиболее изящный способ реализации пречеков без изменения структуры метаданных — использование типового механизма отложенных чеков. Выясним причину, почему это выгодно: нам не нужно создавать новые объекты в метаданных, мы используем штатный функционал системы.
Алгоритм работы выглядит следующим образом:
Отложен с резервом.Рассмотрим пример программной генерации пречека на клиенте:
&НаКлиенте
Процедура Расш_СформироватьПречек(Команда)
// Шаг 1. Записываем чек как отложенный на сервере
СсылкаНаЧек = ЗаписатьЧекКакОтложенныйНаСервере();
Если ЗначениеЗаполнено(СсылкаНаЧек) Тогда
// Шаг 2. Отправляем нефискальный макет на печать
ПараметрыПечати = Новый Структура("СсылкаНаОбъект", СсылкаНаЧек);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Документ.ЧекККМ",
"ТоварныйЧек",
Новый Массив(СсылкаНаЧек),
ЭтотОбъект,
ПараметрыПечати
);
КонецЕсли;
КонецПроцедуры
Для того чтобы принтер чеков корректно печатал нефискальный чек без выдачи ошибок со стороны ФР, убедитесь, что в настройках КассыККМ правильно указан размер ленты, а сам макет оптимизирован под узкий формат печати.
Если перед вами стоит задача исключительно экономии кассовой ленты при сохранении полной легальности продаж, разрабатывать расширение с нуля не обязательно. В типовом решении «1С:Розница» уже заложен механизм электронных чеков.
Чтобы задействовать этот функционал, выполните следующие действия в интерфейсе программы:
В процессе разработки расширений для РМК часто возникает сложность: как передать управление или обменяться данными между основной формой РМК (Форма 1) и вспомогательной формой оплаты или выбора параметров (Форма 2) в клиентском контексте.
Для решения этой проблемы мы рекомендуем использовать встроенный в платформу «1С:Предприятие 8.3» механизм оповещений. Это наиболее безопасный способ, который гарантирует модульность кода и предотвращает ошибки при обновлениях конфигурации.
Рассмотрим подробнее реализацию этого механизма.
Шаг 1. Во вспомогательной форме (например, форме выбора параметров пречека) при нажатии кнопки подтверждения мы вызываем метод Оповестить:
&НаКлиенте
Процедура ПодтвердитьВыборОплаты(Команда)
ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("РежимБезПечати", Истина);
ПараметрыВыбора.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплат.Наличные"));
// Отправляем глобальное оповещение на клиенте
Оповестить("ЗавершитьОформлениеЧекаБезПечати", ПараметрыВыбора, ЭтотОбъект);
Закрыть();
КонецПроцедуры
Шаг 2. В основной форме РМК (в нашем расширении) мы перехватываем это событие через предопределенный обработчик ОбработкаОповещения:
&НаКлиенте
Процедура Расш_ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, наше ли это событие
Если ИмяСобытия = "ЗавершитьОформлениеЧекаБезПечати" Тогда
// Проверяем переданные параметры и запускаем процедуру проведения
Если Параметр.РежимБезПечати Тогда
Расш_ПробитьБезЧекаПоследовательность();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование связки Оповестить и ОбработкаОповещения позволяет избежать прямого обращения к элементам чужой формы через ВладелецФормы, что исключает возникновение ошибок времени выполнения (Runtime Errors) при изменении структуры типовых форм разработчиками «1С».
Для тестирования разработанного функционала без расхода кассовой ленты и угрозы заблокировать фискальный накопитель, всегда используйте «Эмулятор фискального регистратора». Его можно подключить в разделе Администрирование -> Подключаемое оборудование. Эмулятор полностью имитирует поведение реальной кассы, выводит макет чека на экран компьютера и позволяет отлаживать любые нестандартные алгоритмы печати пречеков в расширении.