При автоматизации ломбардов, пунктов приема металлолома или валютных касс программисты 1С часто сталкиваются с необходимостью печати фискального чека с типом операции «Покупка» (в терминологии 54-ФЗ это соответствует признаку расчета «Расход»). Стандартные обработки обслуживания 1С, особенно старых версий, зачастую жестко настроены только на «Продажу» и «Возврат продажи». Разберем подробно, как обойти это ограничение и программно заставить ККТ «Штрих-М» выдать чек нужного типа.
В большинстве типовых решений используется метод драйвера ОткрытьЧек или OpenCheck. Проблема заключается в том, что высокоуровневые методы драйвера часто скрывают внутреннюю логику установки типа документа. В конфигурациях типа «Ломбард» или старых версиях «Бухгалтерии», работающих через AddIn.DrvFR1C, параметр «Тип чека» может просто отсутствовать в интерфейсе вызова функции. В результате драйвер по умолчанию передает значение 0 (Продажа).
Рассмотрим ситуацию, когда попытка использовать низкоуровневую команду DeviceControlHEX приводит к ошибке «7D0h, Чек закрыт — операция невозможна». Это происходит из-за того, что программный драйвер на компьютере ведет собственную «карту состояний» устройства. Когда мы посылаем прямую команду в порт через HEX, физическое устройство открывает чек, но программный объект драйвера в памяти 1С об этом «не знает» и продолжает считать, что чек закрыт. При попытке выполнить следующую операцию (например, регистрацию товара), драйвер блокирует ее, так как его внутренние флаги не соответствуют состоянию ККТ.
Наиболее правильный и стабильный метод заключается в прямой установке свойства CheckType у объекта драйвера перед вызовом стандартных функций открытия чека. Это позволяет сохранить синхронизацию состояний между 1С, драйвером и ККТ. Рассмотрим значения, которые может принимать это свойство:
Проанализируем пример кода, который необходимо внедрить в обработку обслуживания ККТ:
// Получаем доступ к объекту драйвера напрямую
Драйвер = Объект.Драйвер;
// Устанавливаем тип чека "Покупка"
Драйвер.CheckType = 1;
// Если нужно передать пароль оператора (обычно "30")
Драйвер.Password = "30";
// Теперь вызываем стандартное открытие чека
Результат = Драйвер.OpenCheck();
Если Результат <> 0 Тогда
ОписаниеОшибки = Драйвер.ResultCodeDescription;
Сообщить("Ошибка открытия чека: " + ОписаниеОшибки);
КонецЕсли;
Важный нюанс: Если вы используете внешнюю компоненту AddIn.DrvFR1C, которая является «оберткой», вам может потребоваться найти способ добраться до внутреннего COM-объекта. Обычно это свойство Драйвер или Driver в основном объекте обработки.
Если высокоуровневые свойства по какой-то причине недоступны, можно использовать прямую посылку байтов. Этот метод требует осторожности. Команда открытия чека в протоколе Штрих-М имеет код 8Dh.
Разберем структуру команды:
8D1E 00 00 00 (для пароля "30")01 для покупкиРеализуем функцию в 1С для вызова этой команды:
Функция ОткрытьЧекПокупка_HEX(Объект) Экспорт
// Формируем команду: Код 8D + Пароль + ТипЧека(1)
КомандаКВыполнению = "8D" + " 1E 00 00 00" + " 01";
РезультатКоманды = "";
// Выполняем через драйвер
КомандаВыполнена = Объект.Драйвер.DeviceControlHEX(Объект.ИДУстройства, КомандаКВыполнению, РезультатКоманды);
Возврат КомандаВыполнена;
КонецФункции
Однако, как мы выяснили ранее, после такой команды стандартные методы Sale() или Registration() могут выдать ошибку «Чек закрыт». Чтобы этого избежать, мы должны «обмануть» драйвер или использовать HEX-команды для всех последующих строк чека. Но есть более простой путь: после выполнения DeviceControlHEX нужно вызвать метод Connect() или заново инициализировать объект, чтобы драйвер пересчитал состояние из ККТ.
Если вы все же решили использовать HEX-команды, проанализируем ситуацию с ошибкой 7D0h. Она возникает, когда 1С пытается вызвать метод Sale, а драйвер видит, что он сам команду OpenCheck не подавал. Выясним причину аннулирования: аппарат Штрих-М автоматически аннулирует чек, если последовательность команд нарушена или в буфер переданы противоречивые данные.
Решение: Используйте метод DirectIO или свойства объекта. В современных версиях драйвера «Штрих-М» версии 4.14 и выше, большинство проблем решается установкой CheckType. Если вы работаете в среде старого ломбардного ПО (например, на базе БП 2.0), убедитесь, что обработка обслуживания не сбрасывает состояние драйвера в методе Подключить() перед каждым чеком.
Посмотрим на пример того, как может выглядеть модифицированный блок кода в функции печати чека, чтобы он корректно обрабатывал признак возврата (РКО) как покупку:
// В процедуре ПечатьЧека
Если ТипДокумента = "РКО_Ломбард" Тогда
// Это покупка ценностей у клиента
Объект.Драйвер.CheckType = 1; // Устанавливаем тип "Покупка"
ИначеЕсли ЭтоВозврат Тогда
Объект.Драйвер.CheckType = 2; // Возврат продажи
Иначе
Объект.Драйвер.CheckType = 0; // Продажа
КонецЕсли;
// Пытаемся открыть чек через стандартный интерфейс драйвера
Если Не Объект.Драйвер.OpenCheck() Тогда
// Если стандартный метод не сработал, пробуем принудительно через HEX (крайний случай)
РезультатКоманды = "";
КомандаОткрытия = "8D 1E 00 00 00 " + Формат(Объект.Драйвер.CheckType, "ЧЦ=2; ЧГ=0");
Объект.Драйвер.DeviceControlHEX(Объект.ИДУстройства, КомандаОткрытия, РезультатКоманды);
КонецЕсли;
// Дальнейшая регистрация позиций
// Драйвер уже находится в состоянии открытого чека "Покупка"
// Команда Sale будет интерпретирована ККТ как регистрация покупки
Объект.Драйвер.Quantity = 1;
Объект.Драйвер.Price = СуммаДокумента;
Объект.Драйвер.Department = 1;
Объект.Драйвер.StringForPrinting = "Прием ценностей по залогу";
Объект.Драйвер.Sale();
// Закрытие чека
Объект.Драйвер.Summ1 = СуммаДокумента;
Объект.Драйвер.CloseCheck();
Прежде чем внедрять код в 1С, настоятельно рекомендуем проверить возможность выполнения этой операции через утилиту «Тест драйвера Штрих-М»:
Если в тесте драйвера чек вышел корректно, значит ККТ настроена правильно, и вам остается только добиться от 1С передачи верного значения свойства CheckType.
Важное замечание по 54-ФЗ: Если ваш аппарат работает в режиме онлайн-кассы, вместо «Покупки» вы увидите в чеке надпись «Расход». Это абсолютно корректно с точки зрения современного законодательства РФ, так как операция выплаты денег клиенту за товар является расходом денежных средств из кассы организации.
Подведем итог: для печати чека «Покупка» в 1С через драйвер Штрих-М наиболее надежным способом является управление свойством CheckType. Прямое использование HEX-команд через DeviceControlHEX оправдано только в самых старых версиях драйверов, где объектная модель ограничена, но требует ручного контроля синхронизации состояний. Помните, что после открытия чека определенного типа, все последующие команды регистрации (Sale) будут автоматически относится к этому типу до момента закрытия или аннулирования чека.