Работа с торговым оборудованием в среде 1С 7.7 часто требует прямого взаимодействия с драйверами устройств. Одной из популярных задач является брендирование чеков — вывод графического логотипа компании. Рассмотрим подробно, как реализовать смену логотипа на аппаратах серии ШТРИХ (например, ШТРИХ-LIGHT), проанализируем структуру данных для передачи изображения и разберем типичные ошибки программной реализации.
Прежде всего, разберем, как физически кассовый аппарат (ККТ) обрабатывает картинку. Изображение не передается в момент печати каждой строки чека целиком. Процесс разделен на два этапа: сначала мы должны загрузить данные в память устройства, а затем отправить команду на печать загруженной области. Для этого в драйвере ШТРИХ-М существуют специализированные методы и свойства.
Проанализируем два основных способа решения задачи: ручное формирование строк через LineData и использование автоматизированной загрузки из файла через LoadImage.
Этот метод считается более «низкоуровневым» и требует понимания того, как упакованы пиксели. Разберем структуру данных. Свойство LineData представляет собой строку символов, где каждый символ (байт) кодирует 8 горизонтальных точек изображения.
Выясним технические параметры для модели ШТРИХ-LIGHT. Ширина термоголовки этого аппарата составляет 384 точки. Математика проста: 384 / 8 = 48. Следовательно, для передачи одной горизонтальной линии изображения нам нужно сформировать строку ровно из 48 байт. Каждый бит в байте отвечает за конкретную точку: 1 — точка печатается (черный цвет), 0 — точка пропускается (белый цвет). Старший бит байта соответствует самой левой точке в группе.
Рассмотрим алгоритм работы с LoadLineData:
30) в свойство Password.LineData.LoadLineData(). Драйвер последовательно записывает эти строки во внутренний буфер ККТ.Если нет необходимости вручную генерировать изображение попиксельно в коде 1С, проще и надежнее использовать метод LoadImage. Он позволяет загрузить готовый файл формата BMP. Однако здесь существуют жесткие требования к файлу, несоблюдение которых приводит к тому, что метод отрабатывает без ошибок, но на чеке ничего не печатается.
Проанализируем требования к BMP-файлу:
Посмотрим на пример правильной реализации загрузки и печати в коде 1С 7.7:
// Создаем объект драйвера (предположим, он уже инициализирован как ФР)
ФР.Password = 30; // Пароль системного администратора
ФР.FileName = "C:\pic\logo.bmp";
ФР.CenterImage = 1; // Центрировать изображение
ФР.FirstLineNumber = 1;
// Загружаем картинку в память ККТ
Результат = ФР.LoadImage();
Если Результат <> 0 Тогда
Сообщить("Ошибка загрузки: " + ФР.ResultCodeDescription);
Возврат;
КонецЕсли;
// Теперь нужно напечатать то, что загрузили
// Номер последней строки драйвер вычислил сам при загрузке
ФР.FirstLineNumber = 1;
// Допустим, мы знаем, что высота картинки 70 строк
ФР.LastLineNumber = 70;
ФР.Draw();
Часто программисты сталкиваются с ситуацией, когда код выполняется, но принтер молчит. Разберем основные причины:
Draw) запрещена, если открыт фискальный чек. Команду печати логотипа нужно подавать либо до вызова OpenCheck, либо после CloseCheck.Password = 30).FirstLineNumber и LastLineNumber. Если вы пытаетесь напечатать диапазон строк, который не был загружен (например, загрузили 50 строк, а печатаете до 100-й), устройство может выдать ошибку.Для современных онлайн-касс (Ф-серия) рекомендуется использовать метод PrintBitmap, если он поддерживается вашей версией драйвера (обычно начиная с 4.13). Он объединяет загрузку и печать в одну операцию и более лоялен к форматам файлов.
Также рассмотрим наиболее стабильный способ для розничной торговли: хранение логотипа в таблицах ККТ. С помощью утилиты «Тест драйвера» можно один раз загрузить картинку в память аппарата и в таблице настроек (Таблица 1, параметры текста) указать автоматическую печать логотипа при открытии или закрытии каждого чека. В этом случае в коде 1С вообще не нужно будет прописывать команды Draw, что существенно повышает надежность системы.
Выясним, как это сделать программно через таблицы, если все же нужно управлять этим из 1С:
// Установка параметра "Печать рекламного текста" в таблицах
ФР.TableNumber = 1;
ФР.RowNumber = 1;
ФР.FieldNumber = 17; // Номер поля может меняться в зависимости от модели
ФР.ValueOfFieldInteger = 1; // 1 - печатать логотип в начале чека
ФР.WriteTable();
Подводя итог, отметим: если вам необходимо динамически менять логотипы, используйте связку LoadImage и Draw с обязательным контролем ResultCode после каждого шага. Если логотип статичен — лучше один раз настроить его в таблицах ККТ, чтобы не нагружать канал связи с кассой лишними данными при каждом пробитии чека.