Работа с драйвером ФР "Штрих-М" на уровне протокола

23.05.16

Интеграция - ККМ

Для работы со своими фискальными регистраторами компания «Штрих-М» написала свой драйвер «Штрих-М: Драйвер ФР».
А для интеграции с программами семейства 1С компании «Штрих-М» пришлось подготовить дополнительный драйвер, который довольно сложно называется: «ПО «ШТРИХ-М: Драйвер ФР» в соответствии с «требованиями к разработке драйверов для фискальных регистраторов» компании 1С».
Это предыстория. А история в том, что, используя драйвер 1С, невозможно выполнить некоторые команды, которые имеет стандартный драйвер «Штрих-М». Например, вывести штрих код.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Примеры работы с DeviceControlHEX
.epf 7,24Kb
44
44 Скачать (1 SM) Купить за 1 850 руб.
Проверка наличности в кассе
.epf 5,60Kb
13
13 Скачать (1 SM) Купить за 1 850 руб.

 Для решения таких ситуаций, когда возможностей драйвера 1С не хватает, есть несколько решений:

  1. Отказаться от драйвера 1С и полностью перейти на драйвер «Штрих-М»
  2. В нужные моменты отключать драйвер 1С, подключать драйвер «Штрих-М», выполнять нужные команды, отключать драйвер «Штрих-М», подключать драйвер 1С.
  3. Использовать низкоуровневые команды с помощью метода 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 
Добавлен пример проверки наличности в кассе перед записью чека возврата.
Т.к. время от времени бывали ситуации когда документ "ЧекККМ в информационной базе провелся, а чек на ФР не пробился.

DeviceControlHEX

См. также

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения 1С:CRM ПРОФ, КОРП Россия Платные (руб)

Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1). Подключайте любую онлайн кассу к практически любой конфигурации. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows ЭМУЛЯТОР + ЭКВАЙРИНГ + МАРКИРОВКА + ПОДДЕРЖКА ФФД 1.2

6000 руб.

27.02.2017    796510    4908    9546    

2860

SALE! 25%

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)

Обработка осуществляет обслуживание ККТ АТОЛ, Штрих, Вики Принт и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима.

5880 4410 руб.

25.05.2015    335608    1958    3058    

1031

ККМ Кассовые операции Розничная торговля Обмен с ГосИС Программист Бухгалтер Пользователь Бухгалтерский учет Оперативный учет Управляемые формы 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение конфигурации для УТ 11.5, КА 2.5 ,ERP 2.5 (Управляемые формы) позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую!

4500 руб.

27.08.2018    122292    1026    584    

864

ККМ Розничная торговля Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Розница 2 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обмен между 1С:Розница и Frontol 6 при торговле от нескольких организаций, а также ряд других полезных функций. Данный модуль синхронизации незаменим для тех, кто ведёт учет по нескольким организациям в 1С:Розница, а на РМК (рабочем месте кассира) установлен Frontol или планируется его установка. Подходит для 1С:Розница 2.3 / 3.0, 1С:УНФ 3.0

1800 руб.

22.03.2019    84042    509    478    

182

ККМ Кассовые операции Розничная торговля Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Платные (руб)

«Сервер ККМ» позволяет приложениям работать с фискальными регистраторами по локальной сети или интернет, организовать печать на одном ККМ с нескольких рабочих мест. Поддержка драйверов Атол, Штрих и VikiPrint. Поддержка 54-ФЗ и разрешительного режима, ФФД 1.05,1.2. Подключается к 1С Торговля и склад 7.7, 1С:УТ 10/11, 1С:УНФ, 1С:Розница 1/2, 1С:БП 2/3, 1С КА 1/2., 1С:ERP, УПП. Ускоряет печать из терминального сеанса Windows. Работает с разрешительным режимом даже из старых конфигураций. Предоставляет REST API для печати через веб-сервис.

3000 руб.

02.09.2016    136480    152    193    

181

Кассовые операции ККМ Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Россия Управленческий учет Платные (руб)

Расширение для 1С:Управление торговлей 11.5, которое позволяет пробивать чеки ККМ и списывать товар с разных складов. Склад списание товара можно указывать в табличной части рабочего места кассира (РМК).

5880 руб.

12.04.2023    9342    45    3    

36

ККМ Кассовые операции Розничная торговля Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Розница 3.0 Россия Платные (руб)

Обработки осуществляют обслуживание фискальных регистраторов, поддерживаемых драйвером "АТОЛ: Драйвер ККМ v.10.10", "ШТРИХ-М: Драйвер ККМ v 5.16", "ВИКИ: Драйвер CSI v 1.6", для конфигураций БП, УТ, КА, УПП, "Розница 3.0", соответствующих требованиям закона ФЗ-54 о применении контрольно-кассовой техники.Поддержка НДС 20%. Поддержка маркировки 488-ФЗ. Марки. Акциз. Честный знак. Разрешительный режим.

5040 руб.

02.02.2017    276512    557    2375    

558

ККМ Пользователь Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Создание электронных чеков по документам 1С РеализацияТоваров (РасходнаяНакладная), КорректировкаРеализации, СчетНаОплату, ЗаказКлиента, ЧекККМ. Соответствует требованиям 54-ФЗ. Одна облачная касса может использоваться всеми подразделениями организации, без привязки к рабочим местам. Электронные чеки отправляются на email клиента и всегда доступны в 1С, по требованию можно распечатать. Легкая настройка: после регистрации кассы на сайте АТОЛ.ОНЛАЙН, в обработке необходимо указать логин, пароль и идентификатор группы ККТ (берутся в личном кабинете АТОЛ.ОНЛАЙН). Одну кассу можно использовать с 1С при расчетах с физ. и юр. лицами и для интернет-магазина. Эквайринг позволяет делать ссылки на форму оплаты по документам 1С и проверять состояние оплаты.

13800 руб.

23.08.2022    12272    30    4    

28
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bigmal 39 23.03.16 08:18 Сейчас в теме
Мсье знает толк в извращениях! (с) ))

Переход на работу по упомянутому выше пункту №1, на порядок проще, быстрее и правильнее, чем извращаться с HEX-ами. Ну, разве что для овладения использования данного метода от 1С, но не более того :)
2. JohnyDeath 302 23.03.16 08:26 Сейчас в теме
(1) bigmal, конечно проще, но с оговоркой, что нужные методы есть в родном драйвере.
Я также использовал и п.2 и п.3 при разработке печати на подкладных документах.
Подробностей уже и не вспомню, но точно также приходилось играть с HEX-ами. Ес-но, предварительно общался со службой поддержки Штрих-М. Именно они мне сказали, что HEX в некоторых случаях - единственный вариант.
3. dmt 67 23.03.16 12:29 Сейчас в теме
(1) bigmal, возможно и так :-), но я могу привести свои аргументы.

1. Используя решение из пункта 3. можно решить все необходимые вопросы с минимальными изменениями типового кода.
Для меня это было принципиально важно.
2. Переписать все функции на другой драйвер, это не такое и быстрое решение, с учетом возможных последствий...
Надо и писать нормально :-) и тестировать.
3. Ну и как уже упомянул комрад JohnyDeath, работа напрямую с протоколом позволяет все что описано в протоколе.
7. webester 26 27.05.16 13:35 Сейчас в теме
(1)Дописать одну функцию или переписать весь функционал работы с ФР? Хм какой сложный выбор...
4. dmt 67 28.03.16 03:44 Сейчас в теме
Добавил примеры. В том числе как в человекочитабельном виде получать строковые данные от ФР.
5. kostik_love 317 28.03.16 05:17 Сейчас в теме
А почему бы не связаться с ребятами из "Штрих-М" и подать заявку на доработку драйвера «ПО «ШТРИХ-М: Драйвер ФР» в соответствии с «требованиями к разработке драйверов для фискальных регистраторов» компании 1С»- что бы в следующей версии все нужные вам функции были.
а пункты 1, 2, 3 - получается временное решение.
6. dmt 67 28.03.16 05:50 Сейчас в теме
(5) kostik_love, потому что именно на форуме Штриха от сотрудников Штриха я и получил ответ использовать DeviceControlHEX.
8. al2ko 72 22.12.16 23:16 Сейчас в теме
Бодрого времени суток. Пробовал данный метод на версии драйвера 4.13 и получил сообщение:
{ВнешняяОбработка.ШтрихМФискальныеРегистраторы.МодульОбъекта(921)}: Метод объекта не обнаружен (DeviceControlHEX)
КомандаВыполнена = Объект.Драйвер.DeviceControlHEX(Объект.ИДУстройства, КомандаКВыполнению, РезультатКоманды);
У вас на какой версии работает?
9. dmt 67 23.12.16 08:34 Сейчас в теме
Привет!
На кассах стоит 4.10.
Но, насколько я помню работала и на 4.12.

А что за конфигурация? Название обработки намекает, что это УТ 11 или Розница 2.
Насколько я понимаю в этих конфигурациях логика работы торгового оборудования немного изменена.

Отсюда пара вопросов:
1. Объект это действительно объект? :-)
2. Драйвер действительно драйвер Штриха (DrvFR), а не DrvFR1C?
10. al2ko 72 23.12.16 14:29 Сейчас в теме
Бодрого времени суток.
Конфигурация УТ 10.3. Для проверки засунул код в стандартную обработку фискального регистратора ShtrihMFiscalPrinters_v2.
Драйвер наверно используется DrvFR1C из стандартной обработки.
Мне нужно в момент закрытия чека узнать подитог и назначить скидку суммой, а стандартные команды согласно "требований к разработке драйверов для фискальных регистраторов компании 1С" этого не умеют, переписывать конфигурацию не хочу.
Мне показалось что представленный тобой способ подойдет.
11. dmt 67 25.12.16 05:43 Сейчас в теме
(10) Привет!
Затестил 4.13. У меня тоже не взлетело.
Ошибок не выдает. И даже частично печатает. Но частично.
12. pomestnik 50 27.12.16 19:50 Сейчас в теме
А у меня другая печаль).Медленная печать с rdp. Весь штриховский форум кишит сообщениями что надо добавить
BeginDocument и EndDocument для буферизации.
Но в DrvFR1C их нету.. .
И костыль описанный тобой тут не всунуть ибо мне воздействовать на сам драйвер надо... Я правильно понимаю ?

p.s. интересно можно ли декомпильнуть и пересобрать дллку эту =\

13. dmt 67 28.12.16 13:02 Сейчас в теме
(12) По идее, костыль может все что может протокол "Протокол работы ФР".
Описание протокола можно посмотреть тут:
ftp://ftp.shtrih-m.ru/download/FR/Doc/ProtocolFR_1_12.pdf
14. anrahell 8 19.02.17 13:07 Сейчас в теме
// Функция переводит обычную cтроку в шестнадцатеричное представление
// Параметры:
// ТекстСообщения - Строка - Текст сообщения
// ТипКодировки - Число - Тип кодировки (1 - каждый символ представляется 2 байтами, 0 - 1 байтом)
// Возвращаемое значение: Строка - Строка после перекодировки
//
Функция Str2Hex(ТекстСообщения, ТипКодировки)
СтрокаЗнаков = "";
Если ТипКодировки = 1 Тогда
ДлинаКодаСимвола = 4;
Иначе
ДлинаКодаСимвола = 2;
КонецЕсли;
Для К = 1 По СтрДлина(ТекстСообщения) Цикл
СтрокаЗнаков = СтрокаЗнаков + Padl(DecToHex(КодСимвола(Сред(ТекстСообщения, К, 1))), ДлинаКодаСимвола, "0");
КонецЦикла;
Возврат СтрокаЗнаков;
КонецФункции // Str2Hex()

// Функция переводит cтроку из шестнадцатеричного представления в обычную строку
// Параметры:
// СтрокаСимволов - Строка - Текст в шестнадцатеричном виде
// ПризнакКода - Строка - Тип кодировки ("0" - каждый символ представляется 1 байтами, "1" - 2 байтами)
// Возвращаемое значение: Строка - Строка после перекодировки
//
Функция StrHexToStr(СтрокаСимволов, ПризнакКода) Экспорт
Если Число(ПризнакКода) = 0 Тогда
КоличествоСимволов = 2;
Иначе
КоличествоСимволов = 4;
КонецЕсли;
к = 1;
Результат = "";
Пока к < СтрДлина(СтрокаСимволов) Цикл
Строка = Сред(СтрокаСимволов, к, КоличествоСимволов);
Результат = Результат + Символ(HexToDec(Строка));
к = к + КоличествоСимволов;
КонецЦикла;
Возврат Результат;
КонецФункции // StrHexToStr()
15. ardn 658 16.01.18 00:09 Сейчас в теме
Подскажите, можно ли воспользоваться данным методом в текущих конфигурациях, где общение программы с устройством идет через компоненту 1С? Не вижу там команды DeviceControlHEX...
16. bigmal 39 16.01.18 07:44 Сейчас в теме
(15) Юрий, в компоненте а-ля 1С нет практически ничего. Это заусенец на верхушке айсберга в сравнении с возможностями нормального драйвера ))
17. dmt 67 21.01.18 09:39 Сейчас в теме
(15) В компоненте DrvFR1C такой метод есть, в SMDrvFR1C20 для ККТ такого метода нет.
18. Strange Device 307 03.07.18 14:12 Сейчас в теме
А с Атоллами ничего подобного не проделывали? Столкнулся с бедой, что при переходе с 8-ых драйверов Атолла на 9-е перестал работать код печати ШК, который раньше работал, вот ищу пути решения проблемы...
19. man-1982 14.03.19 16:15 Сейчас в теме
Подскажите, а как отлаживать такие обработки для фискальников и для ККМ? На примере ут 10.3
Сейчас делаю так, произвел изменения во внешней обработки и потом загрузил ее в справочники ОбработкиТО. Проверил, если не взлетело то опять подправляю и загружаю.
Может есть какой то метод, чтобы в 10.3 не выгружать и загружать обработки каждый раз, может они могут подхватываться прямо из кода? Из встроенных обработок конфигуратора?
Оставьте свое сообщение