При работе с макетами ценников и этикеток в конфигурации «1С:Управление торговлей» (редакция 11) пользователи и разработчики часто сталкиваются с классической проблемой платформы. Когда для ячейки с наименованием номенклатуры установлено стандартное свойство «Размещение текста — Переносить», система пытается автоматически уместить текст в рамки выделенной области. Однако на узких шаблонах (например, на популярном формате ленты 58х30 мм) длинные слова начинают разбиваться самым непредсказуемым образом. В результате на новую строку переносятся некрасивые «ошметки» из 1–3 букв, что портит внешний вид этикетки и затрудняет ее чтение покупателями.
В этой статье мы подробно разберем, почему возникает данная проблема, и рассмотрим несколько эффективных способов ее решения — от простых визуальных настроек макета без программирования до гибкого программного разбиения строк в коде 1С.
Прежде чем переходить к устранению проблемы, проанализируем ситуацию. Некорректный перенос (по буквам вместо слов) чаще всего связан с двумя ключевыми факторами:
Переносить, платформа переносит текст по пробелам, но если одно слово физически не влезает в ширину ячейки, оно жестко разбивается посимвольно.Давайте по шагам разберем три основных метода решения этой проблемы.
Зачастую исправить некрасивый перенос букв удается без изменения программного кода конфигурации. Для этого нам необходимо оптимизировать параметры отображения ячейки в самом шаблоне этикетки.
Рассмотрим последовательность действий:
Arial, Calibri или, что еще лучше, узкий специализированный шрифт Arial Narrow. Это позволит уместить большее количество символов в одной строке и минимизирует вероятность автоматического разбиения слов.0. Это расширит полезную область печати внутри рамки ячейки.Автовысота строки. Если область вывода слишком зажата по высоте, полноценный перенос по словам работать просто не сможет.Если на предварительном просмотре в 1С этикетка выглядит идеально, а на печати из принтера выходят оборванные буквы, дело гарантированно в драйвере устройства печати. Избавиться от этого можно двумя путями.
Вариант А. Использование флага «Печать на обычном принтере»
В форме «Печать этикеток и ценников» перед отправкой задания на принтер найдите и установите флажок «Печать на обычном принтере». При активации этой настройки платформа 1С самостоятельно рендерит табличный документ в графический формат (картинку высокой четкости) и отправляет ее на печать как единый графический объект. В этом случае все правила переноса слов будут выполнены силами самой платформы, и текст распечатается ровно так, как вы видите его на экране.
Вариант Б. Изменение режима вывода текста в драйвере Windows
Если вы не хотите каждый раз нажимать галочку при печати, измените режим обработки шрифтов на уровне операционной системы:
Если стандартный перенос все равно не устраивает заказчика или специфические особенности названий товаров требуют гарантированного отсутствия обрывов слов, лучшим решением будет предварительная программная обработка выводимой строки. Нам нужно передавать в макет уже заранее подготовленный текст, разделенный символом перевода строки Символы.ПС.
Для реализации этого метода мы добавим собственное вычисляемое поле или доработаем процедуру заполнения данных печати в модуле менеджера обработки печати (через механизм расширений конфигурации).
Проанализируем алгоритм «умного» переноса:
Символы.ПС и начинаем новую строку.Посмотрим на пример реализации такой функции на встроенном языке 1С:
Функция ПолучитьКрасивоеНаименование(Знач ИсхТекст, МаксДлинаСтроки = 18) Экспорт
// Если текст изначально пустой или короткий, возвращаем его без изменений
Если СтрДлина(ИсхТекст) <= МаксДлинаСтроки Тогда
Возврат ИсхТекст;
КонецЕсли;
// Разделяем строку на массив слов по пробелам
МассивСлов = СтрРазделить(ИсхТекст, " ", Ложь);
Результат = "";
ТекущаяСтрока = "";
Для Каждого Слово Из МассивСлов Цикл
Если ПустаяСтрока(Слово) Тогда
Продолжить;
КонецЕсли;
// Проверяем, помещается ли текущее слово в лимит строки
Если СтрДлина(ТекущаяСтрока + " " + Слово) <= МаксДлинаСтроки Тогда
// Добавляем слово к текущей строке
Если ПустаяСтрока(ТекущаяСтрока) Тогда
ТекущаяСтрока = Слово;
Иначе
ТекущаяСтрока = ТекущаяСтрока + " " + Слово;
КонецЕсли;
Иначе
// Если слово не помещается, переносим его на новую строку
Если НЕ ПустаяСтрока(Результат) Тогда
Результат = Результат + Символы.ПС + ТекущаяСтрока;
Иначе
Результат = ТекущаяСтрока;
КонецЕсли;
ТекущаяСтрока = Слово;
КонецЕсли;
КонецЦикла;
// Добавляем последний обработанный фрагмент
Если НЕ ПустаяСтрока(ТекущаяСтрока) Тогда
Если НЕ ПустаяСтрока(Результат) Тогда
Результат = Результат + Символы.ПС + ТекущаяСтрока;
Иначе
Результат = ТекущаяСтрока;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
При использовании данного алгоритма в ячейку этикетки будет попадать текст, в котором переводы строк расставлены строго на границах слов. При этом в самом макете в свойствах размещения текста ячейки обязательно нужно оставить режим Переносить, но теперь 1С не будет разбивать отдельные слова, так как они гарантированно уложатся в заданные вами рамки МаксДлинаСтроки.
Таким образом, комбинируя визуальные настройки шрифтов в шаблоне, оптимизацию параметров печати в драйвере принтера и программные методы форматирования строк, можно добиться идеального и презентабельного вида этикеток любого размера.