Когда мы работаем в 1С с типовыми конфигурациями, такими как "Розница 2.3", часто возникает необходимость распечатать произвольный текст на принтере чеков. Ситуация становится интереснее, если текущая форма, из которой требуется печать, не имеет прямого вызова подключения торгового оборудования. В этой статье мы подробно рассмотрим, как решить эту задачу, используя стандартные механизмы Библиотеки подключаемого оборудования (БПО).
Прежде чем перейти к решению, нам важно понимать, что такое Библиотека подключаемого оборудования (БПО) и как она работает в 1С. БПО — это набор общих механизмов и интерфейсов, предназначенных для унифицированной работы с различными типами торгового оборудования (сканеры штрихкодов, ККТ, принтеры чеков, эквайринговые терминалы и т.д.) независимо от их конкретных моделей и производителей. Она предоставляет стандартизированный API для взаимодействия с драйверами оборудования.
Даже если на конкретной форме нет явного вызова функции подключения оборудования, БПО позволяет обращаться к уже настроенным и подключенным устройствам через общие менеджеры, которые доступны на клиенте.
Для печати текста на принтере чеков мы будем использовать метод МенеджерОборудованияКлиент.НачатьПечатьТекста. Этот метод является частью клиентского API БПО и предназначен для инициации асинхронной печати произвольного текста на чекопечатающем устройстве.
Давайте посмотрим на пример кода, который был предложен в начале обсуждения:
&НаКлиенте
Процедура ПечатьНаККТ(Команда)
Оповещение = Новый ОписаниеОповещения("ВыполнитьОперациюЗавершение", ЭтотОбъект);
ДанныеДляПечати = "Мой текст";
ФункцияПечати = "МенеджерОборудованияКлиент.НачатьПечатьТекста(Оповещение, УникальныйИдентификатор, ДанныеДляПечати)";
Выполнить(ФункцияПечати);
КонецПроцедуры
Этот пример демонстрирует базовую идею, но требует доработки. В частности, переменная УникальныйИдентификатор не всегда доступна в текущем контексте без предварительного получения. Также использование Выполнить с динамической строкой, хотя и работоспособно, может быть не самым оптимальным и читаемым решением.
Более правильный и гибкий подход был предложен позже в обсуждении, и мы рассмотрим его подробнее. Он учитывает передачу идентификатора принтера и позволяет более чисто вызвать метод:
&НаКлиенте
Процедура ПечатьНаПринтереЧеков(Команда)
// 1. Подготовка данных для печати
ДанныеДляПечати = "Мой текст1 |Мой текст2"; // Используем символ "|" для переноса строк
// 2. Определение идентификатора принтера
// Если принтер чеков в базе только один и он настроен, можно передать Неопределено.
// Система автоматически выберет единственный доступный принтер.
// Если принтеров несколько и нам нужен конкретный, его ID нужно получить заранее.
// В рамках задачи, где нет явного подключения на форме,
// чаще всего подойдет вариант с Неопределено, если принтер один.
ИдентификаторУстройства = Неопределено; // Или конкретный GUID устройства, если известен
// 3. Вызов метода печати
МенеджерОборудованияКлиент.НачатьПечатьТекста(Неопределено, ИдентификаторУстройства, ДанныеДляПечати);
КонецПроцедуры
МенеджерОборудованияКлиент.НачатьПечатьТекстаОповещение (первый параметр): Этот параметр предназначен для передачи объекта ОписаниеОповещения, который будет вызван после завершения асинхронной операции печати. В нашем случае, если нам не требуется обрабатывать результат или ошибки печати сразу после выполнения, мы можем передать Неопределено, как это сделано в уточненном примере. Если бы нам нужна была реакция на завершение операции (например, сообщение пользователю об успехе или ошибке), мы бы создали ОписаниеОповещения, указывающее на процедуру-обработчик:
Оповещение = Новый ОписаниеОповещения("МояПроцедураОбработчикЗавершенияПечати", ЭтотОбъект);
// ... далее передаем Оповещение в метод
МенеджерОборудованияКлиент.НачатьПечатьТекста(Оповещение, ИдентификаторУстройства, ДанныеДляПечати);
В процедуре МояПроцедураОбработчикЗавершенияПечати мы могли бы получить параметры результата операции.
ИдентификаторУстройства (второй параметр): Это уникальный идентификатор (GUID) конкретного чекопечатающего устройства, которое было зарегистрировано в 1С. Мы рассмотрим несколько вариантов его использования:
Если вы передаете Неопределено, система постарается автоматически выбрать принтер. Если в вашей информационной базе настроен только один принтер чеков и он активен, он будет выбран по умолчанию. Если же настроено несколько принтеров, и вы передаете Неопределено, система, как правило, предложит пользователю диалог выбора устройства. Однако в обсуждаемом случае автор отметил, что при одном принтере выбор не предлагается, что является ожидаемым поведением и упрощает задачу.
Если вам нужен конкретный принтер из нескольких возможных, и вы знаете его GUID, вы можете получить его, например, из регистра сведений, где хранятся настройки подключаемого оборудования, или из формы списка подключенного оборудования, и передать его явным образом. Примерно так (обратите внимание, что прямое получение GUID в клиентском коде потребует вызова серверной функции):
// Пример получения GUID конкретного принтера (упрощено, требует доработки
// для реального использования в клиентском коде через вызов серверной функции)
// На сервере
Функция ПолучитьИдентификаторПринтераЧеков() Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка.УникальныйИдентификатор КАК УникальныйИдентификатор
|ИЗ РегистрСведений.НастройкиПодключаемогоОборудования КАК НастройкиПодключаемогоОборудования
|ГДЕ НастройкиПодключаемогоОборудования.ТипОборудования = &ТипОборудования
| И НастройкиПодключаемогоОборудования.Используется = ИСТИНА
| И НастройкиПодключаемогоОборудования.ДрайверОборудования.НаименованиеПОдобно 'Принтер чеков%'"; // Примерное условие для поиска
Запрос.УстановитьПараметр("ТипОборудования", Перечисления.ТипыПодключаемогоОборудования.ПринтерыЧеков);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.УникальныйИдентификатор;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// На клиенте
&НаКлиенте
Процедура ПечатьНаПринтереЧеков(Команда)
ИдентификаторУстройства = ПолучитьИдентификаторПринтераЧеков(); // Вызов серверной функции
Если ИдентификаторУстройства = Неопределено Тогда
ПоказатьПредупреждение("Не удалось найти настроенный принтер чеков.");
Возврат;
КонецЕсли;
ДанныеДляПечати = "Текст для конкретного принтера";
МенеджерОборудованияКлиент.НачатьПечатьТекста(Неопределено, ИдентификаторУстройства, ДанныеДляПечати);
КонецПроцедуры
ДанныеДляПечати (третий параметр): Это строка текста, которую необходимо распечатать. Критически важный момент: для переноса строки внутри чека используйте символ | (вертикальная черта). БПО интерпретирует этот символ как команду перевода строки на принтере чеков, позволяя формировать многострочные чеки.
ДанныеДляПечати = "НазваниеКомпании |Адрес: ул. Примерная, 10 |Телефон: 123-45-67 | --- | ИТОГО: 100.00 руб.";
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьТекстаВ некоторых версиях БПО (например, БПО 3.2, как упоминалось в сообщениях) или в специфичных конфигурациях может быть доступен более специализированный менеджер ОборудованиеЧекопечатающиеУстройстваКлиент. Использование его выглядит следующим образом:
&НаКлиенте
Процедура ПечатьЧерезСпециализированныйМенеджер(Команда)
ПараметрыОперации = Новый Структура("СтрокиТекста", "это текст для печати");
// Здесь Неопределено передается для Оповещения, ИдентификатораУстройства, ДополнительныхПараметров.
// Основной текст передается в четвертом параметре - структуре ПараметрыОперации.
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьТекста(Неопределено, Неопределено, Неопределено, ПараметрыОперации);
КонецПроцедуры
В этом случае текст передается в структуре ПараметрыОперации под ключом СтрокиТекста. Если вы работаете с более новой версией БПО или вашей конфигурацией предусмотрен именно этот менеджер, стоит проверить его API, так как он может предоставлять дополнительные возможности, специфичные для принтеров чеков. Мы рекомендуем сначала попробовать метод МенеджерОборудованияКлиент.НачатьПечатьТекста как более универсальный.
В ходе обсуждения был задан вопрос о возможности печати табличных документов с рисунками. Важно понимать, что методы НачатьПечатьТекста, которые мы рассматриваем, предназначены исключительно для печати текста. Они не поддерживают прямую печать табличных документов 1С или изображений, встроенных в них.
Если вам требуется напечатать изображения (например, логотип компании), то обычно это делается через другие методы драйвера принтера, которые позволяют отправить бинарные данные изображения. Для этого, как правило, нужно использовать более низкоуровневые функции работы с оборудованием, которые могут быть доступны через серверные вызовы к общим модулям БПО, взаимодействующим непосредственно с драйверами. Этот функционал значительно сложнее и выходит за рамки простой печати текста, требуя специфических знаний о командах управления принтером и возможностях его драйвера.
Табличные документы в их стандартном виде также не могут быть напрямую отправлены на принтер чеков. Принтеры чеков не являются обычными принтерами Windows, они работают по собственным протоколам и командам. Если требуется печать сложного макета, его обычно приходится формировать текстовыми командами с учетом возможностей конкретного принтера (например, печать жирного шрифта, увеличенного шрифта, выравнивание) или преобразовывать в изображение и печатать его, что, как мы уже отметили, требует дополнительных усилий.
Прежде чем пытаться печатать, мы должны убедиться, что принтер чеков правильно настроен и подключен в вашей информационной базе 1С. Для этого необходимо выполнить следующие шаги:
Только после успешной настройки и тестирования принтер будет доступен для использования через механизмы БПО.
Мы рассмотрели, как эффективно использовать механизмы Библиотеки подключаемого оборудования для печати произвольного текста на принтере чеков из любой формы 1С, даже если на ней не было прямого вызова подключения оборудования. Ключевым является использование клиентского метода МенеджерОборудованияКлиент.НачатьПечатьТекста и правильная передача параметров, в частности, текста для печати с разделителем строк | и опционально идентификатора устройства. Также мы выяснили, что прямая печать табличных документов и изображений через эти текстовые методы не поддерживается и требует более сложных и специфических решений.
Убедитесь, что ваш принтер чеков корректно настроен в 1С через раздел "Подключаемое оборудование", и тогда описанные методы позволят вам успешно реализовать необходимый функционал по печати нефискальных чеков и информационных сообщений.