Как решить проблему разделения чека на части при печати произвольного текста через драйвер АТОЛ в 1С 7.7?

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

При работе с фискальными регистраторами (ФР) производства АТОЛ в среде 1С 7.7 программисты часто сталкиваются со специфической проблемой: при попытке вывести в шапку чека дополнительные информационные строки (например, ФИО кассира, рекламный текст или данные о дисконтной карте), устройство физически отрезает ленту сразу после печати текста, а затем печатает остальную часть чека (товары, итоги) отдельно. В результате покупатель получает «разрезанный» документ, что выглядит крайне неэстетично и нарушает целостность чека.

В данной статье мы подробно разберем причины такого поведения драйвера и предложим проверенный способ решения, основанный на правильном управлении состояниями фискального устройства. Мы проанализируем код обработки fr_comm.ert и выясним, какие методы объекта драйвера необходимо использовать, чтобы чек печатался единым полотном.

Анализ причины проблемы: почему чек «рвется»?

Рассмотрим ситуацию с точки зрения внутренней логики работы драйвера АТОЛ (например, DTO 6 или 8). Когда мы вызываем метод PrintString, не открыв предварительно чек, драйвер переводит ККТ в режим печати нефискального документа. Для большинства современных моделей АТОЛ (таких как Аура-01ФР-KZ или FPrint) в настройках по умолчанию установлена опция «Отрезка после завершения нефискального документа».

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

  1. Программа вызывает Объект.Caption = "Инфо"; Объект.PrintString;.
  2. Драйвер видит, что фискальный чек еще не открыт. Он создает временный текстовый документ, печатает строку и, считая задачу выполненной, завершает документ, инициируя отрезку ленты.
  3. Затем программа начинает регистрацию товаров (метод Registration). Драйвер понимает, что начинается фискальная операция, и открывает новый документ (собственно, сам чек).

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

Решение №1: Использование метода OpenCheck для фиксации границ документа

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

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


Функция ПечататьЧек(Объект, Пароль, СписокТоваров, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ТипОплаты)
    Если ПустоеЗначение(Объект) = 1 Тогда
        ОписаниеРезультата = "устройство не подключено";
        Возврат 0;
    КонецЕсли;

    // Устанавливаем режим регистрации
    Объект.Mode = 1; 
    Объект.Password = Пароль;
    Объект.SetMode;
    
    // Проверяем состояние чека, если он открыт — отменяем его
    Объект.GetStatus;
    Если Объект.СостояниеЧека <> 0 Тогда
        Попытка
            Объект.CancelCheck;
        Исключение
        КонецПопытки;
    КонецЕсли;

    // Указываем тип чека: 1 — продажа, 2 — возврат
    Если ПризнВозврата = 0 Тогда
        Объект.CheckType = 1;
    Иначе
        Объект.CheckType = 2;
    КонецЕсли;

    // ВАЖНО: Открываем чек перед печатью любых строк!
    Объект.OpenCheck(); 

    // Теперь печатаем наш произвольный текст в шапке
    Объект.Caption = "Кассир: " + СокрЛП(ИмяПользователя());
    Объект.Alignment = 1; // По центру
    Объект.PrintString();

    // Далее приступаем к регистрации товаров
    СписокТоваров.ВыбратьСтроки();
    Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
        Объект.Name = Лев(СписокТоваров.ТовНаим, 40);
        Объект.Price = Окр(СписокТоваров.Цена, 2, 1);
        Объект.Quantity = СписокТоваров.Количество;
        
        Если ПризнВозврата = 0 Тогда
            Объект.Registration();
        Иначе
            Объект.Return();
        КонецЕсли;
    КонецЦикла;

    // Закрытие чека
    Объект.Summ = Окр(Получено, 2, 1);
    Объект.CloseCheck();
    
    Возврат 1;
КонецФункции

Важное примечание: Вызов OpenCheck() переводит ККТ в состояние «Открытый чек». Все последующие команды печати строк до вызова CloseCheck() будут восприниматься как содержимое одного документа, и отрезка произойдет только один раз в самом конце.

Решение №2: Контроль длины строки и перенос текста

При печати произвольного текста через PrintString мы часто сталкиваемся с тем, что текст не помещается на узкую чековую ленту. В драйверах АТОЛ для этого предусмотрено свойство CharLineLength (или ДлинаСтрокиСимволов), которое возвращает ширину ленты в знаках. Рекомендуется использовать цикл для разбиения длинных строк, чтобы избежать непредсказуемого поведения принтера.

Проанализируем пример кода для корректной печати длинного наименования или рекламного блока:


ДлинаНаименования = Объект.CharLineLength;
СтрокаДляПечати = "Это очень длинный рекламный текст, который может не поместиться в одну строку на чековой ленте";

Пока СтрДлина(СтрокаДляПечати) > 0 Цикл
    Объект.Caption = Лев(СтрокаДляПечати, ДлинаНаименования);
    Объект.PrintString();
    СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати, ДлинаНаименования + 1));
КонецЦикла;

Этот подход гарантирует, что текст будет выглядеть аккуратно, а драйвер не «сломается» на середине длинной строки.

Решение №3: Печать через таблицы ККТ (Статичный текст)

Если ваша задача — печатать одну и ту же шапку (например, название организации или приветствие) на каждом чеке, то программный вывод строк через 1С — не самый оптимальный путь. У всех устройств АТОЛ есть внутренние таблицы (Таблица 4 для шапки и Таблица 5 для подвала чека).

Рассмотрим преимущества этого метода:

Чтобы настроить таблицы, можно воспользоваться утилитой «Тест драйвера ККТ». Зайдите в раздел «Программирование» или «Таблицы», найдите строки клише и запишите туда нужный текст. В коде 1С при этом не потребуется вызывать дополнительные PrintString.

Особенности для новых драйверов (DTO 10)

Если вы планируете переход на современные версии драйверов (АТОЛ 10.х), помните, что там логика существенно изменилась. Вместо последовательного вызова свойств и методов используется объектная модель. Для печати текста внутри чека используется добавление объекта типа text в общее задание печати.

Также стоит учитывать требования 54-ФЗ. Теперь просто напечатать «ФИО кассира» текстом недостаточно — этот реквизит должен быть передан в специальный тег 1021. В драйверах АТОЛ это делается через установку соответствующего атрибута перед закрытием чека, а не через простую команду PrintString.

Заключение и выводы

Мы выяснили, что основной причиной разделения чека на части является отсутствие команды открытия фискального документа перед выводом текстовых данных. Выясним основные правила работы с текстом в драйвере АТОЛ:

  1. Всегда используйте Объект.OpenCheck() перед выводом PrintString, если этот текст должен быть в шапке чека.
  2. Учитывайте физическую ширину ленты через свойство CharLineLength.
  3. Если текст постоянный — записывайте его в память устройства через таблицы клише.
  4. При возникновении ошибок всегда проверяйте Объект.ResultCode после каждой команды, чтобы вовремя обработать внештатные ситуации (например, окончание бумаги).

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

← На главную