При работе с принтерами этикеток (такими как Zebra, TSC или Godex) программисты 1С часто сталкиваются с неприятной ситуацией: вместо одной наклейки принтер выдает две, причем вторая оказывается абсолютно пустой. Это не только замедляет работу склада или магазина, но и ведет к неоправданному расходу расходных материалов. В этой статье мы подробно разберем, почему так происходит и как исправить эту проблему раз и навсегда.
Одной из самых частых и неочевидных причин появления лишнего листа является механизм сохранения настроек печати в 1С. Система запоминает настройки (размер бумаги, поля, ориентацию) для каждого пользователя в привязке к определенному идентификатору. Рассмотрим, как это работает программно.
Если вы используете одно и то же имя параметров печати для разных документов (например, для обычного счета А4 и для маленькой этикетки), 1С может попытаться применить настройки от А4 к этикетке. В итоге принтер «думает», что печатаемая область гораздо больше физического размера этикетки, и проматывает ленту на второй лист.
Решение: Назначим для этикетки уникальное ИмяПараметровПечати. Проанализируем пример кода:
// Создаем объект табличного документа
ТабДок = Новый ТабличныйДокумент;
// Устанавливаем уникальный идентификатор настроек
// Это заставит 1С хранить настройки именно для этого типа этикетки отдельно
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭТИКЕТКА_ЛОГИСТИКА_58х40";
// Далее идет формирование макета...
После внесения этого изменения при первой печати пользователю нужно будет один раз настроить параметры страницы вручную, и 1С запомнит их именно для этого идентификатора.
Часто в макете 1С визуально кажется, что лишних колонок или строк нет, но на самом деле в них когда-то были данные или просто осталось форматирование. 1С воспринимает такие ячейки как часть документа, которую нужно вывести на печать.
Разберем, как правильно очистить макет:
Также важно программно ограничить область печати, если в макет выводятся дополнительные секции. Посмотрим на пример использования именованных строк и колонок:
// Явно задаем область, которая должна пойти на принтер
Область = Макет.ПолучитьОбласть("Этикетка");
ТабДок.Вывести(Область);
// Если в макете есть лишние пустые области,
// можно попробовать принудительно установить область печати
ТабДок.ОбластьПечати = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
По умолчанию 1С устанавливает поля (левое, правое, верхнее, нижнее) по 10 мм. Для этикетки размером 58x40 мм такие поля — это катастрофа, так как они суммарно отнимают 20 мм от ширины и высоты. В результате полезное содержимое просто «выталкивается» на следующую страницу.
Выясним, как программно обнулить поля, чтобы максимально эффективно использовать пространство этикетки:
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверху = 0;
ТабДок.ПолеСнизу = 0;
// Также полезно включить автоматический масштаб,
// чтобы 1С попыталась вписать содержимое в одну страницу
ТабДок.АвтоМасштаб = Истина;
В языке 1С существует полезный метод ПроверитьВывод(). Он позволяет заранее узнать, поместится ли сформированный документ на лист с текущими настройками принтера. Рассмотрим ситуацию: мы хотим вывести этикетку, но не уверены, что она не создаст лишний лист.
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ОбластьЭтикетки);
// Проверяем, помещается ли область на страницу
Если Не ТабДок.ПроверитьВывод(МассивОбъектов) Тогда
Сообщить("Внимание: этикетка не помещается на один лист! Проверьте настройки полей.");
КонецЕсли;
Если программные методы в 1С не помогают, проблема может крыться в настройках самого драйвера Windows. Принтеры Zebra крайне чувствительны к двум параметрам: Size (Размер) и Media Type (Тип носителя).
Проанализируем шаги по настройке драйвера:
Иногда принтер «теряет» понимание того, где заканчивается одна наклейка и начинается другая. В этом случае даже идеальные настройки в 1С не помогут. Выясним причину через калибровку:
Для большинства моделей Zebra достаточно зажать кнопку подачи бумаги (Feed) и дождаться, пока индикатор мигнет определенное количество раз (обычно дважды), после чего принтер прогонит несколько этикеток и замерит расстояние между ними. Также это можно сделать через утилиту Zebra Setup Utilities, выбрав пункт «Calibrate Media».
Если борьба с макетами и драйверами Windows не приносит стабильного результата, рассмотрим профессиональный подход — использование языка команд ZPL (Zebra Programming Language). В этом случае мы не рисуем макет в 1С, а отправляем на принтер текстовую строку с координатами.
Пример формирования ZPL-кода в 1С:
ТекстZPL = "^XA" + // Начало формата
"^FO50,50^A0N,36,36^FDПривет, 1С!^FS" + // Текст по координатам 50,50
"^XZ"; // Конец формата
// Отправка строки напрямую в порт принтера или через RAW-драйвер
Этот метод полностью исключает проблемы с полями, масштабом и лишними страницами, так как принтер исполняет команды «как есть» в своих внутренних координатах.
Подводя итог, отметим: чаще всего проблема лишнего листа решается комбинацией уникального имени параметров печати и обнулением полей в табличном документе. Проверьте эти параметры в первую очередь, и ваш принтер Zebra будет работать корректно.