При работе с торговым оборудованием прошлых поколений на платформе 1С 7.7 программисты часто сталкиваются с аппаратными ограничениями старых фискальных регистраторов. Одной из типичных проблем является вывод длинного наименования номенклатуры на чековую ленту ККТ Штрих-Ф-РФ (а также на другие аппараты линейки Штрих-М, работающие под управлением классических драйверов версии 4.x). При попытке напечатать позицию с названием длиннее стандартного лимита система выдает критическую ошибку: «Неверное значение в поле длины» (код 127 / 7Fh).
В этой статье мы подробно разберем причины возникновения этой ошибки, рассмотрим механизмы управления очередью печати в ККТ и реализуем надежный алгоритм вывода длинных строк, который позволит сохранить полную информацию о товаре для последующего контроля возвратов.
Физическая ширина чековой ленты (как правило, 57 мм или 80 мм) и выбранный в настройках ККТ шрифт жестко задают максимальное число символов, которое физически может поместиться в одну строчку фискального документа. Для узкой ленты 57 мм стандартным шрифтом ККТ может напечатать от 32 до 36 символов, а при использовании сжатого шрифта — максимум 39–40 символов.
Эти параметры зафиксированы на уровне внутренней таблицы параметров фискального регистратора. Давайте проанализируем настройки ККТ:
Sale или FROperation) драйвер передает строку названия товара в фискальную память. Если длина этой строки превышает лимит, заданный в Таблице 9, драйвер не обрезает ее автоматически, а прерывает транзакцию и возвращает ошибку длины.Обычное обрезание наименования до 38–39 символов часто неприемлемо для розничной торговли, так как при возврате товара покупателем или при проведении инвентаризации невозможно однозначно идентифицировать проданную позицию по чеку. Нам необходимо найти способ напечатать название целиком.
Для того чтобы обойти ограничение длины фискальной строки, мы можем использовать комбинированный метод печати. Сначала мы выведем полное наименование товара обычными текстовыми (нефискальными) строками, разбивая их на части нужной длины, а затем зарегистрируем саму продажу с ценой и количеством, передав вместо названия пустую строку или специальный маркер (например, слэши ///).
Однако здесь мы можем столкнуться со следующей проблемой: напечатанный текст появляется на бумаге раньше, чем шапка чека (ИНН, дата, имя кассира) и надпись «ПРОДАЖА». Это выглядит неэстетично и нарушает структуру документа. Выясним, почему так происходит.
За логику и последовательность вывода информации отвечает настройка буферизации ККТ. Давайте найдем ее в параметрах устройства:
Рассмотрим, как это поле влияет на печать:
PrintString или ПечатьСтроки), отправленные в процессе наполнения чека, принтер печатает мгновенно, то есть еще до того, как начнется печать накопленного фискального буфера. В результате текстовое наименование оказывается выше шапки чека.Таким образом, для реализации красивой печати нам необходимо установить значение поля «Печать чека по закрытию» в 0.
Рассмотрим детально, как должен выглядеть программный код в обработке обслуживания ККТ на встроенном языке 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 (32-бит):
Если вы планируете обновить прошивку ККТ Атол 30Ф для перехода на формат фискальных данных ФФД 1.05, необходимо учитывать, что простым обновлением ПО кассы в сервисном центре ограничиться не удастся. Потребуется доработка логики взаимодействия в кодовой базе 1С 7.7.
Даже если ваше предприятие совершает простейшие операции «Продажа» и «Возврат», стандарт ФФД 1.05 требует обязательной передачи в ОФД новых реквизитов для каждой товарной позиции. Если их не передать, касса либо вернет ошибку при формировании чека, либо ОФД отклонит такой документ как некорректный. Проанализируем ключевые теги, которые нужно добавить в обработку обслуживания 1С:
1 (Оцениваемый товар), для услуг — значение 4.4 (Полный расчет). При работе по предоплате или в кредит передаются иные регламентированные значения.Давайте посмотрим, как программно передать эти свойства через объект драйвера Атол перед совершением фискальной операции продажи:
// Пример установки обязательных свойств ФФД 1.05 в драйвере Атол
ДрайверККТ.AttrNumber = 1212; // Тег "Признак предмета расчета"
ДрайверККТ.AttrValue = 1; // Значение: 1 - Товар
ДрайверККТ.WriteAttribute();
ДрайверККТ.AttrNumber = 1214; // Тег "Признак способа расчета"
ДрайверККТ.AttrValue = 4; // Значение: 4 - Полный расчет
ДрайверККТ.WriteAttribute();
// Только после этого вызываем метод регистрации позиции
ДрайверККТ.Registration();
В завершение рассмотрим важный эксплуатационный вопрос: можно ли отключать фискальные регистраторы общим тумблером на источнике бесперебойного питания (ИБП)?
Этого делать категорически нельзя. Современные онлайн-кассы (включая Атол 30Ф) представляют собой сложные микрокомпьютеры, работающие под управлением встроенных операционных систем реального времени. Они постоянно производят запись логов, служебной информации и транзакций во внутреннюю энергонезависимую память (SPI Flash), а также осуществляют фоновый обмен зашифрованными пакетами данных с фискальным накопителем (ФН) и серверами ОФД по сети.
Внезапное обесточивание устройства «с корнем» в момент выполнения операции записи может привести к крайне неприятным последствиям:
Для корректного выключения устройства всегда используйте штатную кнопку или тумблер на корпусе самого фискального регистратора. При нажатии на эту кнопку ККТ завершает все фоновые дисковые транзакции, безопасно закрывает сессию связи с фискальным накопителем и только после этого отключает питание платы.