При автоматизации розничной торговли часто возникает задача получения данных уже пробитого фискального чека. Это может потребоваться для реализации параллельной печати (когда один фискальный регистратор обслуживает несколько рабочих мест), для сохранения данных в информационной базе 1С или для вывода слип-чека с валидным QR-кодом на нефискальном принтере. Рассмотрим подробно, как извлечь необходимые данные из кассового аппарата «Штрих-М» программными средствами 1С.
Для того чтобы сформировать QR-код, который будет успешно распознан мобильным приложением ФНС, нам необходимо собрать строку определенного формата. Проанализируем состав этой строки:
t=ДатаТВремя&s=Сумма&fn=НомерФН&i=НомерФД&fp=ФискальныйПризнак&n=ТипСНО
Разберем параметры подробнее:
Проанализируем наиболее эффективный метод получения данных через драйвер «Штрих-М». Метод FNGetDocumentAsString (или его русскоязычный аналог ФНПолучитьДокументКакСтроку) позволяет получить содержимое документа из ФН в текстовом виде. Ключевым моментом здесь является использование параметра ShowTagNumber.
Выясним, как это реализовать в коде 1С. Предположим, что объект драйвера уже инициализирован и связь с ККТ установлена:
// Устанавливаем номер фискального документа, который хотим прочитать
ОбъектДрайвера.DocumentNumber = НужныйНомерФД;
// Вызываем метод получения документа.
// Параметр "1" означает, что мы хотим видеть номера тегов перед значениями
РезультатТекст = ОбъектДрайвера.FNGetDocumentAsString(1);
Если ОбъектДрайвера.ResultCode <> 0 Тогда
Сообщить("Ошибка ККТ: " + ОбъектДрайвера.ResultCodeDescription);
Возврат;
КонецЕсли;
В результате мы получим текстовый блок, где каждая строка начинается с номера тега. Проанализируем, какие теги нам критически важны для формирования QR-кода:
Рассмотрим пример парсинга полученной строки для выделения нужных данных. Мы можем использовать функции работы со строками 1С, чтобы найти вхождение номера тега и извлечь значение после двоеточия.
Если нам не хочется заниматься парсингом текста, мы можем воспользоваться методом FNFindDocument. Этот метод заполняет внутренние свойства объекта драйвера данными найденного документа. Рассмотрим этот процесс пошагово.
Проанализируем ситуацию: мы знаем номер ФД и хотим получить его детали. Воспользуемся следующим алгоритмом:
ОбъектДрайвера.DocumentNumber = НужныйНомерФД;
ОбъектДрайвера.FNFindDocument();
Если ОбъектДрайвера.ResultCode = 0 Тогда
СуммаЧека = ОбъектДрайвера.Amount; // Сумма операции
ФПД = ОбъектДрайвера.FiscalSign; // Фискальный признак
ДатаЧека = ОбъектДрайвера.Date; // Дата документа
ВремяЧека = ОбъектДрайвера.Time; // Время документа
// Номер ФН обычно берется из общих свойств ККТ
НомерФН = ОбъектДрайвера.FNSerialNumber;
КонецЕсли;
Важно помнить, что свойства Date и Time в драйвере «Штрих-М» часто возвращаются в специфических форматах. Дату необходимо преобразовать в строку вида YYYYMMDD, а время — в HHMM.
После того как мы получили все составляющие, их нужно правильно скомпоновать. Обратим внимание на форматирование суммы и даты, так как это самая частая причина ошибок валидации.
Рассмотрим пример функции на языке 1С, которая собирает строку:
Функция СформироватьСтрокуQR(ДатаВремя, Сумма, НомерФН, НомерФД, ФП, СНО)
// Форматируем дату: ГГГГММДДTЧЧММ
СтрДата = Формат(ДатаВремя, "ДФ=ггггММддТЧЧмм");
// Форматируем сумму: рубли.копейки
СтрСумма = Формат(Сумма, "ЧРД=.; ЧГ=0");
СтрокаРезультат = "t=" + СтрДата +
"&s=" + СтрСумма +
"&fn=" + СокрЛП(НомерФН) +
"&i=" + Формат(НомерФД, "ЧГ=0") +
"&fp=" + Формат(ФП, "ЧГ=0") +
"&n=" + СНО;
Возврат СтрокаРезультат;
КонецФункции
Разберем важный технический нюанс, упомянутый в обсуждении. Если вы реализуете схему, где несколько рабочих мест обращаются к одной ККТ, вы неизбежно столкнетесь с проблемой блокировки COM-порта или сетевого соединения. ККТ — устройство последовательное, оно не может обрабатывать запросы FNGetDocumentAsString одновременно с пробитием другого чека.
Для решения этой проблемы рекомендуется реализовать в 1С очередь обращений. Вместо того чтобы сразу после команды печати пытаться прочитать данные ФН, создайте фоновое задание, которое будет опрашивать кассу в свободные моменты времени и записывать полученные данные QR-кодов в соответствующие документы 1С.
Если вы работаете в современной конфигурации 1С (УТ 11, Розница 2/3, БП 3.0), рекомендуется не обращаться к драйверу напрямую через COM, а использовать методы БПО. При вызове метода ВыполнитьКоманду() с операцией «ПечатьЧека», БПО возвращает XML-пакет с результатами фискализации. В этом пакете в узле ФискальныеПризнаки уже содержатся все необходимые данные, включая готовую строку для QR-кода. Это избавляет от необходимости вручную вызывать FNGetDocumentAsString и парсить теги.
Однако, если задача стоит в получении данных старых чеков или работе со специфическим оборудованием вне стандартов БПО, описанные выше методы через прямой вызов драйвера «Штрих-М» остаются единственным надежным решением.