Альтернативная печать чеков для термопринтеров. Хозяйке на заметку.

03.05.09

Интеграция - Периферийные устройства

Простой способ побороть медленную печать коротких документов на термопринтерах при кривых драйверах.

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

/* Конкретную модель принтера уже не помню, по-моему какой-то CITIZEN, просто вчера жаловался коллега на аналогичную проблему, так что решил вот написать заметку о том. что не обязательно мучаться и искать дрова, если можно "написать" их самому */

 Вот пример процедуры печати:

//******************************************************************************
// Печать(Докум)
//
// Параметры:
//  Нет
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//
Процедура Печать(Докум, Устройство=1, КолвоКопий=2)
 Перем НачПовт, КонПовт;
 Текст=СоздатьОбъект("Текст"); 
 Текст.КодоваяСтраница(1); 
 Текст.ДобавитьСтроку(симв(27)+"@"); //
 номердок=число(докум.номердок);  
 датадок=строка(докум.датадок);
 стр="";
 Текст.ДобавитьСтроку(СТр);
 Текст.ДобавитьСтроку(СТр);
 Стр=ФиксШаблон("Чек [номердок] от [датадок] ");
 Текст.ДобавитьСтроку(СТр);
 //Текст.ДобавитьСтроку("                Чек                  ");           
 Текст.ДобавитьСтроку(" №           Наименование                  ");    
 Текст.ДобавитьСтроку("  Код        количество     цена       сумма");
 Если Докум.Скидка.Выбран()=1 Тогда
  Врстр="Общ";     
  процент=Докум.Скидка.Процент*0.01;
 иначе
  Врстр="Сумма";
  процент=0;
 КонецЕсли;
 СчетчикЦикла = 0;
 // выводим табличную часть
 Н = 0;
 Докум.ВыбратьСтроки();
 ИтогоСкидка=0;
 Пока Докум.ПолучитьСтроку() = 1 Цикл
  Н = Н + 1;
  скидка=Окр(Докум.Цена*Докум.Количество*процент,2,0);
  ИтогоСкидка=ИтогоСкидка+скидка;
  Печкол=Докум.Количество;
  ПечНаим=СокрЛП(Докум.Номенклатура.Наименование);
  Печкод= СокрЛП(Докум.Номенклатура.Код);
  ПечЦена=Докум.Цена;
  ПечСумма=Докум.Сумма;
  Если Окр(Печкол)=Печкол тогда
   Печкол=Окр(Печкол);
  конецесли;          
  Стр=ФиксШаблон("[Н ] [ПечНаим                                 ] ");
  Текст.ДобавитьСтроку(СТр);
  Стр=ФиксШаблон("[ Печкод ]   [Печкол]    [ПечЦена]   [ПечСумма] ");
  Текст.ДобавитьСтроку(СТр);
 КонецЦикла;
 СуммаИтог = Докум.Итог("Сумма");
 Стр=ФиксШаблон(" Итого: [     СуммаИтог           ] руб.");
 Текст.ДобавитьСтроку(СТр);                           
 Стр=ФиксШаблон(" Итого скидка: [ ИтогоСкидка ] р.    ");
 Текст.ДобавитьСтроку(СТр);                           
 Стр="";
 Текст.ДобавитьСтроку(СТр);                           
 Текст.ДобавитьСтроку(симв(29)+симв(86)+симв(66)+симв(1));//Обрезать чек!!!
 ИмяФ=КаталогИб()+"Врем";
 Текст.Записать(имяФ);
 ФС.КопироватьФайл(ИмяФ+".txt","com1",1)  ; 
 ФС.КопироватьФайл(ИмяФ+".txt","com1",1)  ; 
КонецПроцедуры // Печать()

Сами ESC-последовательности для конкретной модели ВСЕГДА имеются в документации на сайте производителя, обычно по-английски, но кого это остановит? 

 

 

См. также

Космическая Одиссея 2020 года

Мониторинг Периферийные устройства Языки и среды Бесплатно (free)

Организация потокового обмена системы 1С с большим количеством разнородных устройств – нетривиальная задача. О том, как организовать архитектуру такого решения с учетом возможного масштабирования хранимых данных и поддерживаемых интерфейсов, на конференции Infostart Event 2021 Post-Apocalypse рассказал TeamLead и специалист по внедрению компании ИнфоСофт Григорий Шатров.

11.11.2022    3457    G.Shatrov    2    

25

Подсистема печати на сетевые принтеры по протоколу IPP/HTTP без драйверов из любой ОС и серверного контекста

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Печать на сетевые принтеры по протоколу IPP как напрямую, так и с иcпользованием сервера CUPS. Подсистема позволяет печатать из серверного, клиентского контекста, регламентных и фоновых заданий и не требует установки какого-то дополнительного ПО, библиотек и драйверов принтеров как на сервер 1С Предприятия, так и на клиента. Получение статуса принтера, информации о нем и результатов печати. Никаких внешних компонент не используется, под капотом HTTP и работа с двоичными данными средствами платформы. Сериализатор и десериализатор протокола IPP позволяет относительно легко доработать подсистему для поддержки нереализованных методов и типов данных протокола IPP.

5 стартмани

19.08.2022    2964    14    dumsik    7    

10

Мониторинг ИБП МАП и выключение, включение серверов

Сервера Мониторинг Периферийные устройства Платформа 1С v8.3 Абонемент ($m)

В качестве источника бесперебойного питания серверов можно использовать сетевой инвертор и сборку литиевых аккумуляторов. Единственное, чтобы это работало без участия человека, нужно выключать сервера, когда АКБ разряжается, и включать их обратно, когда сетевое напряжение появилось и АКБ зарядился. С этим вполне может справляться и программа на 1С. Далее описывается программа мониторинга и схема подключения МАП Тitanator UPS (Микроарт) с АКБ Vektor LFP (LiFePO4). Обмен данными ведется по протоколу HTTP.

1 стартмани

16.08.2022    4089    2    vad7    0    

1

Печать на мобильных принтерах по bluetooth и сети (ZPL, TSPL, CPCL)

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Реализация печати на мобильные принтера по bluetooth и сети в формате языка разметки ZPL, TSPL, CPCL из мобильных приложений 1С под Android.

5 стартмани

10.06.2022    5813    32    igorK    54    

7

Обработка обслуживания QR Дисплея

Периферийные устройства Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка обслуживания QR Дисплея от "Бизнес код." для 1С 8.2. QR-дисплей - это устройство, позволяющее выводить динамический QR-код для оплаты в вашем магазине, ресторане и любом другом заведении, занимающемся торговлей или услугами. При этом в QR-код сразу выводятся ваши реквизиты для оплаты вместе с суммой оплаты. Покупателю нужно только навести камеру своего мобильного телефона, и ... платеж проведен. Зачисление на расчетный счет происходит моментально!

3 стартмани

27.04.2022    2160    4    Sonic_seb    0    

2

Что делать, если принтер этикеток не печатает?

Периферийные устройства Россия Бесплатно (free)

Учимся устранять основные проблемы с принтером этикеток, если он отказывается печатать и нормально работать. В статье приведены самые частые и рассмотрены методы их решения.

03.12.2021    29266    VachKirp    2    

3

Управление устройством сопряжения Ke-USB24R

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Бытовые услуги, сервис Абонемент ($m)

Управление устройством сопряжения через внешнюю обработку.

1 стартмани

23.11.2021    3794    3    djalilovv_RSH    3    

7
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Tiger77 69 03.05.09 14:38 Сейчас в теме
Есть же компонента ExtPrint, нафиг ж так мучиться ?
2. dav405 103 03.05.09 14:53 Сейчас в теме
Ключевое слово - "скорость".
(1) Про компоненту не знал, можно (было бы) потестить скорость, весьма
сомневаюсь, что не тормозит на те же 0.5-1 секунду.

(1) А как в ней чеки обрезать? Штрих-коды печатать?
4. CheBurator 3119 03.05.09 18:56 Сейчас в теме
(1) ExtPrint - а поподробнее?
3. biv75 03.05.09 16:06 Сейчас в теме
Очень полезные знания, при работе из под виндов с матричным принтером лучше варианта не найти, сам постоянно использую, зная ESC команды можно и шрифтами управлять и межстрочными интервалами.. да всё можно делать и скорость конечно тут не маловажный фактор.
5. ACE$ 47 01.07.10 11:44 Сейчас в теме
(0) а зачем 2 раза копировать в порт?
(4) На проклабе
6. dav405 103 03.07.10 11:16 Сейчас в теме
(5) Дык две копии чека, однако. Это из электротехнического магазину. Второй оставляли складским при отпуске товаров. //Каменный век :).
7. ACE$ 47 04.07.10 21:51 Сейчас в теме
вообще, сугубо полезную идею кинули ;) безо всяких ВК почти на любом принтере! Я сие приспособил для печати предварительных чеков в кафе под УТ
8. kozorez 8 24.06.13 04:04 Сейчас в теме
Еще бы кто сказал как просто послать Симв(0) ? для многих команд очень нужно. И зачем писать в файл когда можно сразу в порт принтера?
Попытка 
    Драйвер=СоздатьОбъект("MSCOMMLib.MSComm.1"); 
Исключение 
    Предупреждение("Не могу создать объект");    
    Возврат; 
КонецПопытки; 
Драйвер.Settings ="115200,N,8,1";

Драйвер.CommPort =2;
//сообщить("драйвер "+ драйвер+"  порт "+Драйвер.CommPort+"  настройки "+ Драйвер.Settings);
Попытка   
    Драйвер.PortOpen=1; 
Исключение  
    Предупреждение("Не могу открыть порт");    
    Возврат; 
КонецПопытки; 
Если Драйвер.PortOpen=0 Тогда 
    Предупреждение("Не открыт порт");    
    Возврат; 
КонецЕсли;  
Драйвер.Output=(Симв(27)+"@"); // инициализация 
Драйвер.Output=(Симв(27)+"!"Симв(0));// выбрать шрифт1  
Драйвер.Output=
AnsiToOem("12345678901234567890123456789012345678901234567890123456789­0")+Симв(13)+Симв(10));  
Драйвер.Output=(Симв(27)+"!"+Симв(1)); // выбрать шрифт 2
Драйвер.Output=(AnsiToOem("12345678901234567890123456789012345678901234567890123456789­0")+Симв(13)+Симв(10)); 
Драйвер.Output=(Симв(27)+"!"+Симв(2)); // выбрать шрифт0
Драйвер.Output=(AnsiToOem("12345678901234567890123456789012345678901234567890123456789­0")+Симв(13)+Симв(10));
Драйвер.Output=(Симв(12)+Симв(13)+Симв(10));
Драйвер.Output=(AnsiToOem("1234567890")+Симв(13)+Симв(10)); 
Драйвер.Output=(Симв(27)+Симв(77)); //  
Драйвер.Output=(AnsiToOem("1234567890")+Симв(13)+Симв(10)); 
Драйвер.Output=(Симв(27)+Симв(71)); // 
Драйвер.Output=(AnsiToOem("1234567890")+Симв(13)+Симв(10)); 
Драйвер.Output=(Симв(27)+"a"+Симв(2)); // прижать вправо  
Драйвер.Output=(AnsiToOem("0987654321абвгдеёжзийклмнопрстуфхцчшщъьэюя")+Симв(13)+Симв(10));   
Драйвер.Output=(Симв(27)+"!"+Симв(1)); // выбрать шрифт 2  
Драйвер.Output=(AnsiToOem("   "));
Драйвер.Output=(Симв(27)+"a"+Симв(1)); // центр
Драйвер.Output=(AnsiToOem("0987654321абвгдеёжзийклмнопрстуфхцчшщъьэюя")+Симв(13)+Симв(10));
//Драйвер.Output=Симв(12); //конец страницы
Драйвер.Output=AnsiToOem(Симв(27)+"d"+Симв(2)); // прогнать две строчки 
Драйвер.Output=AnsiToOem(Симв(27)+"i"); // обрезка 

Драйвер.PortOpen=0; 
Драйвер=0;
Показать
9. kozorez 8 24.06.13 04:05 Сейчас в теме
Шрифт 1 не выбирается потому что Симв(0) в семерке не работает
Оставьте свое сообщение