Введение
Доброго времени всем! Этот материал-обзор создан на базе небольшой выполненной практической задачи - "работы с принтером чеков 1С с возможностью индивидуальной настройки и печати". Описание функционала данной статьи основано на типовой "Библиотеке подключаемого оборудования" (БПО). Версия БПО (на момент написания статьи - ноябрь 2024 г.) немного "устарела" - это 2.1, но она, я думаю, по-прежнему будет актуальна, поскольку многие работают на "старых", УТ 11.5, где еще используется версия БПО 2.1. В последних версиях - используется версия 3.*.
Данный материал подготавливался на типовой конфигурации Управление торговлей 11.5 (11.5.8.367), использую платформу 1С:Предприятие 8.3.24.1586. В материале, как и в других, автор старается описывать только практическую часть - взял - применил - все заработало!
В статье рассматриваются самые базовые вещи - как подключение "Принтера чеков 1С" к рабочему месту, его программное определение, печать строки, печать массива строк, печать штрихкодов, печать qr-кодов, смешанная печать на пречеке.
Отмечу, что здесь НЕ затрагиваются "фискальные" операции, которые в последнее время отменили в БПО 3.* на подобных устройствах.
Переходим к разделам:
1.Подключение "Принтера чеков 1С" и его "программное обнаружение" на рабочем месте.
Для полноты картины, ваш принтер должен быть установлен в системе прилагаемым драйвером и подключен на рабочее место через типовой функционал "НСИ и администрирование - РМК и оборудование - Подключаемое оборудование". Выглядит это вот так:
Рис.1. "1С:Принтер чеков" на рабочем месте "Администратор".
настройки принтера вот такие (я использую windows pos printer через эмуляцию ком, у меня самая типовая модель - RP80 Printer):
Рис.2. Настройки принтера RP80 Printer и "тест подключения".
Далее, мы создадим обработку - в итоге будет выглядеть вот так - рис.3 и "обвяжем кодом" работу с этим подключенным устройством:
Рис.3. Шаблон функциональной обработки.
Далее, напишем код, с помощью которого определим этот принтер на рабочем месте:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтаФорма.ТекРабМст = МенеджерОборудованияКлиентПовтИсп.ПолучитьРабочееМестоКлиента();
ЭтаФорма.ПринтерЧековККМ = ПолучимПринтерЧековККМ(ЭтаФорма.ТекРабМст);
КонецПроцедуры
&НаСервере
Функция ПолучимПринтерЧековККМ(РабМст)
ПринтерЧековККМ = Справочники.ПодключаемоеОборудование.ПустаяСсылка();
ПоискПринтера = Новый Запрос("ВЫБРАТЬ
| ПодключаемоеОборудование.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПодключаемоеОборудование КАК ПодключаемоеОборудование
|ГДЕ
| ПодключаемоеОборудование.РабочееМесто = &РабочееМесто
| И ПодключаемоеОборудование.ТипОборудования = ЗНАЧЕНИЕ(Перечисление.ТипыПодключаемогоОборудования.ПринтерЧеков)
| И ПодключаемоеОборудование.УстройствоИспользуется = ИСТИНА
| И ПодключаемоеОборудование.ПометкаУдаления = ЛОЖЬ");
ПоискПринтера.УстановитьПараметр("РабочееМесто", РабМст);
НашлиПринтер1 = ПоискПринтера.Выполнить().Выбрать();
Если НашлиПринтер1.Следующий() Тогда
ПринтерЧековККМ = НашлиПринтер1.ССылка;
КонецЕсли;
Возврат ПринтерЧековККМ;
КонецФункции
Затем, мы переходим к опросу данного устройства.
2.Пример печати текстовой строки, массива строк, штрихкода, qr-кода, комбинированная печать.
Для печати текстовой строки, пишем "на клиенте" вот такой код - процедура "НачатьПечатьТекста(ОповещениеПриЗавершении, УникальныйИдентификатор, Текст, ИдентификаторУстройства = Неопределено, ТипОборудования = Неопределено)"
&НаКлиенте
Процедура РаспечатьТекст(Команда)
Если НЕ СокрЛП(ЭтаФорма.ПринтерЧековККМ) = "" Тогда
Текст1 = СокрЛП(ЭтаФорма.НапечатьТекст);
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ФУ_КомандаВыполнитьЗавершение", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьПечатьТекста(ОповещениеПриЗавершении, УникальныйИдентификатор, Текст1,ЭтаФорма.ПринтерЧековККМ);
Иначе
Сообщить("Не найден принтер чеков!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ФУ_КомандаВыполнитьЗавершение(РезультатВыполнения, Параметры) Экспорт
ОчиститьСообщения();
КонецПроцедуры
Для печати массива строк (документов) нам потребуется процедура "НачатьПечатьТекстовыхДокументов(ОповещениеПриЗавершении, УникальныйИдентификатор, НефискальныеДокументы, ИдентификаторУстройства = Неопределено, ТипОборудования = Неопределено)"
&НаКлиенте
Процедура РаспечатьТаблицу(Команда)
Если НЕ СокрЛП(ЭтаФорма.ПринтерЧековККМ) = "" Тогда
ПозицииЧека = Новый Массив;
Для Каждого Стр ИЗ ТаблицаДляПечати Цикл
СтрокаОписания = СокрЛП(Стр.Наименование)+" - "+ СокрЛП(Стр.Количество)+" шт.";
СтрокаЧека = МенеджерОборудованияКлиентСервер.ПараметрыТекстовойСтрокиЧека(СтрокаОписания);
СтрокаЧека.Выравнивание = "Лево"; // Выравнивание на ленте, возможные значения: "Лево", "Право", "Центр"
СтрокаЧека.ПереносСтроки = Истина;
ПозицииЧека.Добавить(СтрокаЧека);
КонецЦикла;
ДанныеДляПечати = Новый Массив;
ДанныеДляПечати.Добавить(ПозицииЧека);
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ФУ_КомандаВыполнитьЗавершение", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьПечатьТекстовыхДокументов(ОповещениеПриЗавершении, УникальныйИдентификатор, ДанныеДляПечати,ЭтаФорма.ПринтерЧековККМ);
Иначе
Сообщить("Не найден принтер чеков!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ФУ_КомандаВыполнитьЗавершение(РезультатВыполнения, Параметры) Экспорт
ОчиститьСообщения();
КонецПроцедуры
Если необходим напечатать штрихкод - "ПолучитьШаблонЧекаПечатиШтрихкодов()"
&НаКлиенте
Процедура ПечатьШтрихкода(Команда)
Если НЕ СокрЛП(ЭтаФорма.ПринтерЧековККМ) = "" Тогда
ДанныеДляПечати = ПолучитьШаблонЧекаПечатиШтрихкодов();
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ФУ_КомандаВыполнитьЗавершение", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьПечатьТекста(ОповещениеПриЗавершении, УникальныйИдентификатор, ДанныеДляПечати,ЭтаФорма.ПринтерЧековККМ);
Иначе
Сообщить("Не найден принтер чеков!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьШаблонЧекаПечатиШтрихкодов()
Текст = "";
// обратите внимание как обрабатывается штрихкод
Текст = Текст + Символы.ПС + "|ШтрихКод|EAN13|" + ЭтаФорма.ШтрихКод;
Возврат Текст;
КонецФункции
&НаКлиенте
Процедура ФУ_КомандаВыполнитьЗавершение(РезультатВыполнения, Параметры) Экспорт
ОчиститьСообщения();
КонецПроцедуры
Для печати строки с qr-кодом - "ПолучитьШаблонЧекаПечатиQR()"
&НаКлиенте
Функция ПолучитьШаблонЧекаПечатиQR()
Текст = "";
Текст = Текст + Символы.ПС + "|ШтрихКод|QR|" + ЭтаФорма.QRКод;
Возврат Текст;
КонецФункции
&НаКлиенте
Процедура ПечатьQR(Команда)
Если НЕ СокрЛП(ЭтаФорма.ПринтерЧековККМ) = "" Тогда
ДанныеДляПечати = ПолучитьШаблонЧекаПечатиQR();
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ФУ_КомандаВыполнитьЗавершение", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьПечатьТекста(ОповещениеПриЗавершении, УникальныйИдентификатор, ДанныеДляПечати,ЭтаФорма.ПринтерЧековККМ);
Иначе
Сообщить("Не найден принтер чеков!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ФУ_КомандаВыполнитьЗавершение(РезультатВыполнения, Параметры) Экспорт
ОчиститьСообщения();
КонецПроцедуры
Для "комбинированной" печати - на каждую строку мне нужно добавить штрихкод, я воспользуюсь вот такой процедурой:
&НаКлиенте
Процедура РаспечатьТаблицуСоШтрихкодом(Команда)
Если НЕ СокрЛП(ЭтаФорма.ПринтерЧековККМ) = "" Тогда
ПозицииЧека = Новый Массив;
Для Каждого Стр ИЗ ТаблицаДляПечати Цикл
СтрокаОписания = СокрЛП(Стр.Наименование)+" - "+ СокрЛП(Стр.Количество)+" шт.";
СтрокаЧека = МенеджерОборудованияКлиентСервер.ПараметрыТекстовойСтрокиЧека(СтрокаОписания);
СтрокаЧека.Выравнивание = "Лево"; // Выравнивание на ленте, возможные значения: "Лево", "Право", "Центр"
СтрокаЧека.ПереносСтроки = Истина;
ПозицииЧека.Добавить(СтрокаЧека);
СтрокаЧека = МенеджерОборудованияКлиентСервер.ПараметрыШтрихкодВСтрокеЧека("EAN13",ЭтаФорма.ШтрихКод,Base64Значение(ЭтаФорма.ШтрихКод));
ПозицииЧека.Добавить(СтрокаЧека);
КонецЦикла;
ДанныеДляПечати = Новый Массив;
ДанныеДляПечати.Добавить(ПозицииЧека);
ОповещениеПриЗавершении = Новый ОписаниеОповещения("ФУ_КомандаВыполнитьЗавершение", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьПечатьТекстовыхДокументов(ОповещениеПриЗавершении, УникальныйИдентификатор, ДанныеДляПечати,ЭтаФорма.ПринтерЧековККМ);
Иначе
Сообщить("Не найден принтер чеков!");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ФУ_КомандаВыполнитьЗавершение(РезультатВыполнения, Параметры) Экспорт
ОчиститьСообщения();
КонецПроцедуры
Как результат - я получаю вот такие "пречеки":
Рис.4. Здесь изображаются - обычная текстовая строка, строка "массив" и чередование текста и штрихкода в каждой строке.
Рис.5. Здесь - вывод штрихкода и qr-кода на пречеках.
На этом, пожалуй, все. Теперь перейдем к заключениям и выводам по данному практическом обзору:
Заключение и выводы по статье:
Данная статья дает базовое понимание по программному "опросу" устройства "Принтер чеков 1с" через БПО. Рассмотрен основной, часто необходимый функционал, - вывод строк, массивов, кодов и их форматирование на листе чековой ленты.
Функционал по фискальным операциям для данного типа устройств в последних БПО 3.* запрещен, хотя в старых - как в данном примере - БПО 2.1 - разрешен. Стоит ли рассматривать его в настоящее время - не знаю.....
Уверен, что данный материал будет полезен всем интересующимся, всем, кто работает с оборудованием, кто хочет получить понимание о "совместимости" устройств с программами 1с.
Если Вы используете подобные принтеры для печати неких расширенных отчетов на чековой ленте - этот функционал для Вас. Развитие темы - на Ваше усмотрение... Спасибо за прочтение и внимание. Вы так же можете ознакомиться с другими полезными обработками и статьями автора.
Отмечу, что абсолютно ВСЕ обработки автора имеют программную актуальность и практическую ценность - все они рабочие! Обновляются автором по мере практической необходимости.
Другие статьи и полезные практические обработки автора:
Автозапуск по расписанию внешней обработки - автозавершение пользовательских серверных сеансов
Пример запроса чеков по кассам от оператора Платформа.ОФД по API
Массовая загрузка контрагентов в базу по ИНН
Пример внешней печатной формы с предварительным выводом параметров
Рабочий пример применения шаблонов печатных форм WORD из БСП. Демо-обработка
Гибкие отборы через СКД на управляемых формах. Демо-обработка
С предложениями, благодарностями добро пожаловать в личку либо на телеграмм-канал автора.