Как отправить двоичные данные принтера этикеток из 1С на печать

Программист 1С v8.3 (Обычные формы) Торговля и дистрибуция
← На главную

При интеграции 1С с современными логистическими сервисами или маркетплейсами программисты часто сталкиваются с ситуацией, когда готовая этикетка приходит не в виде картинки или PDF, а в виде набора инструкций для принтера (языки ZPL, EPL или TSPL), упакованных в строку Base64. Стандартные средства 1С, такие как табличные документы, не предназначены для обработки таких «сырых» (RAW) данных. Особенно остро эта проблема стоит в «древних» конфигурациях, таких как УПП 1.3 или другие решения на обычных формах.

В этой статье мы подробно разберем, как извлечь эти данные и успешно отправить их на принтер этикеток, используя системные команды Windows и встроенные возможности платформы 1С.

Шаг 1. Декодирование данных из Base64

Прежде всего, нам необходимо преобразовать текстовую строку Base64 обратно в двоичные данные. В платформе 1С для этого используется встроенная функция Base64Значение(). Проанализируем, как правильно подготовить файл для последующей отправки на печать.

Рассмотрим пример кода, который принимает строку Base64, преобразует ее в объект ДвоичныеДанные и сохраняет во временный файл на диске:


// Предположим, СтрокаBase64 - это полученные данные
ДвоичныеДанные = Base64Значение(СтрокаBase64);

// Формируем путь к временному файлу
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
ДвоичныеДанные.Записать(ИмяФайла);

Важный нюанс: если данные приходят из веб-сервиса с префиксами (например, data:application/octet-stream;base64,...), их необходимо предварительно очистить с помощью строковых функций Сред() или СтрЗаменить(), иначе декодирование пройдет некорректно.

Шаг 2. Использование системной команды COPY для печати

Самый простой и эффективный метод, предложенный в обсуждении, — это использование старой доброй команды copy из командной строки Windows. Эта команда позволяет передать содержимое файла напрямую в порт принтера или на сетевой принтер.

Для корректной передачи бинарных данных (чтобы символы конца строки или специфические байты не интерпретировались системой) крайне важно использовать ключ /b (binary).

Разберем структуру команды:

copy /b "ПутьКФайлу" "ПутьКПринтеру"

В 1С это реализуется через объект КомандаСистемы() или метод ЗапуститьПриложение(). Рассмотрим программную реализацию:


ПутьКФайлу = "C:\temp\label.bin";
ПутьКПринтеру = "\\ИмяКомпьютера\ИмяПринтера"; // Либо сетевой путь, либо имя порта

// Формируем текст команды
ТекстКоманды = "cmd /c copy /b """ + ПутьКФайлу + """ """ + ПутьКПринтеру + """";

// Выполняем команду
ЗапуститьПриложение(ТекстКоманды, , Истина);

Использование cmd /c необходимо для того, чтобы после выполнения операции окно командной строки автоматически закрылось.

Шаг 3. Решение проблемы с USB-принтерами (Mapping)

Многие современные принтеры этикеток подключаются через USB, и у них нет прямого порта типа LPT1 или COM1. Если вы попытаетесь отправить команду copy просто на имя USB-устройства, она может не сработать. В этом случае мы применим механизм перенаправления портов (Mapping).

  1. Опубликуйте принтер: Зайдите в свойства принтера в Windows, перейдите на вкладку «Доступ» и установите галочку «Общий доступ к данному принтеру». Задайте простое сетевое имя (например, Zebra).
  2. Свяжите порт с сетевым путем: Выполните в командной строке (или через 1С) следующую команду: net use lpt1: \\127.0.0.1\Zebra /persistent:yes
  3. Печатайте в порт: Теперь вы можете отправлять данные напрямую в lpt1.

Шаг 4. Настройка драйвера Generic / Text Only

Иногда штатный драйвер принтера пытается «обработать» входящие данные, даже если это прямые команды ZPL/EPL. Это приводит к тому, что принтер либо вообще не реагирует, либо печатает текст команд вместо штрихкода.

Проанализируем ситуацию: для прямой печати профессионалы рекомендуют установить в системе второй экземпляр того же принтера, но при установке выбрать драйвер Generic / Text Only (Стандартный / Только текст). Этот драйвер работает как «прозрачный шлюз», передавая байты на устройство без изменений. В 1С при формировании команды печати указывайте путь именно к этому «текстовому» принтеру.

Шаг 5. Работа с COM-портами и команда MODE

Если ваш принтер подключен через реальный или виртуальный COM-порт, простой отправки файла может быть недостаточно. Порту нужно задать параметры связи (скорость, четность и т.д.). Для этого используется команда mode.

Выясним причину возможных «кракозябр» при печати: если скорость порта в Windows не совпадает со скоростью, установленной в принтере, данные будут искажены. Перед печатью рекомендуется выполнить:


// Настройка порта COM1: скорость 9600, без четности, 8 бит данных, 1 стоп-бит
ТекстНастройки = "mode com1:9600,n,8,1";
ЗапуститьПриложение("cmd /c " + ТекстНастройки, , Истина);

Альтернативный метод: Использование ADODB.Stream

В старых версиях 1С (особенно в 7.7 или ранних 8.2) метод Записать() у двоичных данных мог добавлять в файл лишние символы (например, BOM-метки), которые сбивают логику принтера. В таких случаях мы можем использовать COM-объект ADODB.Stream для гарантированной побайтовой записи.


Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 1; // Binary
Stream.Open();
Stream.Write(ДвоичныеДанные);
Stream.SaveToFile(ПутьКФайлу, 2); // 2 - перезаписывать
Stream.Close();

Этот метод гарантирует, что файл на диске будет на 100% идентичен тому, что пришло в Base64, без единого лишнего байта.

Резюмируем: Для успешной печати двоичных данных из 1С необходимо пройти три этапа: корректное декодирование из Base64, сохранение в «чистый» бинарный файл и отправка этого файла в порт принтера (предварительно расшаренного или настроенного как Generic Text) с помощью команды copy /b.

← На главную