Как повторно напечатать чек на фискальном регистраторе Штрих-М из 1С

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

При работе в розничной торговле нередко возникает необходимость распечатать дубликат или копию чека, который был пробит некоторое время назад (например, час назад или в предыдущую смену). Типовая аппаратная команда фискального регистратора позволяет повторить только самый последний закрытый документ. Разберем, как обойти это ограничение и реализовать печать копии любого архивного чека средствами 1С и драйвера фискального регистратора.

Аппаратные ограничения и специфика фискальных регистраторов

В протоколе работы устройств компании «Штрих-М» предусмотрена команда повтора печати RepeatDocument, однако на аппаратном уровне она строго ограничена: устройство может повторно вывести только последний документ из оперативной памяти. Если после нужного чека был пробит хотя бы один другой фискальный или сервисный документ, воспользоваться штатной кнопкой повтора уже невозможно.

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

Принцип реализации нефискальной копии чека

Проанализируем архитектуру решения. Хранить готовый строковый макет каждого напечатанного чека в информационной базе не требуется. Вся необходимая информация (наименование товаров, количество, цены, скидки, номер смены, номер чека, кассир и время) уже зафиксирована в типовых документах 1С (например, в документе Чек ККМ или Отчет о розничных продажах).

Для вывода дубликата формируется текстовый блок на лету и отправляется на фискальный регистратор в нефискальном режиме построчной печати.

Пошаговая реализация печати через COM-объект драйвера Штрих-М

Разберем по шагам, как настроить программный вывод копии документа через объект драйвера фискального регистратора.

  1. Инициализация драйвера. Получаем доступ к объекту драйвера торгового оборудования (обычно AddIn.DrvFR) и проверяем связь с устройством.
  2. Печать заголовка документа. Во избежание путаницы и претензий со стороны контролирующих органов копия чека обязательно должна содержать явное текстовое указание: ДУБЛИКАТ или КОПИЯ ЧЕКА.
  3. Построчный вывод данных. Используем метод драйвера PrintStringWithFont или PrintString для последовательной отправки строк с товарными позициями, суммами и реквизитами организации.
  4. Промотка и отрезка ленты. После завершения вывода текстовых строк вызываем команды продвижения ленты FeedDocument и полной или частичной отрезки чека CutCheck.

Посмотрим на пример процедуры вывода копии чека на печать:


Процедура НапечататьКопиюЧека(ОбъектДрайвера, ДокументСсылка)
    
    // Проверяем соединение с фискальным регистратором
    Если ОбъектДрайвера.Connect() <> 0 Тогда
        Сообщить("Ошибка подключения к фискальному регистратору: " + ОбъектДрайвера.ResultCodeDescription);
        Возврат;
    КонецЕсли;
    
    ШиринаЛенты = 36; // Стандартное количество символов в строке для узкой ленты
    
    // Печать заголовка чека
    ОбъектДрайвера.StringForPrinting = "========================================";
    ОбъектДрайвера.PrintString();
    
    // Вывод признака копии увеличенным или жирным шрифтом
    ОбъектДрайвера.FontType = 2; // Шрифт заголовка
    ОбъектДрайвера.StringForPrinting = "            КОПИЯ ЧЕКА";
    ОбъектДрайвера.PrintStringWithFont();
    
    ОбъектДрайвера.FontType = 1; // Возврат к стандартному шрифту
    ОбъектДрайвера.StringForPrinting = "Чек № " + СокрЛП(ДокументСсылка.НомерЧекаККМ) + " от " + Формат(ДокументСсылка.Дата, "ДЛФ=DT");
    ОбъектДрайвера.PrintString();
    
    ОбъектДрайвера.StringForPrinting = "Кассир: " + СокрЛП(ДокументСсылка.Ответственный);
    ОбъектДрайвера.PrintString();
    
    ОбъектДрайвера.StringForPrinting = "----------------------------------------";
    ОбъектДрайвера.PrintString();
    
    // Обход строк табличной части документа
    Для Каждого Стр Из ДокументСсылка.Товары Цикл
        Наименование = Лев(СокрЛП(Стр.Номенклатура.Наименование), ШиринаЛенты);
        ОбъектДрайвера.StringForPrinting = Наименование;
        ОбъектДрайвера.PrintString();
        
        СтрокаСуммы = СокрЛП(Стр.Количество) + " x " + Формат(Стр.Цена, "ЧДЦ=2; ЧГ=0") + " = " + Формат(Стр.Сумма, "ЧДЦ=2; ЧГ=0");
        ОбъектДрайвера.StringForPrinting = СтрокаСуммы;
        ОбъектДрайвера.PrintString();
    КонецЦикла;
    
    ОбъектДрайвера.StringForPrinting = "========================================";
    ОбъектДрайвера.PrintString();
    
    // Вывод итоговой суммы
    ОбъектДрайвера.FontType = 2;
    ОбъектДрайвера.StringForPrinting = "ИТОГ: " + Формат(ДокументСсылка.СуммаДокумента, "ЧДЦ=2; ЧГ=0");
    ОбъектДрайвера.PrintStringWithFont();
    
    // Промотка ленты и отрезка
    ОбъектДрайвера.StringQuantity = 4; // Количество строк для протяжки
    ОбъектДрайвера.FeedDocument();
    
    ОбъектДрайвера.CutType = 1; // 1 - неполная отрезка, 0 - полная
    ОбъектДрайвера.CutCheck();
    
КонецПроцедуры

Особенности и технические нюансы при выводе строк

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

  1. Форматирование и ширина строк. В зависимости от ширины используемой чековой ленты (57 мм или 80 мм) количество символов в одной строке варьируется от 36 до 48. Если строка превышает лимит, драйвер перенесет ее некорректно или обрежет. Рекомендуется программно разбивать длинные наименования номенклатуры на несколько строк.
  2. Спецсимволы и знаки валют. Внутренняя прошивка фискального регистратора в нефискальном режиме может не поддерживать печать некоторых специальных символов, поэтому цены и суммы следует форматировать стандартными цифровыми значениями с указанием рублей текстовым сокращением руб..
  3. Контроль ошибок оборудования. Если в процессе вывода строк в кассе закончится бумага, фискальный регистратор перейдет в состояние ошибки. Перед каждой отправкой или в цикле печати рекомендуется проверять состояние устройства через свойство ResultCode или метод GetECRStatus.

Альтернативные варианты печати копии чека

Выясним, какие еще существуют способы решения задачи, если прямая отправка команд через драйвер затруднена:

  1. Печать через Windows-драйвер принтера чеков. Если фискальный регистратор установлен в операционной системе как стандартный Windows-принтер, можно создать обычный табличный документ 1С с заданным размером страницы под ширину ленты и отправлять его на печать штатными методами платформы ТабличныйДокумент.Напечатать().
  2. Вывод товарного чека на стандартный принтер (формат А4/А5). В большинстве учетных конфигураций 1С уже предусмотрена типовая печатная форма товарного чека. Для покупателя такой документ с реквизитами организации и подписью кассира обладает полной юридической силой при подтверждении факта покупки.
← На главную