Как настроить красивый перенос длинных наименований на этикетках в 1С:Управление торговлей 11?

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

При работе с макетами ценников и этикеток в конфигурации «1С:Управление торговлей» (редакция 11) пользователи и разработчики часто сталкиваются с классической проблемой платформы. Когда для ячейки с наименованием номенклатуры установлено стандартное свойство «Размещение текста — Переносить», система пытается автоматически уместить текст в рамки выделенной области. Однако на узких шаблонах (например, на популярном формате ленты 58х30 мм) длинные слова начинают разбиваться самым непредсказуемым образом. В результате на новую строку переносятся некрасивые «ошметки» из 1–3 букв, что портит внешний вид этикетки и затрудняет ее чтение покупателями.

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

Выясняем причину: почему 1С некорректно переносит текст?

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

  1. Несовпадение метрик шрифтов: Драйверы специализированных принтеров этикеток (Zebra, TSC, Xprinter, Godex) передают операционной системе Windows свои внутренние метрики шрифтов. Платформа «1С:Предприятие» при расчете ширины символов ориентируется на стандартную сетку системы, а драйвер при отправке на печать использует собственные алгоритмы сжатия. В результате 1С «думает», что слово полностью помещается на строке, а принтер фактически переносит последние несколько букв.
  2. Ограничения стандартного механизма переноса: Визуальный редактор табличных документов 1С не имеет встроенной настройки «минимальное количество символов для переноса». Если включено свойство Переносить, платформа переносит текст по пробелам, но если одно слово физически не влезает в ширину ячейки, оно жестко разбивается посимвольно.

Давайте по шагам разберем три основных метода решения этой проблемы.

Решение 1. Тонкая настройка макета и шрифтов ячейки

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

Рассмотрим последовательность действий:

  1. Откройте шаблон этикетки через меню Продажи — Настройки и справочники — Шаблоны этикеток и ценников.
  2. Выделите ячейку, в которую выводится наименование номенклатуры, нажмите на нее правой кнопкой мыши и откройте Свойства.
  3. Смените шрифт: По умолчанию в макетах часто используется шрифт Times New Roman или MS Sans Serif. Они обладают широкими символами и засечками, которые занимают много места. Замените шрифт на более плотный шрифт семейства Sans-Serif — например, Arial, Calibri или, что еще лучше, узкий специализированный шрифт Arial Narrow. Это позволит уместить большее количество символов в одной строке и минимизирует вероятность автоматического разбиения слов.
  4. Уменьшите размер шрифта: Попробуйте снизить кегль шрифта на 1–2 пункта (например, с 10 до 8.5). На термоэтикетках качественные принтеры без проблем печатают даже мелкий текст.
  5. Настройте отступы (поля) ячейки: В свойствах ячейки найдите параметры отступов (Поле сверху, Поле снизу, Поле слева, Поле справа). По умолчанию там могут стоять значения по 1–2 мм. Установите их в значение 0. Это расширит полезную область печати внутри рамки ячейки.
  6. Объединение ячеек и автовысота: Убедитесь, что ячейка наименования объединена по вертикали хотя бы на 2–3 строки макета, а в свойствах строки табличного документа включена галочка Автовысота строки. Если область вывода слишком зажата по высоте, полноценный перенос по словам работать просто не сможет.

Решение 2. Обход багов драйвера принтера

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

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

Вариант Б. Изменение режима вывода текста в драйвере Windows
Если вы не хотите каждый раз нажимать галочку при печати, измените режим обработки шрифтов на уровне операционной системы:

  1. Перейдите в Панель управления — Устройства и принтеры.
  2. Кликните правой кнопкой мыши по вашему принтеру этикеток и выберите Настройки печати (Printing Preferences).
  3. Найдите вкладку Параметры устройства / Сервис (Parameters / Tools). Названия вкладок могут отличаться в зависимости от производителя (Zebra, TSC, Godex).
  4. Найдите настройку вывода текстовых объектов и переключите ее в режим «Печатать текст как графику» (Render as graphics / Graphic Text). Теперь драйвер перестанет подменять системные шрифты своими собственными, и верстка этикеток больше не будет «съезжать».

Решение 3. Программный интеллектуальный перенос текста

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

Для реализации этого метода мы добавим собственное вычисляемое поле или доработаем процедуру заполнения данных печати в модуле менеджера обработки печати (через механизм расширений конфигурации).

Проанализируем алгоритм «умного» переноса:

  1. Разбиваем исходное наименование на массив отдельных слов.
  2. Последовательно собираем слова обратно в единую строку, подсчитывая общую длину текущей строки в символах.
  3. Если при добавлении очередного слова длина строки превышает максимально допустимый предел для одной строчки этикетки (например, 15 или 20 символов), мы принудительно вставляем в текст символ переноса Символы.ПС и начинаем новую строку.

Посмотрим на пример реализации такой функции на встроенном языке 1С:


Функция ПолучитьКрасивоеНаименование(Знач ИсхТекст, МаксДлинаСтроки = 18) Экспорт
    
    // Если текст изначально пустой или короткий, возвращаем его без изменений
    Если СтрДлина(ИсхТекст) <= МаксДлинаСтроки Тогда
        Возврат ИсхТекст;
    КонецЕсли;
    
    // Разделяем строку на массив слов по пробелам
    МассивСлов = СтрРазделить(ИсхТекст, " ", Ложь);
    
    Результат = "";
    ТекущаяСтрока = "";
    
    Для Каждого Слово Из МассивСлов Цикл
        
        Если ПустаяСтрока(Слово) Тогда
            Продолжить;
        КонецЕсли;
        
        // Проверяем, помещается ли текущее слово в лимит строки
        Если СтрДлина(ТекущаяСтрока + " " + Слово) <= МаксДлинаСтроки Тогда
            // Добавляем слово к текущей строке
            Если ПустаяСтрока(ТекущаяСтрока) Тогда
                ТекущаяСтрока = Слово;
            Иначе
                ТекущаяСтрока = ТекущаяСтрока + " " + Слово;
            КонецЕсли;
        Иначе
            // Если слово не помещается, переносим его на новую строку
            Если НЕ ПустаяСтрока(Результат) Тогда
                Результат = Результат + Символы.ПС + ТекущаяСтрока;
            Иначе
                Результат = ТекущаяСтрока;
            КонецЕсли;
            
            ТекущаяСтрока = Слово;
        КонецЕсли;
        
    КонецЦикла;
    
    // Добавляем последний обработанный фрагмент
    Если НЕ ПустаяСтрока(ТекущаяСтрока) Тогда
        Если НЕ ПустаяСтрока(Результат) Тогда
            Результат = Результат + Символы.ПС + ТекущаяСтрока;
        Иначе
            Результат = ТекущаяСтрока;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

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

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

← На главную