Как правильно настроить размер печатной формы этикетки под термопринтер в 1С 8.2

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

При работе с термопринтерами этикеток (Zebra, TSC, Godex) в среде 1С:Предприятие 8.2 (например, в конфигурациях УТП или УТ 10.3) программисты часто сталкиваются с проблемой «бесконечной печати» или так называемой «бороды». Ситуация выглядит так: вместо одной этикетки принтер выдает десяток пустых листов или растягивает изображение на несколько сегментов, хотя в драйвере принтера выставлены корректные размеры. Разберем подробно, как решить эту задачу программными средствами и через настройку макета.

Анализ проблемы: почему 1С печатает некорректно?

Основная причина кроется в том, что по умолчанию 1С пытается подогнать ТабличныйДокумент под параметры страницы стандартного принтера (А4). Даже если в настройках Windows указан размер 43х25 мм, 1С может игнорировать эти настройки, если они не заданы жестко в коде. В результате принтер считает, что область печати выходит за границы одной этикетки, и продолжает подачу ленты до тех пор, пока не будет достигнут конец виртуальной «страницы» 1С.

Рассмотрим комплексный подход к решению этой проблемы, который включает программную настройку свойств печатной формы.

Шаг 1: Программная установка параметров страницы

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

Проанализируем следующий фрагмент кода, который позволяет жестко задать границы:


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

// Устанавливаем все поля в 0, чтобы исключить непечатаемые зоны
ТабДокумент.ПолеСверху   = 0;
ТабДокумент.ПолеСлева    = 0;
ТабДокумент.ПолеСнизу    = 0;
ТабДокумент.ПолеСправа   = 0;

// Убираем колонтитулы, которые могут смещать содержимое
ТабДокумент.РазмерКолонтитулаСверху = 0;
ТабДокумент.РазмерКолонтитулаСнизу  = 0;

// Отключаем автоматическое масштабирование, чтобы 1С не пыталась «впихнуть» этикетку
ТабДокумент.Автомасштаб = Ложь;

// Указываем, что размер страницы будет задан пользователем (Custom)
ТабДокумент.РазмерСтраницы = "Custom";

// Устанавливаем точную ширину и высоту в миллиметрах
ТабДокумент.ШиринаСтраницы = 43;
ТабДокумент.ВысотаСтраницы = 25;

Важный момент: Установка свойства РазмерСтраницы = "Custom" в сочетании с ШиринаСтраницы и ВысотаСтраницы является ключевым фактором для правильной работы драйверов термопринтеров. Это заставляет драйвер переключиться в режим печати на конкретном физическом носителе.

Шаг 2: Настройка высоты строк и ширины колонок в макете

Если после настройки параметров страницы текст всё равно «уезжает» или обрезается, необходимо проверить соответствие размеров ячеек в макете. В 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С автоматически увеличит строку, что мгновенно приведет к выходу за границы физической этикетки и появлению «бороды».

Шаг 3: Тонкости вывода на печать

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


ТабДокумент.ИмяПринтера = ""; // Очищаем кэш принтера для документа
// ... установка параметров страницы (как в Шаге 1) ...
ТабДокумент.ИмяПринтера = "Zebra_2824"; // Назначаем конкретный принтер

Также обратим внимание на режим вывода. При использовании РежимИспользованияДиалогаПечати.Использовать пользователь может случайно изменить настройки. Для этикеток лучше использовать прямую печать:

ТабДокумент.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

Проверка настроек драйвера (вне 1С)

Если программные методы не помогают, выясним причину в настройках самого принтера в Windows. Рассмотрим основные пункты:

  1. Тип датчика (Sensing): Убедитесь, что стоит значение «Gaps» (Зазоры) или «Web sensing», если вы используете стандартную ленту с зазорами. Если стоит «Continuous» (Непрерывная), принтер не будет искать край этикетки.
  2. Непечатаемая область: В драйвере часто по умолчанию стоят поля 1-2 мм. Если в 1С вы ставите поля 0, а драйвер считает, что по краям печатать нельзя, возникнет конфликт. Установите все отступы в драйвере в 0.
  3. Графика: Для термопринтеров рекомендуется устанавливать режим «Dithering: None» (Нет), чтобы штрихкоды были максимально четкими без лишних точек.

Итоговый контрольный список для решения проблемы

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

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

← На главную