С вводом маркировки товаров для многих стал актуальным вопрос печати на принтерах этикеток. К сожалению, стандартная печать этикеток через формируемый табличный документ оставляет желать лучшего как по скорости работы, так и по качеству печати. И здесь приходит на помощь печать этикеток с помощью внутренних команд принтера. Различные производители торгового оборудования включают поддержку разных языков для своих устройств, но принцип печати везде один: формируем код на встроенном языке и отправляем его на принтер.
Я уже публиковал ранее аналогичную компоненту выполненную по технологии COM. Ее главным минусом была необходимость установки .NET Framework. В ней была проблема при подключении на некоторых компьютерах, с которой я недавно столкнулся при реализации одного проекта.
В итоге была написана новая компонента на C++ по технологии Native API. Теперь ей не нужен .NET Framework и ручная регистрация в системе. Компонента позволяет печатать текст на любом принтере, установленном в системе. В новой версии был реализован только метод отправки строки на принтер. Отправкой файлов пользовались очень редко, поэтому пока решил его не реализовывать.
// Метод предназначен для отправки данных на принтер.
SendDataStringToPrinter(СистемноеИмяПринтера, ТекстДляПечати)
В параметре "СистемноеИмяПринтера" передаем имя принтера как он называется в системе. Общий доступ к принтеру открывать не требуется. Если используется сетевой принтер, то указываем полный путь к принтеру.
Пример использования
Для использования загружаем компоненту в общий макет вашей конфигурации. В моем примере он называется ме_LabelPrinterComponent. Формируем необходимый код этикетки и отправляем на печать через соответствующий метод компоненты.
//Функция выполняет отправку команд на принтер этикеток через компоненту печати LabelPrinter
&НаКлиенте
Функция ОтправитьКомандыНаПринтерЭтикеток(ИмяПринтера, СписокКоманд) Экспорт
КомпонентаПечати = "ОбщийМакет.мп_LabelPrinterComponent";
Если Не ПодключитьВнешнююКомпоненту(КомпонентаПечати, "LabelPrinter") Тогда
НачатьУстановкуВнешнейКомпоненты(, КомпонентаПечати);
Если Не ПодключитьВнешнююКомпоненту(КомпонентаПечати, "LabelPrinter") Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю("Ошибка подключения внешней компоненты печати этикеток");
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Попытка
СерверПечати = Новый("AddIn.LabelPrinter.LabelPrinterExtension");
Исключение
ОбщегоНазначенияКлиент.СообщитьПользователю(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Результат = СерверПечати.SendDataStringToPrinter(ИмяПринтера, СписокКоманд);
Возврат Результат;
КонецФункции
Универсальное расширение конфигурации
Для компоненты сделано расширение, которое можно загрузить в любую конфигурацию. Компонента загружена в общий макет "ме_LabelPrinterComponent". При первом вызове функции 1С сама установит компоненту на компьютере пользователя. Работа поддерживается как на толстом, так и на тонком клиенте.
В модуле "ме_ПечатьЭтикеток" добавлены две функции, одна используется для отправки на печать этикетки. Вторая позволяет получить список установленных в системе принтеров. Для получения списка принтеров используется COM-объект WScript.Network. При первом вызове этого метода потребуется разрешить подключение этой библиотеки. Чтобы скрыть это уведомление отключите безопасный режим для этого расширения.
Для тестирования печати добавлена обработка. Она позволяет отправить на принтер любой текст, в том числе этикетку на внутреннем языке принтера.
Расширение можно подключить к любой конфигурации на управляемых формах. Для обычных форм компонента также будет работать, только потребуется перенести общий модуль, макет и обработку в Вашу конфигурацию.
Работа компоненты была протестирована на следующих платформах:
- 1С:Предприятие 8.3 (8.3.15.1700)
- 1С:Предприятие 8.3 (8.3.16.1030)
- 1С:Предприятие 8.3 (8.3.16.1148)
Протестировано на следующих конфигурациях:
- Управление торговлей, редакция 11 (11.4.8.92)
- Розница, редакция 2.3 (2.3.2.28)
Планы на развитие функционала:
1. Добавить функцию получения списка принтеров
2. Добавить отправку на печать с получением ответа от принтера (Нужно для получения данных RFID. При наличии подходящего принтера)
Внимание: В текущей версии компоненты есть проблема при печати на сетевой принтер. Пока не исправил.