В современной розничной торговле все чаще возникает необходимость экономии чековой ленты и перехода на электронные способы взаимодействия с покупателем. Согласно 54-ФЗ, продавец обязан выдать чек, но он может быть как бумажным, так и электронным (отправленным на e-mail или абонентский номер). Рассмотрим, как реализовать этот функционал программно, используя оборудование Штрих-М и стандартный драйвер версии 5.17 и выше.
Типичная ситуация: кассиру в интерфейсе 1С требуется выбор — печатать чек в обычном режиме или отправить его электронно без физического вывода на ленту. Проанализируем инструменты, которые предоставляет нам «Штрих-М: Драйвер ФР». В отличие от оборудования АТОЛ, где используется параметр CheckMode, в Штрих-М управление печатью реализовано через передачу специфических фискальных тегов или через прямое изменение настроек в таблицах ККТ.
Основным инструментом для решения нашей задачи является тег 1707. Этот тег отвечает за признак способа выдачи чека. Значение "2" для этого тега сообщает кассе, что чек должен быть сформирован только в электронном виде.
Этот способ является наиболее гибким, так как позволяет управлять печатью индивидуально для каждого чека. Мы передаем команду драйверу непосредственно перед закрытием документа. Разберем программный код реализации этого метода:
// Предположим, что Переменная "Объект" — это подключенный COM-объект драйвера Штрих-М
Если НеПечататьЧек Тогда
// Устанавливаем номер тега 1707 (Признак способа выдачи чека)
Объект.TagNumber = 1707;
// Устанавливаем тип тега (7 — целое число)
Объект.TagType = 7;
// Значение 2 — чек только в электронном виде
Объект.TagValueStr = "2";
// Передаем тег в фискальный накопитель
Объект.FNSendTag();
Иначе
// Если нужно вернуть обычную печать
Объект.TagNumber = 1707;
Объект.TagType = 7;
// Значение 0 или 1 — печать на бумаге разрешена
Объект.TagValueStr = "0";
Объект.FNSendTag();
КонецЕсли;
Важный нюанс: По закону, если вы отключаете печать бумажного чека, вы обязаны передать контактные данные покупателя (e-mail или телефон) в теге 1008. Если этого не сделать, касса может выдать ошибку или чек будет считаться пробитым с нарушением правил эксплуатации. Передача тега 1008 выполняется аналогично через TagNumber = 1008 перед закрытием чека.
Проанализируем ситуацию, когда нам нужно изменить поведение кассы на более длительный период. Внутренние настройки оборудования Штрих-М хранятся в таблицах. За режим печати отвечает Таблица 17 (Региональные настройки), Поле 7.
Рассмотрим пример кода для записи значения непосредственно в таблицу:
// Обращаемся к драйверу для записи в таблицу
// TableNumber = 17 (Таблица региональных настроек)
FR.TableNumber = 17;
// RowNumber = 1 (Первая и единственная строка в этой таблице)
FR.RowNumber = 1;
// FieldNumber = 7 (Поле, отвечающее за режим печати чека)
FR.FieldNumber = 7;
// Устанавливаем значение: 2 — не печатать, 0 — печатать
FR.ValueOfFieldString = "2";
// Выполняем запись в память ККТ
FR.WriteTable();
Выясним причину, почему этот метод стоит использовать с осторожностью. В отличие от FNSendTag, запись в таблицу является "липкой". Если вы один раз установили там "2", касса перестанет печатать все последующие чеки до тех пор, пока вы программно не вернете значение "0". Это может привести к недоразумениям, если в коде 1С произойдет сбой и настройка не вернется в исходное состояние.
Рассмотрим ситуацию, когда чек был пробит без печати (электронно), но клиент внезапно передумал и попросил бумажную копию. Проанализируем доступные методы драйвера для решения этой задачи.
1. Повтор последнего документа.
Самый простой способ — использовать встроенную команду драйвера для дублирования последнего фискального документа. В интерфейсе драйвера за это отвечает метод RepeatDocument().
// Печать последней операции (чека), сохраненной в памяти ККТ
FR.RepeatDocument();
2. Печать старого чека по номеру.
Если клиенту нужен чек, который был пробит несколько операций назад, метод RepeatDocument() не поможет. В этом случае существует два пути:
PrintDocumentFromJournal, где параметром передается номер документа.PrintString() или PrintText(). Это сформирует документ, внешне идентичный чеку, с пометкой "КОПИЯ".Проанализировав опыт разработчиков, рекомендуем следующий алгоритм действий при реализации функционала в 1С:
OpenCheck() (открытие чека) определите выбор кассира.FNSendTag(1008) для передачи контактов.FNSendTag(1707) со значением 2 для отмены печати.CloseCheck(), рекомендуется на всякий случай принудительно обнулить тег 1707 для следующей транзакции, чтобы избежать случайной блокировки печати.Таким образом, комбинируя работу с фискальными тегами и методами печати нефискального текста, можно создать гибкую систему управления чековой лентой, которая будет полностью соответствовать требованиям законодательства и ожиданиям пользователей.