Как реализовать печать пречека или проведение чека без пробития на фискальном регистраторе в РМК 1С:Розница?

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

В процессе автоматизации розничной торговли перед разработчиками часто возникает задача кастомизации работы Рабочего места кассира (РМК). Типичный сценарий — необходимость распечатать предварительный чек (пречек) для клиента перед оплатой или провести документ ЧекККМ в базе данных без физической печати бумажной ленты и отправки данных в ОФД (например, при обучении персонала, тестировании или специфических бизнес-процессах). Рассмотрим подробнее, как решить эти задачи в конфигурации «1С:Розница» версий 2.3 и 3.0 с использованием механизма расширений.

Метод 1. Проведение чека без фискализации (обход драйвера ККТ)

Если нам необходимо провести документ ЧекККМ по учету (чтобы списать товары со склада и зафиксировать выручку), но при этом полностью исключить его фискализацию, нам потребуется обойти вызовы процедур Библиотеки подключаемого оборудования (БСП). Разберем по шагам, как это реализовать в расширении.

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

Посмотрим на пример кода, который можно использовать в модуле формы РМК:


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

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

Метод 2. Реализация пречеков через статус «Отложен»

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

Алгоритм работы выглядит следующим образом:

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

Рассмотрим пример программной генерации пречека на клиенте:


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

Для того чтобы принтер чеков корректно печатал нефискальный чек без выдачи ошибок со стороны ФР, убедитесь, что в настройках КассыККМ правильно указан размер ленты, а сам макет оптимизирован под узкий формат печати.

Метод 3. Использование штатного функционала электронных чеков

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

Чтобы задействовать этот функционал, выполните следующие действия в интерфейсе программы:

  1. Перейдите в раздел НСИ, затем откройте справочник Кассы ККМ.
  2. В карточке вашей кассы установите флаг «Не печатать бумажный чек в РМК» (в некоторых версиях — выберите режим «Электронный чек»).
  3. При оформлении продажи в РМК кассир обязательно должен заполнить контактные данные покупателя (номер телефона или адрес электронной почты).
  4. После нажатия кнопки «Оплатить» ККТ зарегистрирует продажу в фискальном накопителе и отправит электронный чек покупателю через ОФД, однако физическая печать на кассовой ленте производиться не будет.

Решение проблемы взаимодействия форм на клиенте (Message 8)

В процессе разработки расширений для РМК часто возникает сложность: как передать управление или обменяться данными между основной формой РМК (Форма 1) и вспомогательной формой оплаты или выбора параметров (Форма 2) в клиентском контексте.

Для решения этой проблемы мы рекомендуем использовать встроенный в платформу «1С:Предприятие 8.3» механизм оповещений. Это наиболее безопасный способ, который гарантирует модульность кода и предотвращает ошибки при обновлениях конфигурации.

Рассмотрим подробнее реализацию этого механизма.

Шаг 1. Во вспомогательной форме (например, форме выбора параметров пречека) при нажатии кнопки подтверждения мы вызываем метод Оповестить:


&НаКлиенте
Процедура ПодтвердитьВыборОплаты(Команда)
    
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("РежимБезПечати", Истина);
    ПараметрыВыбора.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплат.Наличные"));
    
    // Отправляем глобальное оповещение на клиенте
    Оповестить("ЗавершитьОформлениеЧекаБезПечати", ПараметрыВыбора, ЭтотОбъект);
    
    Закрыть();
КонецПроцедуры

Шаг 2. В основной форме РМК (в нашем расширении) мы перехватываем это событие через предопределенный обработчик ОбработкаОповещения:


&НаКлиенте
Процедура Расш_ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    // Проверяем, наше ли это событие
    Если ИмяСобытия = "ЗавершитьОформлениеЧекаБезПечати" Тогда
        // Проверяем переданные параметры и запускаем процедуру проведения
        Если Параметр.РежимБезПечати Тогда
            Расш_ПробитьБезЧекаПоследовательность();
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Использование связки Оповестить и ОбработкаОповещения позволяет избежать прямого обращения к элементам чужой формы через ВладелецФормы, что исключает возникновение ошибок времени выполнения (Runtime Errors) при изменении структуры типовых форм разработчиками «1С».

Совет по отладке механизмов печати

Для тестирования разработанного функционала без расхода кассовой ленты и угрозы заблокировать фискальный накопитель, всегда используйте «Эмулятор фискального регистратора». Его можно подключить в разделе Администрирование -> Подключаемое оборудование. Эмулятор полностью имитирует поведение реальной кассы, выводит макет чека на экран компьютера и позволяет отлаживать любые нестандартные алгоритмы печати пречеков в расширении.

← На главную