Как настроить перенос наименования товара на две строки в весах Масса-К из 1С?

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

При интеграции торгового оборудования с решениями на платформе 1С программисты и системные администраторы часто сталкиваются с аппаратными ограничениями весового оборудования. Типичный пример — работа с весами Масса-К ВПМ-15.2-Ф1. При разработке макета этикетки (например, популярного формата 58х40) в визуальном редакторе все выглядит корректно: область наименования имеет достаточную высоту, чтобы вместить две строки текста. Однако при реальной печати весы не переносят наименование автоматически, обрезая длинные названия («Креветки Королевские...») на первой строке.

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

Выясняем причину проблемы

В весах серии ВПМ (в отличие от более современных терминалов самообслуживания линеек RP, R2P, RL) отсутствует встроенный алгоритм автоматического переноса строк (Auto-Wrap). Микроконтроллер весов ожидает от управляющей программы либо строго форматированные поля фиксированной длины, либо специальные управляющие символы. Попытка передать стандартные символы переноса строки, такие как Символы.ПС (перевод строки) или Символы.ВК (возврат каретки) напрямую в текстовом файле выгрузки, приводит к нарушению структуры файла обмена, и весы просто отказываются принимать такие данные.

Для решения этой задачи мы можем пойти тремя путями:

  1. Использовать специальный системный символ-разделитель в поле наименования.
  2. Программно делить наименование на два самостоятельных поля обмена (например, название и состав).
  3. Управлять выводом строк через свойства драйвера торгового оборудования.

Способ 1. Использование специального символа-разделителя "|" (вертикальная черта)

Для весов линейки ВПМ разработчиками предусмотрен недокументированный, но крайне эффективный механизм. Роль разделителя строк выполняет символ вертикальной черты — "|" (ASCII-код 124). Когда процессор весов встречает этот символ в поле наименования, он принудительно переносит весь последующий текст на вторую строку шаблона этикетки.

Рассмотрим пример формирования строки выгрузки. Предположим, наше исходное наименование: "Креветки Королевские вес.". Если мы передадим его как единую строку, на этикетке напечатается только "Креветки Королевские", а слово "вес." будет обрезано.

Разберем по шагам, как программно разделить строку в 1С, чтобы весы поняли нашу команду:


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

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

276;0;1;1;28;340;0;276;0;0;;0;1;Креветки "Королевские"|вес.;;0;

Весы самостоятельно обработают символ "|" и выведут текст на этикетку в две строки с сохранением форматирования.


Способ 2. Использование полей NAME и CONTENT

Проанализируем структуру файла обмена, который формируется при стандартной выгрузке из 1С в весы Масса-К:


PLU="0";
TYPE="0";
LABEL_NUMBER="0";
BARCODE_NUMBER="0";
BARCODE_PREFIX="0";
PRICE="0,00";
TARE="0";
CODE="0";
BEST_BEFORE="0";
SHELF_LIFE="0";
CERTIFICATE="";
GROUPE="0";
CENTERING="0";
NAME="";
CONTENT="";
INFO_TYPE="0";
INFO="";

Как мы видим, в структуре присутствуют два ключевых текстовых поля: NAME (Наименование товара) и CONTENT (Состав товара или информационное сообщение). Мы можем использовать это разделение в своих интересах.

Рассмотрим алгоритм, при котором первая часть названия отправляется в поле NAME, а вторая (или сопутствующая информация, например, «замороженный», «вес.») — в поле CONTENT. Для этого в редакторе этикеток Масса-К необходимо разместить поле «Состав» сразу под полем «Наименование».

Пример подготовки структуры данных в 1С:


Процедура СформироватьСтрокуВыгрузки(ТоварСсылка, Цена)
    
    ПолноеНаименование = ТоварСсылка.Наименование;
    ДлинаНаименования = СтрДлина(ПолноеНаименование);
    
    ИмяДляВесов = "";
    СоставДляВесов = "";
    
    Если ДлинаНаименования > 28 Тогда
        // Делим наименование на две части
        ИмяДляВесов = Лев(ПолноеНаименование, 28);
        СоставДляВесов = Сред(ПолноеНаименование, 29);
    Иначе
        ИмяДляВесов = ПолноеНаименование;
    КонецЕсли;
    
    // Заполняем структуру для формирования CSV-строки
    СтрокаФайла = Шаблон("[PLU];0;1;1;28;[Цена];0;[Код];0;0;;0;1;[NAME];[CONTENT];0;");
    СтрокаФайла = СтрЗаменить(СтрокаФайла, "[PLU]", ТоварСсылка.Код);
    СтрокаФайла = СтрЗаменить(СтрокаФайла, "[Цена]", Формат(Цена, "ЧЦ=15; ЧДЦ=2; ЧГ=0"));
    СтрокаФайла = СтрЗаменить(СтрокаФайла, "[Код]", ТоварСсылка.Код);
    СтрокаФайла = СтрЗаменить(СтрокаФайла, "[NAME]", ИмяДляВесов);
    СтрокаФайла = СтрЗаменить(СтрокаФайла, "[CONTENT]", СоставДляВесов);
    
    // Записываем полученную строку в файл обмена...
КонецПроцедуры

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


Способ 3. Прямая передача через драйвер ( MsgLine1 и MsgLine2 )

Если в вашей конфигурации 1С реализовано прямое подключение к весам через драйвер АТОЛ или собственный драйвер Масса-К (через COM-объект), то делить строки следует на уровне свойств самого драйвера. В API драйверов предусмотрены отдельные свойства для управления строками этикетки.

Проанализируем пример отправки данных напрямую в устройство:


Попытка
    ВесыДрайвер = Новый COMОбъект("AddIn.Scale_MassaK");
Исключение
    Предупреждение("Не удалось загрузить драйвер весов Масса-К!");
    Возврат;
КонецПопытки;

// Настройка параметров связи
ВесыДрайвер.ConnectionPort = 1; // Номер COM-порта или IP-адрес
ВесыДрайвер.Connect();

Если ВесыДрайвер.Connected Тогда
    
    // Передаем PLU и общие параметры товара
    ВесыДрайвер.PLU = 276;
    ВесыДрайвер.Price = 340.00;
    
    // Передаем строки наименования по отдельности
    ВесыДрайвер.MsgLine1 = "Креветки Королевские";
    ВесыДрайвер.MsgLine2 = "вес. свежемороженые";
    
    // Записываем данные в память весов
    ВесыДрайвер.WritePLU();
    
    ВесыДрайвер.Disconnect();
КонецЕсли;

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


Рекомендации по настройке шаблона в редакторе этикеток

Даже при правильной передаче данных из 1С текст может отображаться некорректно, если сам шаблон этикетки в весах настроен неверно. Чтобы избежать проблем, рекомендуем выполнить следующие действия:

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

← На главную