Для решения таких ситуаций, когда возможностей драйвера 1С не хватает, есть несколько решений:
- Отказаться от драйвера 1С и полностью перейти на драйвер «Штрих-М»
- В нужные моменты отключать драйвер 1С, подключать драйвер «Штрих-М», выполнять нужные команды, отключать драйвер «Штрих-М», подключать драйвер 1С.
- Использовать низкоуровневые команды с помощью метода DeviceControlHEX.
Пункты 1 и 2 мне показались достаточно неудобными, поэтому переходим к пункту 3.
Сначала описание метода, которое дает 1С:
DeviceControlHEX (DeviceID, TxData, RxData): WordBool УправлениеУстройствомХекс (ИДУстройства, ВхДанные, ВыхДанные)
Команда аналогична команде DeviceControl. Передает низкоуровневую команду устройству. Отличие заключается в том, что входные и выходные данные передаются в виде HEX-строки.
Параметры:
DeviceID: WideString [IN]
ИДУстройства [ВХ]
Идентификатор устройства
TxData:
WideString [IN]
ВхДанные [ВХ]
Последовательность байт команды, передаваемой в ФР. (см. описание протокола). Например, для команды «гудок» последовательность будет такая (в шестнадцатеричном виде): «13 1E 00 00 00». То есть, последовательность начинается с кода команды (в данном случае «13»), за ним следуют параметры команды (в данном случае – пароль оператора: «1E 00 00 00»). Последовательность задается в виде строки в HEX-формате (разделенные пробелами двузначные шестнадцатеричные числа). RxData: Integer [OUT] ВыхДанные [ВЫХ] Строка с последовательностью байт ответа ФР. Также возвращается в HEX-формате. Возвращаемое значение: Метод возвращает True в случае успешного выполнения операции, в случае ошибки – False
Теперь можно потренироваться в употреблении этого метода.
Приведу пример печати штрих-кода EAN13 с помощью данного метода.
Для этого заглянем в мануал под названием «Протокол работы ФР». Там написано:
Печать штрих-кода
Команда: C2H. Длина сообщения: 10 байт.
Пароль оператора (4 байта)
Штрих-код (5 байт) 000000000000…999999999999
Ответ: С2H. Длина сообщения: 3 байта.
Код ошибки (1 байт)
Порядковый номер оператора (1 байт) 1…30
Получаем такую функцию, для печать штрих-кода:
Функция DeviceControlHEX_ПечатьШтрихкода(Объект, РезультатКоманды, Штрихкод)Экспорт
//Исходный штрих-код:
//2000988614846
//Отсекаем контрольный символ:
//200098861484
//Переводим в шестнадцатеричное
//2E96D251AC
//Меняем порядок:
//AC 51 D2 96 2E
ШтрихкодФР = Лев(Штрихкод, СтрДлина(Штрихкод) - 1);
ШтрихкодФР = ЧислоВФорматеФР(ШтрихкодФР);
КомандаКВыполнению = "C2" +
" 1E 00 00 00" +
ШтрихкодФР;
КомандаВыполнена = Объект.Драйвер.DeviceControlHEX(Объект.ИДУстройства, КомандаКВыполнению, РезультатКоманды);
КонецФункции
Вспомогательные функции:
Функция ЧислоВФорматеФР(_Число)
Если _Число = 0 Тогда
Возврат " 00";
КонецЕсли;
// десятичное число в шестнадцатеричное
Шестнадцатеричное = Строка(DecToHex(_Число));
// Если один символ, добавим 0
Если СтрДлина(Шестнадцатеричное) = 1 Тогда
Шестнадцатеричное = "0" + Шестнадцатеричное;
КонецЕсли;
// Если длина не четная добавить ноль
Если СтрДлина(Шестнадцатеричное) % 2 <> 0 Тогда
Шестнадцатеричное = Шестнадцатеричное + "0";
КонецЕсли;
ЧислоФР = "";
Пока СтрДлина(Шестнадцатеричное) > 0 Цикл
ЧислоФР = ЧислоФР + " " + Прав(Шестнадцатеричное, 2);
Шестнадцатеричное = Лев(Шестнадцатеричное, СтрДлина(Шестнадцатеричное) - 2);
КонецЦикла;
Возврат ЧислоФР;
КонецФункции
Функция DecToHex(Знач _Число)
База = 16;
Результат = "";
Пока _Число <> 0 Цикл
Поз =_Число % База;
Результат = Сред("0123456789ABCDEF", Поз + 1, 1) + Результат;
_Число = Цел(_Число / База);
КонецЦикла;
Возврат Результат;
КонецФункции // DecToHex()
Пример еще одной функции, печатающей произвольный текст нужным шрифтом:
Функция DeviceControlHEX_СтрокиДаннымШрифтом(Объект, РезультатКоманды, Стр, НомерШрифта)Экспорт
// Номер штрифта от 1 до 7
//Печать строки данным шрифтом
//Команда: 2FH. Длина сообщения: 47 байт.
//Пароль оператора(4 байта)
//Флаги(1 байт) Бит0 – контрольная лента, Бит1
//Номер шрифта(1 байт) 0…255
//Печатаемые символы(40 байт)
//Ответ: 2FH. Длина сообщения: 3 байта.
//Код ошибки(1 байт)
//Порядковый номер оператора(1 байт) 1…30
СтрФР = СтрокаВФорматеФР(Стр);
КомандаКВыполнению = "2F" +
" 1E 00 00 00" +
" 01" +
" 0" + НомерШрифта +
СтрФР;
КомандаВыполнена = Объект.Драйвер.DeviceControlHEX(Объект.ИДУстройства, КомандаКВыполнению, РезультатКоманды);
Возврат КомандаВыполнена;
КонецФункции
Получается, что если немного напрячься, можно выполнить любою команду, заложенную в "Протоколе работы ФР".
Замечание: насколько я знаю, метод появился с версии драйвера 4.10
Изменения: Добавлена обработка с реальными примерами работы с методом DeviceControlHEX.
Обновление 23.05.2016
Добавлен пример проверки наличности в кассе перед записью чека возврата.
Т.к. время от времени бывали ситуации когда документ "ЧекККМ в информационной базе провелся, а чек на ФР не пробился.