При автоматизации торговых точек и складов часто возникает задача печатать этикетки и ценники различных габаритов (например, стандартные 58х40 мм и компактные 29х20 мм) на одном физическом термопринтере (в частности, Zebra LP 2824 Plus). При выводе стандартного табличного документа из 1С возникает типовая сложность: если изменить размер макета только в базе данных, не меняя системные параметры драйвера печати в Windows, этикетка либо обрезается, либо сжимается в верхнем левом углу, либо принтер начинает прогонять пустую ленту. Предоставлять кассирам и операторам доступ к настройкам драйвера Windows небезопасно, поэтому разберем практические способы решения этой проблемы средствами операционной системы и встроенного языка 1С.
Проанализируем механизм взаимодействия платформы 1С и термопринтера. При формировании табличного документа 1С отправляет графическое задание через подсистему Windows GDI. Для нестандартных носителей драйвер принтера опирается на структуру DEVMODE. Если в системе не зафиксирован точный размер или 1С не передает кастомные габариты через диалог печати, драйвер использует размеры по умолчанию, заданные в операционной системе. В результате термопринтер либо ожидает длину этикетки 40 мм и позиционирует маленький макет 20 мм с огромным отступом, либо пытается прогнать ленту под размер стандартного листа.
Самое стабильное и простое в реализации решение, не требующее глубокого изменения типовой конфигурации — создание нескольких независимых копий принтера в операционной системе, подключенных к одному и тому же физическому порту (USB или сетевому ресурсу).
Разберем по шагам, как настроить систему:
ИмяПринтера.Посмотрим на пример кода во встроенном языке 1С:
ТабДокумент = Новый ТабличныйДокумент;
// Заполнение табличного документа макетом...
Если РазмерЭтикетки = "29x20" Тогда
ТабДокумент.ИмяПринтера = "Zebra_29x20";
ИначеЕсли РазмерЭтикетки = "58x40" Тогда
ТабДокумент.ИмяПринтера = "Zebra_58x40";
КонецЕсли;
ТабДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
При таком подходе каждый экземпляр принтера в Windows изолированно хранит свои параметры геометрии, и оператору не требуется вручную менять настройки драйвера.
Платформа 1С:Предприятие умеет сохранять индивидуальные настройки параметров страницы (масштаб, поля, ориентацию и выбранный размер бумаги) для каждого пользователя в системном хранилище настроек. Для этого используется свойство ИмяПараметровПечати табличного документа.
Если в коде конфигурации имя параметров зафиксировано жестко (например, только с привязкой к имени рабочей станции), настройки для разных макетов будут постоянно перезаписывать друг друга. Доработаем формирование имени параметров печати, добавив в него идентификатор размера.
Посмотрим на пример установки уникального ключа параметров:
// Формируем уникальный идентификатор параметров под каждый размер
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Этикетка_" + СокрЛП(РазмерЭтикетки) + "_" + СокрЛП(ИмяКомпьютера());
Разберем порядок первоначальной настройки:
Для высоконагруженных складов и магазинов оптимальным техническим решением является отказ от графического табличного документа и переход на прямую отправку команд на языке управления принтером (EPL2 или ZPL II). Термопринтер Zebra LP 2824 Plus аппаратно поддерживает протоколы EPL/ZPL, что исключает зависимость от драйверов Windows и многократно увеличивает скорость печати.
Разберем базовые команды языка EPL2 для позиционирования этикеток:
N — очистка буфера изображения перед началом формирования новой этикетки.q[ширина] — установка ширины области печати в точках (при стандартном разрешении 203 DPI плотность составляет 8 точек на 1 мм; для ширины 58 мм задается q464, для 29 мм — q232).Q[длина,зазор] — установка длины этикетки и высоты межэтикеточного зазора в точках (для высоты 40 мм с зазором 3 мм задается Q320,24, для 20 мм с зазором 3 мм — Q160,24).B — вывод штрихкода (Code 128, EAN-13 и др.) с точными координатами.P1 — команда запуска печати одной копии.При формировании текстового файла с EPL-командами мы отправляем его напрямую в очередь печати как RAW-данные (например, через команду copy /b file.txt \\localhost\Zebra или системные функции библиотеки winspool.drv), что полностью исключает влияние настроек драйвера Windows на итоговый результат.
Обратим внимание на аппаратную часть: при физической замене рулона с одного типоразмера на другой (с 58х40 на 29х20) оптический датчик принтера должен заново определить расстояние между этикетками. Для корректного позиционирования необходимо выполнить калибровку: после установки новой ленты и закрытия крышки нажать и удерживать зеленую кнопку подачи (Feed) на корпусе Zebra до двукратного мигания индикатора, после чего отпустить ее. Принтер выполнит автокалибровку по подложке и точно выставит начало следующей этикетки.