Как пробить чек с видом «Покупка» на ККТ Штрих-М из 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет Финансы и профессиональные услуги
← На главную

При автоматизации ломбардов, пунктов приема металлолома или валютных касс программисты 1С часто сталкиваются с необходимостью печати фискального чека с типом операции «Покупка» (в терминологии 54-ФЗ это соответствует признаку расчета «Расход»). Стандартные обработки обслуживания 1С, особенно старых версий, зачастую жестко настроены только на «Продажу» и «Возврат продажи». Разберем подробно, как обойти это ограничение и программно заставить ККТ «Штрих-М» выдать чек нужного типа.

Анализ проблемы: почему стандартный метод не работает

В большинстве типовых решений используется метод драйвера ОткрытьЧек или OpenCheck. Проблема заключается в том, что высокоуровневые методы драйвера часто скрывают внутреннюю логику установки типа документа. В конфигурациях типа «Ломбард» или старых версиях «Бухгалтерии», работающих через AddIn.DrvFR1C, параметр «Тип чека» может просто отсутствовать в интерфейсе вызова функции. В результате драйвер по умолчанию передает значение 0 (Продажа).

Рассмотрим ситуацию, когда попытка использовать низкоуровневую команду DeviceControlHEX приводит к ошибке «7D0h, Чек закрыт — операция невозможна». Это происходит из-за того, что программный драйвер на компьютере ведет собственную «карту состояний» устройства. Когда мы посылаем прямую команду в порт через HEX, физическое устройство открывает чек, но программный объект драйвера в памяти 1С об этом «не знает» и продолжает считать, что чек закрыт. При попытке выполнить следующую операцию (например, регистрацию товара), драйвер блокирует ее, так как его внутренние флаги не соответствуют состоянию ККТ.

Способ №1: Использование свойства CheckType (Рекомендуемый)

Наиболее правильный и стабильный метод заключается в прямой установке свойства CheckType у объекта драйвера перед вызовом стандартных функций открытия чека. Это позволяет сохранить синхронизацию состояний между 1С, драйвером и ККТ. Рассмотрим значения, которые может принимать это свойство:

  1. 0 — Продажа (Приход);
  2. 1 — Покупка (Расход);
  3. 2 — Возврат продажи (Возврат прихода);
  4. 3 — Возврат покупки (Возврат расхода).

Проанализируем пример кода, который необходимо внедрить в обработку обслуживания ККТ:


// Получаем доступ к объекту драйвера напрямую
Драйвер = Объект.Драйвер;

// Устанавливаем тип чека "Покупка"
Драйвер.CheckType = 1; 

// Если нужно передать пароль оператора (обычно "30")
Драйвер.Password = "30";

// Теперь вызываем стандартное открытие чека
Результат = Драйвер.OpenCheck();

Если Результат <> 0 Тогда
    ОписаниеОшибки = Драйвер.ResultCodeDescription;
    Сообщить("Ошибка открытия чека: " + ОписаниеОшибки);
КонецЕсли;

Важный нюанс: Если вы используете внешнюю компоненту AddIn.DrvFR1C, которая является «оберткой», вам может потребоваться найти способ добраться до внутреннего COM-объекта. Обычно это свойство Драйвер или Driver в основном объекте обработки.

Способ №2: Работа через DeviceControlHEX (Низкоуровневый)

Если высокоуровневые свойства по какой-то причине недоступны, можно использовать прямую посылку байтов. Этот метод требует осторожности. Команда открытия чека в протоколе Штрих-М имеет код 8Dh.

Разберем структуру команды:

  1. Код команды (1 байт): 8D
  2. Пароль оператора (4 байта): обычно 1E 00 00 00 (для пароля "30")
  3. Тип документа (1 байт): 01 для покупки

Реализуем функцию в 1С для вызова этой команды:


Функция ОткрытьЧекПокупка_HEX(Объект) Экспорт
    // Формируем команду: Код 8D + Пароль + ТипЧека(1)
    КомандаКВыполнению = "8D" + " 1E 00 00 00" + " 01";
    РезультатКоманды = "";
    
    // Выполняем через драйвер
    КомандаВыполнена = Объект.Драйвер.DeviceControlHEX(Объект.ИДУстройства, КомандаКВыполнению, РезультатКоманды);
    
    Возврат КомандаВыполнена;
КонецФункции

Однако, как мы выяснили ранее, после такой команды стандартные методы Sale() или Registration() могут выдать ошибку «Чек закрыт». Чтобы этого избежать, мы должны «обмануть» драйвер или использовать HEX-команды для всех последующих строк чека. Но есть более простой путь: после выполнения DeviceControlHEX нужно вызвать метод Connect() или заново инициализировать объект, чтобы драйвер пересчитал состояние из ККТ.

Как избежать аннулирования чека и ошибки «7D0h»

Если вы все же решили использовать 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. Запустите «Тест драйвера».
  2. Перейдите в раздел «Регистрация».
  3. Найдите поле «Тип чека».
  4. Установите значение «1 — Покупка».
  5. Нажмите «Открыть чек».
  6. Выполните регистрацию товара на 1 рубль и закройте чек.

Если в тесте драйвера чек вышел корректно, значит ККТ настроена правильно, и вам остается только добиться от 1С передачи верного значения свойства CheckType.

Важное замечание по 54-ФЗ: Если ваш аппарат работает в режиме онлайн-кассы, вместо «Покупки» вы увидите в чеке надпись «Расход». Это абсолютно корректно с точки зрения современного законодательства РФ, так как операция выплаты денег клиенту за товар является расходом денежных средств из кассы организации.

Итоги

Подведем итог: для печати чека «Покупка» в 1С через драйвер Штрих-М наиболее надежным способом является управление свойством CheckType. Прямое использование HEX-команд через DeviceControlHEX оправдано только в самых старых версиях драйверов, где объектная модель ограничена, но требует ручного контроля синхронизации состояний. Помните, что после открытия чека определенного типа, все последующие команды регистрации (Sale) будут автоматически относится к этому типу до момента закрытия или аннулирования чека.

← На главную