Как реализовать программную обрезку чека и открытие денежного ящика на принтере MITSU RP-809 в 1С 7.7

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При автоматизации торговых точек на базе 1С:Предприятие 7.7 программисты часто сталкиваются с проблемой управления периферийным оборудованием, таким как чековые принтеры. Одной из наиболее востребованных функций является автоматическая обрезка бумаги и открытие денежного ящика. В этой статье мы подробно разберем, почему стандартные методы печати не подходят для этих целей и как реализовать прямое управление принтером MITSU RP-809 с использованием протокола ESC/POS.

Почему не работает стандартная печать через таблицу 1С?

Рассмотрим стандартный механизм печати в 1С 7.7. Когда мы используем объект Таблица и метод Напечатать(), система взаимодействует с принтером через Windows-драйвер. Драйвер в данном случае работает в режиме GDI (Graphics Device Interface). Это означает, что всё содержимое таблицы — текст, линии, рамки — преобразуется в графическое изображение (растр) и отправляется на принтер как картинка.

Проанализируем ситуацию: если мы попытаемся отправить управляющие символы, например, Chr(27) + "i" через секцию таблицы, драйвер воспримет их просто как текст и попытается нарисовать соответствующие символы на бумаге вместо того, чтобы выполнить команду. Именно поэтому спецсимволы отрезки «теряются» или печатаются как непонятный мусор. Для выполнения команд нам необходимо отправить данные в RAW-режиме (напрямую в порт), минуя графический преобразователь драйвера.

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

Самым надежным и проверенным временем способом для 1С 7.7 является запись команд в текстовый файл с последующим копированием этого файла напрямую в порт принтера. Разберем этот процесс по шагам.

Во-первых, принтер должен быть доступен по сети. Даже если он подключен по USB или Ethernet, его необходимо «расшарить» (предоставить общий доступ) в настройках Windows под коротким сетевым именем, например, MITSU.

Во-вторых, мы создадим вспомогательную функцию, которая будет формировать файл и отправлять его на принтер. Рассмотрим пример кода:


// Функция отправляет управляющую последовательность байт напрямую на принтер
Function Printer_SendImpulse(FileName, CommandString) 
    // Определяем путь к временному файлу
    FullFilePath = UserDir() + "PrinterCommands\" + FileName;
    
    // Используем объект Текст для записи команд
    Txt = CreateObject("Text");
    Txt.CodePage(0); // Важно: используем системную кодировку
    Txt.AddLine(CommandString);  
    
    Try
        Txt.Write(FullFilePath);
        
        // Формируем сетевой путь к принтеру
        // Например: \\ИмяКомпьютера\MITSU
        PrinterPath = "\\localhost\MITSU"; 
        
        // Копируем файл в порт принтера
        FS.FileCopy(FullFilePath, PrinterPath, 0);
    Except
        Сообщить("Ошибка при отправке команды на принтер!");
    EndTry;
EndFunction

Программная обрезка бумаги (Command GS V)

Теперь разберем специфику команд для модели MITSU RP-809. Обрезка бумаги выполняется командой GS V. В десятичном виде это Chr(29) + Chr(86). После этой команды принтер ожидает параметр, определяющий тип отрезки.

Рассмотрим варианты параметров:

  1. Chr(48) или Chr(0) — полная обрезка чека.
  2. Chr(49) или Chr(1) — частичная обрезка (чек держится на маленьком бумажном мостике).
  3. Chr(66) + Chr(n) — прокрутка бумаги на n точек и последующая отрезка. Это удобно, если вы хотите, чтобы текст чека гарантированно вышел за пределы ножа.

Пример реализации функции обрезки:


Function Printer_CutPaper()    
    // Команда GS V 1 (Частичная отрезка)
    Command = Chr(29) + Chr(86) + Chr(49);
    Printer_SendImpulse("CutPaper.txt", Command); 
EndFunction

Управление денежным ящиком (Command ESC p)

Для открытия денежного ящика используется команда ESC p. Она подает электрический импульс на разъем RJ11 принтера. Формат команды: Chr(27) + Chr(112) + m + t1 + t2.

Проанализируем параметры:

На практике для большинства ящиков подходят стандартные значения Chr(48) + Chr(57) + Chr(57). Если ящик открывается неуверенно, следует увеличить значение t1.


Function Printer_OpenDrawer() 
    // Команда ESC p 0 9 9
    Command = Chr(27) + Chr(112) + Chr(48) + Chr(57) + Chr(57);
    Printer_SendImpulse("OpenDrawer.txt", Command); 
EndFunction

Работа через Ethernet и протокол TCP/IP

Если принтер MITSU RP-809 подключен через Ethernet, мы можем пойти более современным путем, используя объект Winsock или v7plus.dll. Это позволит избежать создания сетевых общих папок.

Выясним алгоритм работы через сокеты:

  1. Создаем соединение с IP-адресом принтера на порт 9100 (стандартный порт RAW-печати).
  2. Отправляем сформированную строку Chr().
  3. Закрываем соединение.

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

Важные замечания по кодировке и инициализации

При переходе на RAW-печать (прямую отправку байтов) вы можете столкнуться с тем, что принтер перестал печатать кириллицу. Проанализируем причину: драйвер Windows больше не переводит текст в картинку, и принтер использует свои встроенные шрифты. Чтобы русский текст отображался корректно, в начале каждого чека нужно отправить команду выбора кодовой страницы ESC t.

Для MITSU RP-809 это обычно выглядит так:

Chr(27) + Chr(116) + Chr(17) — переключение на кодировку PC866 (Cyrillic).

Также хорошим тоном считается инициализация принтера перед печатью командой ESC @ (Chr(27) + Chr(64)). Это сбросит все настройки (шрифты, отступы), оставшиеся от предыдущего задания, которое могло завершиться с ошибкой.

Итоговый алгоритм действий

  1. Проверьте связь с принтером через командную строку (ping IP-адрес).
  2. Убедитесь, что принтер расшарен в системе, если используете метод FileCopy.
  3. Протестируйте отправку простой команды отрезки через небольшую обработку в 1С.
  4. Если команды доходят, но принтер не реагирует, попробуйте изменить параметры (например, Chr(0) вместо Chr(48)).

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

← На главную