Как исправить ошибку «Неверное значение в поле длины» при печати чека на ФР ШТРИХ в 1С 7.7?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При подключении фискального регистратора семейства «Штрих-М» (например, «Штрих-ФР-К») к конфигурации «1С:Торговля и Склад 7.7» пользователи нередко сталкиваются с ситуацией: чек с одной позицией пробивается без проблем, но при попытке пробить чек с несколькими позициями печатается только первая строка, после чего касса выдает сообщение «Чек аннулирован», а в 1С появляется ошибка «Фискальный регистратор: ошибка при печати чека. Неверное значение в поле длины. Чек ККМ не пробит!».

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

Причина возникновения ошибки

Код ошибки драйвера «Штрих-М» 126 (7Eh) — «Неверное значение в поле длины» — сообщает о том, что длина одного из переданных параметров в фискальную команду превысила максимальный размер, заложенный в микропрограмме кассового аппарата.

Рассмотрим подробнее различия в обработках обслуживания:

  1. Разница логики 1С 7.7 и 1С 8.x: в типовых механизмах конфигураций 1С 8 (например, УТ 10.3) драйвер или обработка обслуживания автоматически разбивают длинное наименование товара на несколько строк. Длинная часть печатается нефискальными текстовыми строками через команду PrintString, а регистрация продажи (Sale) выполняется с укороченным названием. В типовых внешних обработках для 1С 7.7 («Торговля и Склад») строка номенклатуры передается напрямую в команду регистрации без предварительной проверки и разбивки.
  2. Аппаратное ограничение длины строки: в зависимости от модели кассы, ширины ленты и выбранного шрифта максимальная длина поля наименования товара в команде Sale жестко ограничена (как правило, от 36 до 40 символов). Если в чеке попадается товар с наименованием, превышающим этот лимит, кассовый аппарат возвращает ошибку, прерывает печать и принудительно аннулирует весь чек.
  3. Некорректная кодировка (в современных версиях Windows): если база 1С 7.7 запущена в среде Windows 10 или Windows 11 с включенной системной настройкой поддержки UTF-8 (Beta: Use Unicode UTF-8 for worldwide language support), кириллические символы передаются двумя байтами вместо одного, из-за чего даже короткое наименование превышает лимит по байтам.

Способ 1. Простая обрезка длинных наименований в обработке обслуживания

Самый быстрый способ решения проблемы — открыть внешнюю обработку обслуживания фискального регистратора (файл с расширением .ert, обычно shtrih-frk.ert или аналогичный) через конфигуратор 1С 7.7 и ограничить длину строки наименования перед отправкой в драйвер.

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

  1. Найдем в модуле обработки процедуру печати чека или регистрации строки (обычно это вызов метода Sale или Регистрация).
  2. Перед передачей наименования товара в свойство драйвера StringForPrinting (или аналогичное) добавим принудительное ограничение длины с помощью функции Лев() и очистку от лишних пробелов с помощью СокрЛП().

Посмотрим на пример кода:


// Ограничиваем длину наименования товара до 36 символов
СтрНаименование = СокрЛП(НаименованиеТовара);
Если СтрДлина(СтрНаименование) > 36 Тогда
    СтрНаименование = Лев(СтрНаименование, 36);
КонецЕсли;

Объект.StringForPrinting = СтрНаименование;
Объект.Price = Цена;
Объект.Quantity = Количество;
Объект.Department = Отдел;
Объект.Sale();

Способ 2. Полноценный перенос длинных наименований на несколько строк

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

Разберем пример реализации алгоритма разбивки:


СтрНаименование = СокрЛП(НаименованиеТовара);
ДлинаСтроки = 36; // Максимальная ширина для текущего шрифта ФР

Пока СтрДлина(СтрНаименование) > ДлинаСтроки Цикл
    КусокСтроки = Лев(СтрНаименование, ДлинаСтроки);
    СтрНаименование = Сред(СтрНаименование, ДлинаСтроки + 1);
    
    // Печатаем текстовую нефискальную строку
    Объект.StringForPrinting = КусокСтроки;
    Объект.PrintString();
КонецЦикла;

// Оставшийся фрагмент регистрируем фискальной операцией продажи
Объект.StringForPrinting = СтрНаименование;
Объект.Price = Цена;
Объект.Quantity = Количество;
Объект.Department = Отдел;
Объект.Sale();

Способ 3. Проверка региональных параметров операционной системы

Если ошибка возникает даже на коротких наименованиях, выясним, не включена ли глобальная поддержка Юникода в операционной системе, которая искажает расчет байтов при вызове COM-объекта драйвера.

  1. Откроем Панель управления операционной системы и перейдем в раздел Региональные стандарты.
  2. Перейдем на вкладку Дополнительно и нажмем кнопку Изменить язык системы.
  3. Убедимся, что флаг «Бета-версия: Использовать Юникод (UTF-8) для поддержки языка во всем мире» снят.
  4. Проверим, что в качестве текущего языка программ, не поддерживающих Юникод, установлен Русский (Россия).
  5. Перезагрузим компьютер для применения параметров.

Способ 4. Проверка настроек драйвера и тайм-аутов связи

В некоторых случаях ошибка длины кадра может возникать из-за сбоев передачи пакетов по COM-порту или USB-эмулятору. Чтобы исключить аппаратные проблемы со связью:

  1. Запустим утилиту «Тест драйвера ФР».
  2. Откроем Настройка свойств и проверим параметры подключения.
  3. Установим стабильную скорость обмена (например, 4800, 9600 или 19200 бод) и согласуем ее с параметрами в таблицах фискального регистратора.
  4. Увеличим параметр Таймаут до 150–300 мс (для переходников USB-to-COM — до 500 мс).
← На главную