При автоматизации кассовых узлов в конфигурациях 1С (таких как 1С:Розница, 1С:Управление торговлей и др.) разработчики нередко сталкиваются с ситуацией, когда через штатный тест драйвера производителя ККТ (Штрих-М, Атол) легко вызываются любые команды — например, снятие промежуточного отчета без гашения (X-отчета) или печать произвольного текста без оформления, — однако при попытке выполнить те же действия из кода 1С через объект драйвера возникает ошибка об отсутствии метода. Кроме того, штатный метод печати текстового документа нередко принудительно выводит клише и заголовок фискального регистратора, что нарушает требуемое форматирование нефискального чека или купона.
Проанализируем архитектуру взаимодействия 1С с кассовой техникой, выясним первопричины возникающих ограничений и подробно разберем практические способы реализации требуемого функционала.
Для понимания проблемы разберем структуру уровней интеграции:
ОбъектДрайвера.НапечататьОтчетБезГашения() завершится ошибкой выполнения, даже если само кассовое устройство физически поддерживает данную операцию.В ранних версиях стандарта интеграции для онлайн-касс с передачей данных в ОФД операция снятия отчета без гашения (X-отчета) не входила в перечень обязательных команд фискального накопителя, так как по нормам 54-ФЗ обязательным стал ОтчетОТекущемСостоянииРасчетов. Однако по многочисленным запросам пользователей разработчики 1С и производители оборудования добавили унифицированную команду НапечататьОтчетБезГашения (или PrintXReport) в состав актуальных версий библиотек.
Рассмотрим по шагам, как задействовать эту команду в типовой конфигурации:
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент. В актуальных версиях БПО отправка команды кассе выполняется следующим образом:
ПараметрыПодключения = Новый Структура;
// Заполняются параметры подключения устройства
Результат = Ложь;
ВходныеПараметры = Новый Массив;
ВыходныеПараметры = Новый Массив;
// Вызов стандартного метода компоненты
Результат = ОбъектДрайвера.НапечататьОтчетБезГашения(ПараметрыПодключения.ИДУстройства, ВыходныеПараметры);
Если Не Результат Тогда
ОписаниеОшибки = "";
ОбъектДрайвера.ПолучитьОшибку(ОписаниеОшибки);
ВызватьИсключение ОписаниеОшибки;
КонецЕсли;
Если задача заключается в выводе нефискальной информации (товарного чека, сервисной квитанции, бонусного баланса или штрихкода) штатным методом печати текстового документа, но касса принудительно печатает клише с реквизитами организации, разберем аппаратную настройку фискального регистратора.
После этой настройки типовой метод БПО НапечататьТекстовыйДокумент() перестанет сопровождаться стандартной шапкой фискального регистратора, выводя исключительно переданные строки.
Когда требуется напечатать произвольные нефискальные строки с уникальным форматированием (размер шрифта, межстрочный интервал, выборочная отрезка ленты) или выполнить низкоуровневые операции, не поддерживаемые используемой редакцией БПО, обратимся напрямую к COM-объекту производителя оборудования (например, AddIn.DRVFR для устройств Штрих-М).
Важное ограничение: Последовательный порт (COM-порт или виртуальный USB-VCP) является монопольным ресурсом операционной системы. 1С не сможет подключиться к кассе через собственный COM-объект, если этот порт уже занят подсистемой подключаемого оборудования. Поэтому перед прямой отправкой команд устройство в БПО необходимо временно отключить, а после завершения печати — вернуть в исходное состояние.
Рассмотрим пример кода на встроенном языке 1С:
// 1. Отключаем ККТ в подсистеме БПО для освобождения COM-порта
МенеджерОборудованияКлиент.ОтключитьОборудованиеПоИдентификатору(УникальныйИдентификатор, ИдентификаторУстройства);
// 2. Инициализируем COM-объект низкоуровневого драйвера Штрих-М
ДрайверФР = Новый COMОбъект("AddIn.DRVFR");
// Указываем параметры связи, аналогичные настройкам в 1С
ДрайверФР.ComNumber = НомерПорта; // Например, 3 для COM3
ДрайверФР.BaudRate = 115200;
ДрайверФР.Password = 30; // Пароль системного администратора по умолчанию
Если ДрайверФР.Connect() = 0 Тогда
// Печать отчета без гашения (X-отчет) напрямую через драйвер
// ДрайверФР.PrintXReport();
// Построчная печать нефискального текста без шапки и клише
ДрайверФР.StringForPrinting = "=== НЕФИСКАЛЬНЫЙ ЧЕК ===";
ДрайверФР.PrintString();
ДрайверФР.StringForPrinting = "Бонусный баланс клиента: 1 500 руб.";
ДрайверФР.PrintString();
// Прогон ленты и частичная отрезка
ДрайверФР.FeedDocument();
ДрайверФР.CutCheck();
// Завершаем работу с объектом и освобождаем порт
ДрайверФР.Disconnect();
Иначе
Сообщить("Не удалось установить связь с ККТ: " + ДрайверФР.ResultCodeDescription);
КонецЕсли;
// 3. Возвращаем ККТ под управление БПО
МенеджерОборудованияКлиент.ПодключитьОборудованиеПоИдентификатору(УникальныйИдентификатор, ИдентификаторУстройства);
При использовании прямого взаимодействия с драйвером обязательно учитываем следующие платформенные особенности:
Новый COMОбъект() вызовет системную ошибку Класс не зарегистрирован. Для 64-битных платформ необходимо использовать либо нативную компоненту Native API соответствующей разрядности, либо настраивать системный суррогатный процесс через компонентные службы Windows (DCOM/DllHost)..so) или посредством передачи бинарных пакетов команд напрямую в интерфейс порта (например, /dev/ttyACM0).Таким образом, для получения X-отчета наиболее правильным путем является обновление архива драйвера в справочнике подключаемого оборудования до актуальной версии БПО. Для кастомного вывода нефискальной информации оптимально настроить таблицы параметров ККТ либо использовать прямое программное обращение к объекту драйвера с корректным освобождением физического порта устройства.