При работе в розничной торговле нередко возникает необходимость распечатать дубликат или копию чека, который был пробит некоторое время назад (например, час назад или в предыдущую смену). Типовая аппаратная команда фискального регистратора позволяет повторить только самый последний закрытый документ. Разберем, как обойти это ограничение и реализовать печать копии любого архивного чека средствами 1С и драйвера фискального регистратора.
В протоколе работы устройств компании «Штрих-М» предусмотрена команда повтора печати RepeatDocument, однако на аппаратном уровне она строго ограничена: устройство может повторно вывести только последний документ из оперативной памяти. Если после нужного чека был пробит хотя бы один другой фискальный или сервисный документ, воспользоваться штатной кнопкой повтора уже невозможно.
Кроме того, фискальный накопитель и фискальная память регистрируют только итоговые финансовые показатели и реквизиты фискализации, не сохраняя полный графический или текстовый макет для повторной печати. Поэтому задачу формирования внешнего вида копии чека необходимо брать на себя на уровне учетной системы 1С.
Проанализируем архитектуру решения. Хранить готовый строковый макет каждого напечатанного чека в информационной базе не требуется. Вся необходимая информация (наименование товаров, количество, цены, скидки, номер смены, номер чека, кассир и время) уже зафиксирована в типовых документах 1С (например, в документе Чек ККМ или Отчет о розничных продажах).
Для вывода дубликата формируется текстовый блок на лету и отправляется на фискальный регистратор в нефискальном режиме построчной печати.
Разберем по шагам, как настроить программный вывод копии документа через объект драйвера фискального регистратора.
AddIn.DrvFR) и проверяем связь с устройством.PrintStringWithFont или PrintString для последовательной отправки строк с товарными позициями, суммами и реквизитами организации.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();
КонецПроцедуры
Рассмотрим важные детали, которые необходимо учитывать при реализации текстовой печати:
руб..ResultCode или метод GetECRStatus.Выясним, какие еще существуют способы решения задачи, если прямая отправка команд через драйвер затруднена:
ТабличныйДокумент.Напечатать().