Как напечатать длинное наименование товара на ККТ Штрих-Ф-РФ и исправить ошибку длины в 1С 7.7

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

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

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

Выясняем причину: почему возникает ошибка длины?

Физическая ширина чековой ленты (как правило, 57 мм или 80 мм) и выбранный в настройках ККТ шрифт жестко задают максимальное число символов, которое физически может поместиться в одну строчку фискального документа. Для узкой ленты 57 мм стандартным шрифтом ККТ может напечатать от 32 до 36 символов, а при использовании сжатого шрифта — максимум 39–40 символов.

Эти параметры зафиксированы на уровне внутренней таблицы параметров фискального регистратора. Давайте проанализируем настройки ККТ:

  1. В драйвере оборудования за это отвечает Таблица 9 («Наименование в операции»), Строка 1.
  2. Попытка отредактировать данную таблицу и установить размер поля больше 39 символов аппаратно блокируется прошивкой ККТ, так как принтер физически не способен разместить больше знаков в одной строке фискального чека.
  3. При вызове метода продажи (например, Sale или FROperation) драйвер передает строку названия товара в фискальную память. Если длина этой строки превышает лимит, заданный в Таблице 9, драйвер не обрезает ее автоматически, а прерывает транзакцию и возвращает ошибку длины.

Обычное обрезание наименования до 38–39 символов часто неприемлемо для розничной торговли, так как при возврате товара покупателем или при проведении инвентаризации невозможно однозначно идентифицировать проданную позицию по чеку. Нам необходимо найти способ напечатать название целиком.

Решение проблемы: перевод ККТ в режим реального времени

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

Однако здесь мы можем столкнуться со следующей проблемой: напечатанный текст появляется на бумаге раньше, чем шапка чека (ИНН, дата, имя кассира) и надпись «ПРОДАЖА». Это выглядит неэстетично и нарушает структуру документа. Выясним, почему так происходит.

За логику и последовательность вывода информации отвечает настройка буферизации ККТ. Давайте найдем ее в параметрах устройства:

  1. Откроем утилиту «Тест драйвера ФР».
  2. Перейдем в раздел «Настройка свойств» -> «Таблицы».
  3. Откроем Таблицу 1 («Тип и режим кассы» / «Настройки»).
  4. Найдем Поле 20 (в некоторых версиях прошивки — Поле 23), которое называется «Печать чека по закрытию».

Рассмотрим, как это поле влияет на печать:

Таким образом, для реализации красивой печати нам необходимо установить значение поля «Печать чека по закрытию» в 0.

Реализация алгоритма печати в коде 1С 7.7

Рассмотрим детально, как должен выглядеть программный код в обработке обслуживания ККТ на встроенном языке 1С 7.7. Мы напишем функцию, которая принимает длинное наименование, разбивает его на фрагменты по 38 символов, выводит их на печать, а затем регистрирует саму продажу.


// Функция производит печать позиции чека с обработкой длинного наименования
Процедура НапечататьСтрокуЧека(ФР, ТоварНаименование, Цена, Количество, Отдел)
    
    ДлинаЛимита = 38; // Предельная длина строки для шрифта Штрих-Ф-РФ
    ОстатокНаименования = СокрЛП(ТоварНаименование);
    
    // 1. Разбиваем длинное наименование на строки и печатаем их как нефискальный текст
    Пока СтрДлина(ОстатокНаименования) > 0 Цикл
        
        Если СтрДлина(ОстатокНаименования) <= ДлинаЛимита Тогда
            ТекущаяСтрока = ОстатокНаименования;
            ОстатокНаименования = "";
        Иначе
            // Находим последний пробел в пределах лимита, чтобы перенос был красивым
            ИндексПробела = ДлинаЛимита;
            Пока (ИндексПробела > 0) И (Сред(ОстатокНаименования, ИндексПробела, 1) <> " ") Цикл
                ИндексПробела = ИндексПробела - 1;
            КонецЦикла;
            
            // Если пробел не найден, режем жестко по лимиту
            Если ИндексПробела = 0 Тогда
                ИндексПробела = ДлинаЛимита;
            КонецЕсли;
            
            ТекущаяСтрока = Лев(ОстатокНаименования, ИндексПробела);
            ОстатокНаименования = Сред(ОстатокНаименования, ИндексПробела + 1);
        КонецЕсли;
        
        // Отправляем строку на печать
        ФР.StringForPrinting = СокрЛП(ТекущаяСтрока);
        ФР.PrintString();
        
    КонецЦикла;
    
    // 2. Регистрируем фискальную операцию продажи с пустым наименованием
    // Вместо названия передаем спецсимвол, чтобы избежать пустого места на чеке
    ФР.Quantity = Количество;
    ФР.Price = Цена;
    ФР.Department = Отдел;
    ФР.Tax1 = 0; // Налог, если требуется
    ФР.StringForPrinting = "///"; // Маркер привязки к текстовому блоку выше
    
    ФР.Sale();
    
    Если ФР.ResultCode <> 0 Тогда
        Предупреждение("Ошибка регистрации позиции: " + ФР.ResultCodeDescription);
    КонецЕсли;

КонецПроцедуры

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

Особенности сосуществования драйверов Штрих-М и Атол на Windows XP

При модернизации кассовых узлов часто возникает необходимость запустить на одном рабочем месте старый аппарат Штрих-М и новую онлайн-кассу Атол (например, для тестирования или поэтапного перехода). Рассмотрим нюансы настройки такой конфигурации на операционной системе Windows XP (32-бит):

Важные аспекты перевода ККТ Атол 30Ф с ФФД 1.0 на ФФД 1.05 в 1С 7.7

Если вы планируете обновить прошивку ККТ Атол 30Ф для перехода на формат фискальных данных ФФД 1.05, необходимо учитывать, что простым обновлением ПО кассы в сервисном центре ограничиться не удастся. Потребуется доработка логики взаимодействия в кодовой базе 1С 7.7.

Даже если ваше предприятие совершает простейшие операции «Продажа» и «Возврат», стандарт ФФД 1.05 требует обязательной передачи в ОФД новых реквизитов для каждой товарной позиции. Если их не передать, касса либо вернет ошибку при формировании чека, либо ОФД отклонит такой документ как некорректный. Проанализируем ключевые теги, которые нужно добавить в обработку обслуживания 1С:

  1. Признак предмета расчета (Тег 1212): указывает ККТ, что именно продается. Для штучного товара необходимо передавать значение 1 (Оцениваемый товар), для услуг — значение 4.
  2. Признак способа расчета (Тег 1214): определяет схему оплаты. При стандартной продаже с мгновенной оплатой передается значение 4 (Полный расчет). При работе по предоплате или в кредит передаются иные регламентированные значения.

Давайте посмотрим, как программно передать эти свойства через объект драйвера Атол перед совершением фискальной операции продажи:


// Пример установки обязательных свойств ФФД 1.05 в драйвере Атол
ДрайверККТ.AttrNumber = 1212; // Тег "Признак предмета расчета"
ДрайверККТ.AttrValue = 1;     // Значение: 1 - Товар
ДрайверККТ.WriteAttribute();

ДрайверККТ.AttrNumber = 1214; // Тег "Признак способа расчета"
ДрайверККТ.AttrValue = 4;     // Значение: 4 - Полный расчет
ДрайверККТ.WriteAttribute();

// Только после этого вызываем метод регистрации позиции
ДрайверККТ.Registration();

Безопасное отключение питания кассовых аппаратов

В завершение рассмотрим важный эксплуатационный вопрос: можно ли отключать фискальные регистраторы общим тумблером на источнике бесперебойного питания (ИБП)?

Этого делать категорически нельзя. Современные онлайн-кассы (включая Атол 30Ф) представляют собой сложные микрокомпьютеры, работающие под управлением встроенных операционных систем реального времени. Они постоянно производят запись логов, служебной информации и транзакций во внутреннюю энергонезависимую память (SPI Flash), а также осуществляют фоновый обмен зашифрованными пакетами данных с фискальным накопителем (ФН) и серверами ОФД по сети.

Внезапное обесточивание устройства «с корнем» в момент выполнения операции записи может привести к крайне неприятным последствиям:

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

← На главную