В современных условиях автоматизации розничной торговли часто возникает ситуация, когда фискальный регистратор (ККТ) физически подключен к серверу (или находится в одной точке), а пользователи работают через удаленный рабочий стол (RDP) и нуждаются в получении бумажного подтверждения операции на своих локальных местах. Рассмотрим подробно, как решить задачу вывода полной копии чека на нефискальный принтер, сохранив при этом все необходимые реквизиты, включая фискальный признак и QR-код.
При использовании 1С:Управление торговлей 11 (УТ 11) в режиме RDP, ККТ обычно подключается как оборудование на стороне сервера. Когда кассир нажимает кнопку «Пробить чек», система отправляет команду на серверное оборудование. Проблема заключается в том, что стандартные механизмы 1С не предусматривают автоматическое дублирование печати на второе устройство (нефискальный принтер), подключенное к локальному ПК пользователя.
Проанализируем ситуацию: стандартное добавление принтера чеков в список торгового оборудования не даст результата, так как система будет использовать только первое активное устройство, предназначенное для фискализации. Следовательно, нам необходимо вмешаться в программный код обработки события печати чека.
Прежде чем переходить к программированию, разберем важный момент, упомянутый в обсуждении. Согласно Федеральному закону № 54-ФЗ, кассовый чек — это первичный учетный документ, отпечатанный именно контрольно-кассовой техникой. Документ, распечатанный на обычном принтере (даже если он выглядит как чек), юридически является лишь «копией» или «товарным чеком».
Важные моменты:
Для того чтобы копия была «полной», нам нужно получить данные, которые ККТ сформировала в момент пробития: номер чека, номер смены, фискальный признак (ФП или ФПД) и данные для QR-кода. Рассмотрим, как это сделать программно в 1С.
В современных версиях УТ 11, использующих БСП (Библиотеку стандартных подсистем), за печать чека отвечает модуль МенеджерОборудованияИсполнитель или аналогичные механизмы в обработках РМК. После успешного выполнения метода ФискализироватьЧек (или ПечатьЧека), объект драйвера возвращает структуру с результатами.
Выясним, какие данные нам необходимы для формирования копии:
ФискальныйПризнак (ФПД)НомерДокумента (Порядковый номер чека за смену)НомерСменыДатаВремя (Точное время операции из памяти ККТ)Рассмотрим пример кода, который необходимо внедрить в процедуру завершения печати чека. Нам нужно найти место, где система получает ответ от ККТ. Обычно это происходит в процедурах типа ПослеПечатиЧека в форме РМК или соответствующей команде печати в документе «Чек ККМ».
// Пример перехвата данных после успешной фискализации
РезультатПечати = МенеджерОборудованияКлиент.ВыполнитьКоманду(ПараметрыКоманды);
Если РезультатПечати.Результат Тогда
// Получаем структуру данных из ответа драйвера
ДанныеЧека = РезультатПечати.ВыходныеПараметры;
// Вызываем нашу функцию печати копии на локальный принтер
ПечатьКопииНаНефискальныйПринтер(ДанныеЧека, Объект.Товары);
КонецЕсли;
В функции ПечатьКопииНаНефискальныйПринтер мы должны сформировать ТабличныйДокумент, который будет имитировать внешний вид чека.
Одним из самых сложных моментов является печать QR-кода. Чтобы QR-код на копии был валидным, он должен содержать строку определенного формата: t=YYYYMMDDTHHMM&s=SUM&fn=FN_NUMBER&i=FD_NUMBER&fp=FP_NUMBER&n=TYPE.
Проанализируем параметры строки:
t — дата и время (например, 20231025T1430)s — сумма чека с копейками через точкуfn — номер фискального накопителяi — номер фискального документа (ФД)fp — фискальный признак документа (ФПД)n — тип расчета (приход/возврат прихода)Для генерации картинки QR-кода в 1С используем встроенные возможности БСП:
ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыШтрихкода();
ПараметрыШтрихкода.ТипКода = 16; // Тип QR-код
ПараметрыШтрихкода.Текст = СтрокаДляQRКода;
ПараметрыШтрихкода.Ширина = 150;
ПараметрыШтрихкода.Высота = 150;
КартинкаQR = ГенерацияШтрихкода.СформироватьШтрихкод(ПараметрыШтрихкода);
Поскольку принтер чеков подключен к локальному ПК, он должен быть проброшен в RDP-сессию как обычный Windows-принтер. В системе сервера он будет виден под именем типа Принтер_Чеков (redirected 2).
Разберем процесс печати табличного документа:
ТабДок = Новый ТабличныйДокумент;
// Заполнение данными макета...
// ...
ТабДок.ИмяПринтера = "Имя_Вашего_Проброшенного_Принтера";
ТабДок.Напечатать(РежимИспользованияПринтера.ПечатьБезПросмотра);
Если используется драйвер АТОЛ 10, можно пойти по «бескровному» пути, упомянутому в сообщении 7. Драйвер позволяет получить «текстовый образ» чека сразу после его пробития. Это избавляет от необходимости рисовать макет в 1С вручную.
Проанализируем алгоритм:
processJson, драйвер возвращает полный текст сформированного документа.Наиболее надежным и «чистым» способом реализации является программное расширение модуля печати. Мы перехватываем данные фискализации непосредственно из ответа драйвера ККТ, формируем на их основе ТабличныйДокумент с корректным QR-кодом и отправляем его на принтер, который проброшен через RDP.
Важно: Всегда информируйте владельца бизнеса о том, что такая «копия» не заменяет фискальный чек в полной мере перед законом, и рекомендуется обеспечить покупателю доступ к оригинальному чеку через SMS или электронную почту.