Как убрать печать лишней пустой этикетки на принтере Zebra из 1С?

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

При работе с принтерами этикеток (такими как Zebra, TSC или Godex) программисты 1С часто сталкиваются с неприятной ситуацией: вместо одной наклейки принтер выдает две, причем вторая оказывается абсолютно пустой. Это не только замедляет работу склада или магазина, но и ведет к неоправданному расходу расходных материалов. В этой статье мы подробно разберем, почему так происходит и как исправить эту проблему раз и навсегда.

Причина 1. Использование уникального имени параметров печати

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

Если вы используете одно и то же имя параметров печати для разных документов (например, для обычного счета А4 и для маленькой этикетки), 1С может попытаться применить настройки от А4 к этикетке. В итоге принтер «думает», что печатаемая область гораздо больше физического размера этикетки, и проматывает ленту на второй лист.

Решение: Назначим для этикетки уникальное ИмяПараметровПечати. Проанализируем пример кода:


// Создаем объект табличного документа
ТабДок = Новый ТабличныйДокумент;

// Устанавливаем уникальный идентификатор настроек
// Это заставит 1С хранить настройки именно для этого типа этикетки отдельно
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭТИКЕТКА_ЛОГИСТИКА_58х40";

// Далее идет формирование макета...

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

Причина 2. Очистка «фантомных» ячеек и области печати в макете

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

Разберем, как правильно очистить макет:

  1. Откроем макет этикетки в конфигураторе.
  2. Выделим все пустые колонки справа от основной области этикетки (начиная от границы этикетки и до упора вправо).
  3. Нажмем правую кнопку мыши и выберем пункт «Удалить» (именно удалить, а не просто очистить содержимое).
  4. Повторим ту же процедуру для всех строк снизу под макетом.

Также важно программно ограничить область печати, если в макет выводятся дополнительные секции. Посмотрим на пример использования именованных строк и колонок:


// Явно задаем область, которая должна пойти на принтер
Область = Макет.ПолучитьОбласть("Этикетка");
ТабДок.Вывести(Область);

// Если в макете есть лишние пустые области, 
// можно попробовать принудительно установить область печати
ТабДок.ОбластьПечати = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);

Причина 3. Настройка полей (Margins) в табличном документе

По умолчанию 1С устанавливает поля (левое, правое, верхнее, нижнее) по 10 мм. Для этикетки размером 58x40 мм такие поля — это катастрофа, так как они суммарно отнимают 20 мм от ширины и высоты. В результате полезное содержимое просто «выталкивается» на следующую страницу.

Выясним, как программно обнулить поля, чтобы максимально эффективно использовать пространство этикетки:


ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;

// Также полезно включить автоматический масштаб, 
// чтобы 1С попыталась вписать содержимое в одну страницу
ТабДок.АвтоМасштаб = Истина;

Причина 4. Проверка вывода перед печатью

В языке 1С существует полезный метод ПроверитьВывод(). Он позволяет заранее узнать, поместится ли сформированный документ на лист с текущими настройками принтера. Рассмотрим ситуацию: мы хотим вывести этикетку, но не уверены, что она не создаст лишний лист.


МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ОбластьЭтикетки);

// Проверяем, помещается ли область на страницу
Если Не ТабДок.ПроверитьВывод(МассивОбъектов) Тогда
    Сообщить("Внимание: этикетка не помещается на один лист! Проверьте настройки полей.");
КонецЕсли;

Причина 5. Тонкая настройка драйвера Zebra

Если программные методы в 1С не помогают, проблема может крыться в настройках самого драйвера Windows. Принтеры Zebra крайне чувствительны к двум параметрам: Size (Размер) и Media Type (Тип носителя).

Проанализируем шаги по настройке драйвера:

  1. Зайдем в «Устройства и принтеры», найдем нашу Zebra и откроем «Настройки печати» (Printing Preferences).
  2. На вкладке «Page Setup» (Параметры страницы) проверим, соответствует ли размер бумаги физическому размеру этикетки в рулоне. Если там стоит «User Defined» или размер по умолчанию (например, 4x6 дюймов), а у вас этикетка 30х20 мм — принтер обязательно выдаст пустые листы.
  3. Перейдем на вкладку «Stock» (Материал). Здесь критически важно поле «Media Type» или «Sensor Type». Если у вас обычные этикетки с разрывом, должен быть выбран режим «Web Sensing» или «Gap» (С зазором). Если принтер настроен на «Continuous» (Непрерывная лента), он не будет искать край этикетки и остановится там, где закончится виртуальный лист 1С.

Причина 6. Аппаратная калибровка

Иногда принтер «теряет» понимание того, где заканчивается одна наклейка и начинается другая. В этом случае даже идеальные настройки в 1С не помогут. Выясним причину через калибровку:

Для большинства моделей Zebra достаточно зажать кнопку подачи бумаги (Feed) и дождаться, пока индикатор мигнет определенное количество раз (обычно дважды), после чего принтер прогонит несколько этикеток и замерит расстояние между ними. Также это можно сделать через утилиту Zebra Setup Utilities, выбрав пункт «Calibrate Media».

Причина 7. Прямая печать через ZPL (для продвинутых)

Если борьба с макетами и драйверами Windows не приносит стабильного результата, рассмотрим профессиональный подход — использование языка команд ZPL (Zebra Programming Language). В этом случае мы не рисуем макет в 1С, а отправляем на принтер текстовую строку с координатами.

Пример формирования ZPL-кода в 1С:


ТекстZPL = "^XA" + // Начало формата
           "^FO50,50^A0N,36,36^FDПривет, 1С!^FS" + // Текст по координатам 50,50
           "^XZ"; // Конец формата

// Отправка строки напрямую в порт принтера или через RAW-драйвер

Этот метод полностью исключает проблемы с полями, масштабом и лишними страницами, так как принтер исполняет команды «как есть» в своих внутренних координатах.

Подводя итог, отметим: чаще всего проблема лишнего листа решается комбинацией уникального имени параметров печати и обнулением полей в табличном документе. Проверьте эти параметры в первую очередь, и ваш принтер Zebra будет работать корректно.

← На главную