При настройке торгового оборудования и печати чеков ККМ в программе 1С:Розница (редакция 2.2 и выше) часто возникает необходимость выделить определенные строки жирным или крупным шрифтом. Это может потребоваться для привлечения внимания покупателя к наименованию товара, итоговой сумме чека, размеру скидки или рекламной информации в подвале чека.
Однако при попытке настроить условное оформление в редакторе шаблонов чеков ККМ многие пользователи и программисты замечают, что изменения шрифтов и жирности не отражаются на печатной ленте фискального регистратора (например, на кассах семейства «Ритейл-01Ф» или «Штрих-М»). Разберем подробно причины такого поведения системы и рассмотрим эффективные способы решения этой задачи.
Проанализируем техническую составляющую работы 1С с контрольно-кассовой техникой (ККТ). Начиная с современных релизов конфигураций, построенных на базе Библиотеки подключаемого оборудования (БПО), платформа 1С работает с кассовым аппаратом не напрямую, а через специальную интеграционную компоненту (драйвер).
Взаимодействие происходит по строгому стандарту 1С. Вместо последовательной отправки отдельных команд печати каждой строки (как это было в старых версиях), 1С формирует единый структурированный XML-пакет данных CheckPackage и передает его в драйвер за один вызов.
Выясним главные причины ограничения:
Positions (фискальные позиции) и TextString (текстовые строки) исторически не предусмотрены атрибуты стилизации текста (жирность, шрифт, начертание).Рассмотри четыре практических способа, которые позволяют обойти данное ограничение и выводить жирный шрифт на чековую ленту.
Наиболее простое и надежное решение, не требующее снятия конфигурации с поддержки — это настройка внутренних таблиц самого фискального регистратора. Для касс «Ритейл-01Ф» и «Штрих-М» параметры отображения различных типов строк хранятся в энергонезависимой памяти устройства.
Разберем процесс настройки по шагам с помощью утилиты «Тест драйвера ККТ»:
После этой настройки кассовый аппарат будет автоматически печатать нужные строки (например, Итоговые суммы или Шапку) укрупненным или жирным шрифтом, даже если 1С отправляет туда обычный текст.
Если требуется выводить жирным шрифтом дополнительный нефискальный текст (например, условие рекламной акции, промокод или товарный чек), рассмотрим вариант прямого обращения к драйверу ККТ через внешнюю компоненту AddIn.DrvFR, минуя подсистему БПО.
Посмотрим на пример кода 1С для подключения компоненты и вызова метода печати широкой/жирной строки PrintWideString:
// Пример прямого обращения к драйверу ККТ для печати нефискальной жирной строки
Если ПодключитьВнешнююКомпоненту("AddIn.DrvFR") Тогда
Попытка
ДрайверФР = Новый ("AddIn.DrvFR");
// Установка пароля системного администратора (по умолчанию 30)
ДрайверФР.Password = 30;
// Указываем текст для печати
ДрайверФР.StringForPrinting = "*** ВНИМАНИЕ: СКИДКА НА СЛЕДУЮЩУЮ ПОКУПКУ 10% ***";
// Вызов метода печати широкой/жирной строки
ДрайверФР.PrintWideString();
Исключение
ЗаписьЖурналаРегистрации("ОшибкаПечатиФР",
УровеньЖурналаРегистрации.Ошибка,,,
ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось подключить внешнюю компоненту AddIn.DrvFR!");
КонецЕсли;
Важное ограничение: Прямым вызовом методов драйвера можно печатать только нефискальные документы до открытия фискального чека или после его закрытия. Внедрить прямой вызов PrintWideString внутрь процесса фискальной печати позиции по 54-ФЗ нельзя, так как это нарушит атомарность формирования чека и приведет к ошибке передачи данных в Оператор Фискальных Данных (ОФД).
Проанализируем вариант для программистов, когда необходимо доработать модуль формирования пакета чека. В подсистеме БПО за подготовку данных отвечает общий модуль МенеджерОборудованияКлиент или МенеджерОборудованияСервер.
Посмотрим на упрощенную структуру того, как формируется XML-пакет чека CheckPackage:
// Пример структуры XML-пакета для отправки в драйвер ККТ
Функция СформироватьПакетЧекаККМ(ДанныеЧека)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьНачалоЭлемента("CheckPackage");
// Формирование параметров чека
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("CashierName", ДанныеЧека.Кассир);
ЗаписьXML.ЗаписатьАтрибут("OperationType", "1"); // Приход
ЗаписьXML.ЗаписатьКонецЭлемента(); // Parameters
// Формирование фискальных позиций
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
Для Каждого Стр Из ДанныеЧека.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", Стр.Номенклатура);
ЗаписьXML.ЗаписатьАтрибут("Quantity", Формат(Стр.Количество, "ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("Price", Формат(Стр.Цена, "ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("Amount", Формат(Стр.Сумма, "ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Positions
// Добавление нефискальных текстовых строк
ЗаписьXML.ЗаписатьНачалоЭлемента("TextStrings");
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "=== СПАСИБО ЗА ПОКУПКУ! ===");
ЗаписьXML.ЗаписатьКонецЭлемента(); // TextString
ЗаписьXML.ЗаписатьКонецЭлемента(); // TextStrings
ЗаписьXML.ЗаписатьКонецЭлемента(); // CheckPackage
Возврат ЗаписьXML.Закрыть();
КонецФункции
Некоторые производители драйверов в свежих версиях интеграционных компонент добавляют поддержку специальных управляющих символов или спец-тегов внутри атрибута Text. Если драйвер поддерживает ESC/POS команды, добавление спец-символов в начало строки позволяет активировать режим жирного шрифта на время печати конкретного текстового блока.
Если жирным текстом требуется выделить не название товара, а логотип компании, информацию о скидке, купон или штрихкод акционной программы, наиболее эффективным решением будет использование печати изображений.
Современные версии БПО и драйверы «Штрих-М» / «Ритейл-01Ф» поддерживают метод PrintImage (печать картинки):
Подводя итог проанализированным методам, выделим главные рекомендации:
AddIn.DrvFR.