При работе с фискальными регистраторами (ФР) производства АТОЛ в среде 1С 7.7 программисты часто сталкиваются со специфической проблемой: при попытке вывести в шапку чека дополнительные информационные строки (например, ФИО кассира, рекламный текст или данные о дисконтной карте), устройство физически отрезает ленту сразу после печати текста, а затем печатает остальную часть чека (товары, итоги) отдельно. В результате покупатель получает «разрезанный» документ, что выглядит крайне неэстетично и нарушает целостность чека.
В данной статье мы подробно разберем причины такого поведения драйвера и предложим проверенный способ решения, основанный на правильном управлении состояниями фискального устройства. Мы проанализируем код обработки fr_comm.ert и выясним, какие методы объекта драйвера необходимо использовать, чтобы чек печатался единым полотном.
Рассмотрим ситуацию с точки зрения внутренней логики работы драйвера АТОЛ (например, DTO 6 или 8). Когда мы вызываем метод PrintString, не открыв предварительно чек, драйвер переводит ККТ в режим печати нефискального документа. Для большинства современных моделей АТОЛ (таких как Аура-01ФР-KZ или FPrint) в настройках по умолчанию установлена опция «Отрезка после завершения нефискального документа».
Проанализируем последовательность действий, которая приводит к ошибке:
Объект.Caption = "Инфо"; Объект.PrintString;.Registration). Драйвер понимает, что начинается фискальная операция, и открывает новый документ (собственно, сам чек).Чтобы избежать этого разделения, нам нужно явно указать устройству, что наши текстовые строки являются частью будущего фискального чека. Это достигается путем предварительного открытия чека командой 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() будут восприниматься как содержимое одного документа, и отрезка произойдет только один раз в самом конце.
При печати произвольного текста через PrintString мы часто сталкиваемся с тем, что текст не помещается на узкую чековую ленту. В драйверах АТОЛ для этого предусмотрено свойство CharLineLength (или ДлинаСтрокиСимволов), которое возвращает ширину ленты в знаках. Рекомендуется использовать цикл для разбиения длинных строк, чтобы избежать непредсказуемого поведения принтера.
Проанализируем пример кода для корректной печати длинного наименования или рекламного блока:
ДлинаНаименования = Объект.CharLineLength;
СтрокаДляПечати = "Это очень длинный рекламный текст, который может не поместиться в одну строку на чековой ленте";
Пока СтрДлина(СтрокаДляПечати) > 0 Цикл
Объект.Caption = Лев(СтрокаДляПечати, ДлинаНаименования);
Объект.PrintString();
СтрокаДляПечати = СокрЛП(Сред(СтрокаДляПечати, ДлинаНаименования + 1));
КонецЦикла;
Этот подход гарантирует, что текст будет выглядеть аккуратно, а драйвер не «сломается» на середине длинной строки.
Если ваша задача — печатать одну и ту же шапку (например, название организации или приветствие) на каждом чеке, то программный вывод строк через 1С — не самый оптимальный путь. У всех устройств АТОЛ есть внутренние таблицы (Таблица 4 для шапки и Таблица 5 для подвала чека).
Рассмотрим преимущества этого метода:
Чтобы настроить таблицы, можно воспользоваться утилитой «Тест драйвера ККТ». Зайдите в раздел «Программирование» или «Таблицы», найдите строки клише и запишите туда нужный текст. В коде 1С при этом не потребуется вызывать дополнительные PrintString.
Если вы планируете переход на современные версии драйверов (АТОЛ 10.х), помните, что там логика существенно изменилась. Вместо последовательного вызова свойств и методов используется объектная модель. Для печати текста внутри чека используется добавление объекта типа text в общее задание печати.
Также стоит учитывать требования 54-ФЗ. Теперь просто напечатать «ФИО кассира» текстом недостаточно — этот реквизит должен быть передан в специальный тег 1021. В драйверах АТОЛ это делается через установку соответствующего атрибута перед закрытием чека, а не через простую команду PrintString.
Мы выяснили, что основной причиной разделения чека на части является отсутствие команды открытия фискального документа перед выводом текстовых данных. Выясним основные правила работы с текстом в драйвере АТОЛ:
Объект.OpenCheck() перед выводом PrintString, если этот текст должен быть в шапке чека.CharLineLength.Объект.ResultCode после каждой команды, чтобы вовремя обработать внештатные ситуации (например, окончание бумаги).Следуя этим рекомендациям, вы обеспечите стабильную и корректную работу кассового узла, а чеки ваших клиентов всегда будут выглядеть профессионально.