В свое время я столкнулся с необходимость использовать данные модели принтеров для печати.
Рассмотрим для начала пути которые у нас есть для работы с этим оборудованием.
Если у вас типовая конфигурация например "1С Управление Торговлей 10.3" идем в раздел "Сервис -> Торговое оборудование -> Подключение и настройка"
И видим что разделом "Принтер чеков" там и не пахнет.
Очевидно что 1С предполагает работу с принтерами чеков как с обычными принтерами и специальных обработок не требуется.
Способ 1. Установить Windows драйвер
- найти и установить Windows драйвер (в итоге на принтере можно будет печатать с любого приложения будь то Word, Paint, Notepad или 1С)
- настроить макеты, печатные формы, чтобы влезало на ленту.
Плюсы:
- печать картинок без проблем ( не нужно задумываться как это сделать, сюда же штрих коды)
- работает с любой 1С 7.7, 8.1, 8.2, 8.3 и т.д.
- легок в установке и внедрении
Минусы:
- Тормозит виндовский драйвер, печать идет медленно (если не вру всегда в графическом режиме)
- ограниченные возможности принтера (не получится издавать звуки, фигурно нарезать ленту,... там на самом деле очень богатый API у принтера)
Установка:
1) Если принтер подключен через USB эмулятор COM порта, установим вначале драйвер порта.
Для большинства "шнурков" (кабель USB->COM) что мне попадались подходил следующий драйвер "Prolific Driver PL2303", поддерживает все Windows системы (32 и 64 bit)
Supports the following Windows OS Family:
- Windows 2000 SP4
- Windows XP SP2 and above (32 & 64 bit)
- Windows Server 2003 (32 & 64 bit) - Windows Vista (32 & 64 bit)
- Windows 7 (32 & 64 bit)
- Windows Server 2008 / 2008 R2 (32 & 64 bit) .
USB 1.1/2.0/3.0 Host Controller
- Device using PL-2303H/HX/X version chips
- Device using Prolific next-gen version chips (Codename EA/TA/TB)
Выкладываю файл для скачки: PL2303_Prolific_DriverInstaller_v1.5.0.rar
2) После того как у нас появился COM-порт к которому подключен принтер чеков, самое время установить Windows драйвер, который будет взаимодействовать с этим портом. Мне в свое время попалось три файла.
- PP7000-PP7000II-PP7700 for Windows 9x.zip
- PP7000II-PP7700 Thermal Printer Driver for Windows 2000-NT-XPServer2003-VISTA.rar
- PP8000-Windows Vista x64-Windows XP x64-Windows Server 2003 x64.zip
Выкладываю файл для скачки: Posiflex_Windows_Drivers.rar
Способ 2. Установить родные драйвера POSIFLEX
Когда-то мне удалось скачать на официальном сайте родные драйвера. Не буду выкладывать дистрибутив, выложу готовые dll.
Родные дрова:
OPOSPOSPrinter.ocx - Файл драйвера необходимо зарегестрировать
flex.dll - Файл драйвера необходимо зарегестрировать
demo.exe - утилита для проверки драйвера, которая идет в комплекте с драйверами POSIFLEX
Для обращения из 1С нужно написать еще внешнюю компоненту, которая будет обращаться к этому драйверу и передавать ему ваши команды.
В свое время я накидал на Delphi:
PP7000.dll - Внешняя компонента для 1С, необходимо регестрировать Имя объекта: "Addin.PP7000"
PPDemo.exe - Утилита вызывающая окно настройки PP7000.DLL. Программа подобно 1С обращается к внешней компоненте PP7000.DLL. При запуске вызывает функццию ShowProperties в которой можно установить необходимые параметры оборудования и протестировать работу устройства.
PP7000.ert - Обработка для работы с внешней компонентой PP7000. Подключает принтер чеков, как фискальный регистратор. (1С 7.7.)
Плюсы:
- работает все быстро
- используется родной драйвер
- Отслеживает статус возврата принтера (то есть функции возвращают ответ, может быть ошибка какая приключилась)
Минусы:
- нужно регистрировать две родных библиотеки и еще одну внешнюю компоненту PP7000.dll
- Необходимо настраивать COM порт при помощи родных утилит или PPDemo.exe или ручками в реестре
- Принтеру присваивается имя например "PP Demo" и в реестре прописывается какой COM-порт и baud rate используется для него. Так работает родной драйвер, вы сообщаете ему имя, а он из реестра считывает уже параметры соответствующие параметры порта и скорости. Пользователям нужны права доступа к реестру.
Выложу сразу все в одном архиве: родные дрова, компонента 1С, мои исходники на delphi = "Способ2.rar"
Способ 3. Обращаться к принтеру через порт (ESC - последовательности)
Последний способ который мне больше всего нравится сочетает простоту установки и отличную скорость работы не жертвуя функционалом. Будем обращаться напрямую к порту, посылать специальные команды для выбора шрифта, отрезки чека, печати текста и.т.п.
Для начала можно проверить работу принтера самым простым способом: Введите в командной строке "copy con com1" или "copy file.txt com1", где file.txt - содержит ваш текст. Вместо com1 - укажите ваш порт. Не помню нужно ли двоеточие после "com1:", попробуйте. Если принтер фурычит значит можно начинать посылать на него команды.
Нашел пару документов описывающих команды:
- PP6000/PP7000/PP7000-II Детализация команд (Cjmmand1.doc)
- Technical Documentation Printer Control Codes for SAMSUNG SRP-270 in Epson Emulation mode compared with Posiflex PP-5600 (Printer Control Codes for SAMSUNG SRP-270 and PP5600.pdf)
Насколько мне известно 1С 8.х не умеет напрямую работать с RS-232 портом, поэтому поищем любую библиотеку/компоненту для работы с портом.
Я выбрал MSCOMM32.OCX:
- MSCOMM32.OCX - сама библиотека
- MSCOMM32_License.reg - файл лицензии (вообще-то библиотека платная вроде)
- regmscomm32.bat - сделал батничек для регистрации
- readme.txt - на всякий случай если вы забыли что делать :)
Выложу одном архиве: "MSCOMM32.rar"
Еще выкладываю расширенную документацию, там есть ESC-коды и многое другое. "Документация.rar"
Ну и самое главное код, выкладываю здесь, чтобы ничего не нужно было скачивать, если есть лишние $качайте все подряд :-)
// Для получения кода в кодировке ANSI (1С использует UNICOD)
Функция Asc(value)
value = Лев(value,1);
Если value = """" Тогда return 34; КонецЕсли;
sc = Новый COMОбъект("MSScriptControl.ScriptControl");
sc.language="VBscript";
Возврат sc.eval("Asc("""+value+""")");
КонецФункции
// Для получения символа по коду ANSI (1С использует UNICOD)
Функция Chr(Code)
sc = Новый COMОбъект("MSScriptControl.ScriptControl");
sc.language="VBscript";
Возврат sc.eval("Chr("""+Code+""")");
КонецФункции
// Функция возващает структуру с управляющими кодами для принтера чеков POSIFLEX, коды отправляются на COM порт.
Функция POSIFLEX_Commands() Экспорт
Команды = новый Структура;
Команды.Вставить("ESC", Chr(27)); // Escape (ESC)
Команды.Вставить("LF", Chr(10)); // Line feed (LF)
Команды.Вставить("Init", Chr(27) + Chr(64) ); // Инициализация принтера
Команды.Вставить("CharSetRus", Chr(27) + Chr(116) + Chr(5) ); // Установить ANSI кодировку CP1251
Команды.Вставить("Cut", Chr(27) + Chr(105)); // Отрезать, Есть еше несколько других способов (1D 56 n) и другие
Команды.Вставить("Font", Chr(27) + Chr(33)); // Установить шрифт, следущий символ номер шрифта
Команды.Вставить("Font1", Chr(27) + Chr(33)+ Chr(0) ); // FONT 1
Команды.Вставить("Font1U", Chr(27) + Chr(33)+ Chr(128)); // FONT 1 Underline
Команды.Вставить("Font1B", Chr(27) + Chr(33)+ Chr(8) ); // FONT 1 Bold
Команды.Вставить("Font1BU",Chr(27) + Chr(33)+ Chr(136) ); // FONT 1 Bold Underline
Команды.Вставить("Font2", Chr(27) + Chr(33)+ Chr(16)); // FONT 2
Команды.Вставить("Font2U", Chr(27) + Chr(33)+ Chr(144)); // FONT 2 Underline
Команды.Вставить("Font2B", Chr(27) + Chr(33)+ Chr(24)); // FONT 2 Bold
Команды.Вставить("Font2BU",Chr(27) + Chr(33)+ Chr(152)); // FONT 2 Bold Underline
Команды.Вставить("Font3", Chr(27) + Chr(33)+ Chr(32)); // FONT 3
Команды.Вставить("Font3U", Chr(27) + Chr(33)+ Chr(160)); // FONT 3 Underline
Команды.Вставить("Font3B", Chr(27) + Chr(33)+ Chr(40)); // FONT 3 Bold
Команды.Вставить("Font3BU",Chr(27) + Chr(33)+ Chr(168)); // FONT 3 Bold Underline
Команды.Вставить("Font4", Chr(27) + Chr(33)+ Chr(48)); // FONT 4
Команды.Вставить("Font4U", Chr(27) + Chr(33)+ Chr(176)); // FONT 4 Underline
Команды.Вставить("Font4B", Chr(27) + Chr(33)+ Chr(56)); // FONT 4 Bold
Команды.Вставить("Font4BU",Chr(27) + Chr(33)+ Chr(184)); // FONT 4 Bold Underline
// Русские аналоги
Команды.Вставить("Протянуть", Char(10) );
Команды.Вставить("Отрезать", Char(27) + Char(105));
возврат Команды;
КонецФункции
// Открывает порт, инициализирует принтер, возвращает ссылку на СОМОбъект MSCOMMLib для работы спортом
Функция POSIFLEX_OpenPort() Экспорт
// Использует библиотеку MSCOMM32.OCX для работы напрямую с портом
// Инициализирует принтер
CommPort = глСервер.POSIFLEX_GetPort(); // Считываем константу (Ваш порт, чиссло 1..255)
Попытка
Порт = новый COMОбъект("MSCOMMLib.MSComm.1");
Исключение
Сообщить("Не удается подключить библиотеку mscomm32.ocx");
Сообщить("Библиотека должна быть зарегестрирована и лицензирована");
КонецПопытки;
Если Порт.PortOpen = 1 Тогда Порт.PortOpen = 0; КонецЕсли; //Закроем порт, если он уже открыт
Попытка
Порт.CommPort = CommPort; // Номер порта
Порт.Settings = "19200,N,8,1"; // Параметры порта
Порт.PortOpen = 1; // Открываем порт
Исключение
Сообщить("Не удается открыть порт COM"+CommPort+":");
возврат Неопределено;
КонецПопытки;
// Выбор устройства 1B 3D 01, Инициализация 1B 40, плюс фигня какая-то 1D 61 0F (такую строку посылвает на порт родной драйвер)
Порт.Output=Char(27)+Char(61)+Char(1) + Char(27)+Char(64) + Char(29)+Char(97)+Char(15);
// 1B 74 05, 1B 52 00 - Set Russian character code table
Порт.Output=Char(27)+Char(116)+Char(5) + Char(27)+Char(82)+Char(0);
Возврат Порт;
КонецФункции
Процедура POSIFLEX_Test() Экспорт
// Тест печати на принтере
Коды=POSIFLEX_Commands();
Порт=POSIFLEX_OpenPort();
Если Порт = Неопределено Тогда возврат; КонецЕсли;
Порт.Output=Коды.Font4BU+"Тест устройства";
Порт.Output=Коды.LF;
Порт.Output=Коды.Font1+Коды.LF;
Порт.Output=Коды.Font1+"Font 1.........................[42 symbol]"+Коды.LF;
Порт.Output=Коды.Font2+"Font 2.........................[42 symbol]"+Коды.LF;
Порт.Output=Коды.Font3+"Font 3....[21 symbol]"+Коды.LF;
Порт.Output=Коды.Font4+"Font 4....[21 symbol]"+Коды.LF;
Порт.Output=Коды.LF;
Порт.Output=Коды.LF;
Порт.Output=Коды.Cut;
/// Закрываем порт
Порт.PortOpen = 0;
КонецПроцедуры
Все способы могут работать параллельно друг другу, по очереди обращаясь к принтеру из разных приложений.
На этом все, надеюсь статья была полезной или интересной :-)