При подключении фискального регистратора семейства «Штрих-М» (например, «Штрих-ФР-К») к конфигурации «1С:Торговля и Склад 7.7» пользователи нередко сталкиваются с ситуацией: чек с одной позицией пробивается без проблем, но при попытке пробить чек с несколькими позициями печатается только первая строка, после чего касса выдает сообщение «Чек аннулирован», а в 1С появляется ошибка «Фискальный регистратор: ошибка при печати чека. Неверное значение в поле длины. Чек ККМ не пробит!».
При этом тот же аппарат может абсолютно корректно работать в связке с более современными конфигурациями, такими как «1С:Управление торговлей 10.3». Проанализируем причину такого поведения и разберем по шагам, как исправить эту ошибку.
Код ошибки драйвера «Штрих-М» 126 (7Eh) — «Неверное значение в поле длины» — сообщает о том, что длина одного из переданных параметров в фискальную команду превысила максимальный размер, заложенный в микропрограмме кассового аппарата.
Рассмотрим подробнее различия в обработках обслуживания:
PrintString, а регистрация продажи (Sale) выполняется с укороченным названием. В типовых внешних обработках для 1С 7.7 («Торговля и Склад») строка номенклатуры передается напрямую в команду регистрации без предварительной проверки и разбивки.Sale жестко ограничена (как правило, от 36 до 40 символов). Если в чеке попадается товар с наименованием, превышающим этот лимит, кассовый аппарат возвращает ошибку, прерывает печать и принудительно аннулирует весь чек.Самый быстрый способ решения проблемы — открыть внешнюю обработку обслуживания фискального регистратора (файл с расширением .ert, обычно shtrih-frk.ert или аналогичный) через конфигуратор 1С 7.7 и ограничить длину строки наименования перед отправкой в драйвер.
Разберем по шагам, как внести изменения в код модуля обработки:
Sale или Регистрация).StringForPrinting (или аналогичное) добавим принудительное ограничение длины с помощью функции Лев() и очистку от лишних пробелов с помощью СокрЛП().Посмотрим на пример кода:
// Ограничиваем длину наименования товара до 36 символов
СтрНаименование = СокрЛП(НаименованиеТовара);
Если СтрДлина(СтрНаименование) > 36 Тогда
СтрНаименование = Лев(СтрНаименование, 36);
КонецЕсли;
Объект.StringForPrinting = СтрНаименование;
Объект.Price = Цена;
Объект.Quantity = Количество;
Объект.Department = Отдел;
Объект.Sale();
Если для учета и покупателей важно видеть полное наименование товара на чековой ленте, реализуем перенос текста. Для этого разобьем строку на части: начальные части выведем через метод нефискальной печати строк, а последнюю передадим в команду фискальной регистрации продажи.
Разберем пример реализации алгоритма разбивки:
СтрНаименование = СокрЛП(НаименованиеТовара);
ДлинаСтроки = 36; // Максимальная ширина для текущего шрифта ФР
Пока СтрДлина(СтрНаименование) > ДлинаСтроки Цикл
КусокСтроки = Лев(СтрНаименование, ДлинаСтроки);
СтрНаименование = Сред(СтрНаименование, ДлинаСтроки + 1);
// Печатаем текстовую нефискальную строку
Объект.StringForPrinting = КусокСтроки;
Объект.PrintString();
КонецЦикла;
// Оставшийся фрагмент регистрируем фискальной операцией продажи
Объект.StringForPrinting = СтрНаименование;
Объект.Price = Цена;
Объект.Quantity = Количество;
Объект.Department = Отдел;
Объект.Sale();
Если ошибка возникает даже на коротких наименованиях, выясним, не включена ли глобальная поддержка Юникода в операционной системе, которая искажает расчет байтов при вызове COM-объекта драйвера.
В некоторых случаях ошибка длины кадра может возникать из-за сбоев передачи пакетов по COM-порту или USB-эмулятору. Чтобы исключить аппаратные проблемы со связью:
4800, 9600 или 19200 бод) и согласуем ее с параметрами в таблицах фискального регистратора.150–300 мс (для переходников USB-to-COM — до 500 мс).