При работе с термопринтерами этикеток (Zebra, TSC, Godex) в среде 1С:Предприятие 8.2 (например, в конфигурациях УТП или УТ 10.3) программисты часто сталкиваются с проблемой «бесконечной печати» или так называемой «бороды». Ситуация выглядит так: вместо одной этикетки принтер выдает десяток пустых листов или растягивает изображение на несколько сегментов, хотя в драйвере принтера выставлены корректные размеры. Разберем подробно, как решить эту задачу программными средствами и через настройку макета.
Основная причина кроется в том, что по умолчанию 1С пытается подогнать ТабличныйДокумент под параметры страницы стандартного принтера (А4). Даже если в настройках Windows указан размер 43х25 мм, 1С может игнорировать эти настройки, если они не заданы жестко в коде. В результате принтер считает, что область печати выходит за границы одной этикетки, и продолжает подачу ленты до тех пор, пока не будет достигнут конец виртуальной «страницы» 1С.
Рассмотрим комплексный подход к решению этой проблемы, который включает программную настройку свойств печатной формы.
Для того чтобы 1С понимала физические границы этикетки, недостаточно просто отредактировать макет. Необходимо в коде обработки, перед выводом на печать или просмотр, принудительно установить параметры объекта ТабличныйДокумент. Разберем по шагам, какие свойства критически важны.
Проанализируем следующий фрагмент кода, который позволяет жестко задать границы:
// Создаем объект или используем существующий
ТабДокумент = Новый ТабличныйДокумент;
// Устанавливаем все поля в 0, чтобы исключить непечатаемые зоны
ТабДокумент.ПолеСверху = 0;
ТабДокумент.ПолеСлева = 0;
ТабДокумент.ПолеСнизу = 0;
ТабДокумент.ПолеСправа = 0;
// Убираем колонтитулы, которые могут смещать содержимое
ТабДокумент.РазмерКолонтитулаСверху = 0;
ТабДокумент.РазмерКолонтитулаСнизу = 0;
// Отключаем автоматическое масштабирование, чтобы 1С не пыталась «впихнуть» этикетку
ТабДокумент.Автомасштаб = Ложь;
// Указываем, что размер страницы будет задан пользователем (Custom)
ТабДокумент.РазмерСтраницы = "Custom";
// Устанавливаем точную ширину и высоту в миллиметрах
ТабДокумент.ШиринаСтраницы = 43;
ТабДокумент.ВысотаСтраницы = 25;
Важный момент: Установка свойства РазмерСтраницы = "Custom" в сочетании с ШиринаСтраницы и ВысотаСтраницы является ключевым фактором для правильной работы драйверов термопринтеров. Это заставляет драйвер переключиться в режим печати на конкретном физическом носителе.
Если после настройки параметров страницы текст всё равно «уезжает» или обрезается, необходимо проверить соответствие размеров ячеек в макете. В 1С высота строк измеряется в пунктах (1 пункт ≈ 0.35 мм), а ширина колонок имеет свою специфическую размерность. Чтобы добиться точности, мы можем использовать расчетные коэффициенты.
Посмотрим на пример того, как программно рассчитать высоту областей этикетки, исходя из общей высоты в миллиметрах:
// Допустим, общая высота этикетки 25 мм
ВысотаЭтикеткиММ = 25;
// Пример распределения высоты между секциями (наименование, штрихкод, цена)
// Используем коэффициент 2.65 для примерного пересчета единиц 1С
ОбластьНоменклатура.ВысотаСтроки = ВысотаЭтикеткиММ * 2.65 * 0.3; // 30% высоты
ОбластьШтрихкод.ВысотаСтроки = ВысотаЭтикеткиММ * 2.65 * 0.5; // 50% высоты
ОбластьЦена.ВысотаСтроки = ВысотаЭтикеткиММ * 2.65 * 0.2; // 20% высоты
// Установка ширины колонки (коэффициент может варьироваться от разрешения принтера)
ШиринаЭтикеткиММ = 43;
ЭтикеткаОбласть.Область(1,1,1,1).ШиринаКолонки = ШиринаЭтикеткиММ * 0.53;
Проанализируем ситуацию: использование ВысотаСтроки позволяет избежать «расползания» макета. Если в ячейке установлено свойство «Переносить», и текст не влезает по высоте, 1С автоматически увеличит строку, что мгновенно приведет к выходу за границы физической этикетки и появлению «бороды».
Часто ошибки возникают из-за кэширования настроек печати в профиле пользователя. Если вы один раз распечатали этикетку неправильно, 1С может запомнить эти параметры (например, старые поля). Чтобы этого избежать, перед назначением принтера рекомендуется очистить его имя в объекте:
ТабДокумент.ИмяПринтера = ""; // Очищаем кэш принтера для документа
// ... установка параметров страницы (как в Шаге 1) ...
ТабДокумент.ИмяПринтера = "Zebra_2824"; // Назначаем конкретный принтер
Также обратим внимание на режим вывода. При использовании РежимИспользованияДиалогаПечати.Использовать пользователь может случайно изменить настройки. Для этикеток лучше использовать прямую печать:
ТабДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Если программные методы не помогают, выясним причину в настройках самого принтера в Windows. Рассмотрим основные пункты:
Подведем итог. Чтобы ваша этикетка 43х25 мм печаталась идеально, проверьте выполнение следующих условий:
ПолеСверху, ПолеСлева и т.д. в значение 0.Автомасштаб = Ложь.ШиринаСтраницы = 43 и ВысотаСтраницы = 25.Выполняя эти шаги последовательно, мы добьемся того, что 1С будет формировать задание на печать строго по размеру ленты, и принтер перестанет выдавать лишние пустые листы.