При автоматизации торговых точек на базе 1С:Предприятие 7.7 программисты часто сталкиваются с проблемой управления периферийным оборудованием, таким как чековые принтеры. Одной из наиболее востребованных функций является автоматическая обрезка бумаги и открытие денежного ящика. В этой статье мы подробно разберем, почему стандартные методы печати не подходят для этих целей и как реализовать прямое управление принтером MITSU RP-809 с использованием протокола ESC/POS.
Рассмотрим стандартный механизм печати в 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
Теперь разберем специфику команд для модели MITSU RP-809. Обрезка бумаги выполняется командой GS V. В десятичном виде это Chr(29) + Chr(86). После этой команды принтер ожидает параметр, определяющий тип отрезки.
Рассмотрим варианты параметров:
n точек и последующая отрезка. Это удобно, если вы хотите, чтобы текст чека гарантированно вышел за пределы ножа.Пример реализации функции обрезки:
Function Printer_CutPaper()
// Команда GS V 1 (Частичная отрезка)
Command = Chr(29) + Chr(86) + Chr(49);
Printer_SendImpulse("CutPaper.txt", Command);
EndFunction
Для открытия денежного ящика используется команда ESC p. Она подает электрический импульс на разъем RJ11 принтера. Формат команды: Chr(27) + Chr(112) + m + t1 + t2.
Проанализируем параметры:
m: определяет номер контакта (обычно 0 или 48 для первого контакта).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
Если принтер MITSU RP-809 подключен через Ethernet, мы можем пойти более современным путем, используя объект Winsock или v7plus.dll. Это позволит избежать создания сетевых общих папок.
Выясним алгоритм работы через сокеты:
Chr().Такой метод работает значительно быстрее и надежнее в крупных сетях, где права доступа к сетевым папкам могут быть ограничены политиками безопасности.
При переходе на RAW-печать (прямую отправку байтов) вы можете столкнуться с тем, что принтер перестал печатать кириллицу. Проанализируем причину: драйвер Windows больше не переводит текст в картинку, и принтер использует свои встроенные шрифты. Чтобы русский текст отображался корректно, в начале каждого чека нужно отправить команду выбора кодовой страницы ESC t.
Для MITSU RP-809 это обычно выглядит так:
Chr(27) + Chr(116) + Chr(17) — переключение на кодировку PC866 (Cyrillic).
Также хорошим тоном считается инициализация принтера перед печатью командой ESC @ (Chr(27) + Chr(64)). Это сбросит все настройки (шрифты, отступы), оставшиеся от предыдущего задания, которое могло завершиться с ошибкой.
FileCopy.Chr(0) вместо Chr(48)).Следуя этим шагам, вы сможете полностью контролировать процесс печати чеков в 1С 7.7, делая работу кассира более удобной и профессиональной.