Маркировка шин (Альфа-Авто ред. 4 + Атол ДТО8) передача тэга 1162 в ККМ

1. dikd 17 20.10.20 18:24 Сейчас в теме
Всем привет! Вопрос достаточно срочный... т.к. уже неделю пытаемся это победить и всё безуспешно.

Так вот, имеется Альфа-Авто ред. 4.1 + ККМ Атол 55ф.
Альфа-Авто этой редакции умеет работать только с ДТО8, с ДТО10 не работает, т.к. обновления под ДТО10 не будет сказал разработчик.
Ну, подумали ничего страшного, будем через ДТО8 тэг 1162 напрямую в устройство через "WriteAttribute()"

Взяли Альфа-Авто ред. 5.1 самого крайнего релиза, вытащили оттуда всё, что касается маркировки, в общем в нашей Альфе4 всё-всё работает, маркировка сканером читается и т.п.
Но вот подошло время для пробития маркированных шин через ККМ, никаких ошибок сам аппарат не выдал, всё пробилось.
Но посмотрели в ФП, что же передалось и оказалось, что там нет информации о маркировке...

Начали копать...

Вот сама функция печати чека во втроенной обработке обслуживания АТОЛ:
Функция ПечатьСтрокиЧека(ТипЧека,НомерПоз,Наименование,Отдел,Цена,
	Количество,Сумма,НаименованиеСкидки,
	СуммаСкидки,ПроцентСкидки, СтавкаНалога = -1, СуммаНалога = 0, НомерНалога = -1, Комментарий = "",ТипМаркировки, GTINМаркировки, СерийныйНомерМаркировки, ШКМишлен)
	//	Печатает строку чека 
	//	Регистрируем строку чека
	//	.. ТипЧека		= Перечисление.ТипыЧеков (продажа или возврат)
	//	.. НомерПоз		= Число(<Позиция чека>)
	//	.. Товар		= Справочник.Номенклатура(<Товар>)
	//	.. Отдел		= Справочник.МестаХранения(<Отдел товара>)
	//	.. Цена			= Число(<Цена товара>)
	//	.. Количество	= Число(<Количество товара>)
	//	.. Сумма		= Число(<Стоимость товара>)
	//	.. НетСТ		= 0/1 Флаг отсутствия скидки на вид товара
	//	.. НетСК		= 0/1 Флаг отсутствия скидки на количество проданного товара
	//	.. ПроцСТ		= Число(<Процент скидки на вид товара>)
	//	.. ПроцСК		= Число(<Процент скидки на количество проданного товара>)
	//	.. СуммаСТ		= Число(<Сумма скидки на вид товара>)
	//	.. СуммаСК		= Число(<Сумма скидки на количество проданного товара>)
	//  .. флФиск		= Число 0/1(<Флаг фискального документа>)
	//	.. Возврат		= Число(<Код ошибки оборудования>)
	//
	
	стрНаименование = ПривестиНаименование(Наименование, НомерПоз,,,"");
	
	Если флФиск=1 Тогда // Печать фискального чека
		
		Если ЗначениеЗаполнено(ТипМаркировки) И ТипМаркировки <> -1 Тогда
			
			Устройство.BeginItem();
			Устройство.ItemType=1;
			
			Если ЗначениеЗаполнено(ТипМаркировки) И ТипМаркировки <> -1 Тогда
				
				ДанныеМарки = Новый Структура;
				ДанныеМарки.Вставить("ГТИН",GTINМаркировки);
				ДанныеМарки.Вставить("СЕРИЯ",СерийныйНомерМаркировки);
				
				СтрокаМаркировки = ПолучитьКодДляПередачиТега1162_010320(ДанныеМарки);
				
				//СтрокаМаркировки = "44 4D ";
				//
				//СтрокаМаркировки = СтрокаМаркировки + ПолучитьПоБайтамЧисло(Число(GTINМаркировки), 6);
				//СтрокаМаркировки = СтрокаМаркировки + ПолучитьПоБайтамСтроку(СерийныйНомерМаркировки, 13);
				
				//Устройство.setParamStrHex(1162, СтрокаМаркировки);
				
				Устройство.StreamFormat = 5;
				Устройство.AttrNumber = 1162;
				Устройство.AttrValue = СокрЛП(СтрокаМаркировки);
				Устройство.WriteAttribute();
				
			КонецЕсли;
			
			Устройство.Name = стрНаименование;
			Устройство.Price = Цена;
			Устройство.Quantity = Количество;
			Устройство.Department = Отдел;
			Устройство.Summ = Сумма;
			Устройство.TaxTypeNumber = НомерНалога;
			
			Устройство.EndItem();
			
		Иначе
			
			// Печатаем строку чека
			//Поз=Строка(НомерПоз);
			// Добавил возможность печати наименования товара на нескольких строчках
			//Если ЧислоСтрокНаименования > 1 И ЧислоСтрокНаименования <> 1 Тогда
			//	Устройство.РасширеннаяРегистрация =Ложь;
			//	Устройство.Наименование= ПривестиНаименование(Наименование, Поз);
			//Иначе
			//	Устройство.Наименование="  "+Поз+") "+Лев(Наименование,ДлинаНаименования-СтрДлина(Поз)-4);
			//КонецЕсли;
			Устройство.ПереносТекста =2;
			
			// Печатаем характеристику
			Если Не ПустаяСтрока(Комментарий) Тогда
				Устройство.Строка= Комментарий;
				КодОшибки = ВыполнитьКоманду("ПечатьСтроки"); Если КодОшибки<>0 Тогда Возврат КодОшибки; КонецЕсли;
			КонецЕсли;
			
			Устройство.Наименование  = стрНаименование;
			Устройство.Цена			 = Цена;
			Устройство.Количество	 = Количество;
			Если НомерНалога = -1 Тогда
				Устройство.Секция = Число(Отдел);
			Иначе
				Если (НомерНалога < 1) ИЛИ (НомерНалога > 16) Тогда
					КодОшибки = 22109;
					ТекстОшибки = "Номер налога вне допустимого диапазона (1..16)";
					Возврат КодОшибки;	
				КонецЕсли;
				Устройство.Секция = Число(НомерНалога); // У АТОЛ-а налоги привязаны к отделам
			КонецЕсли;
			
			Попытка
				Если Поддерживает54ФЗ Тогда
					Устройство.НомерНалога = Число(НомерНалога);
					Устройство.ЗначениеСкидки = СуммаСкидки;
					Устройство.ТипСкидки = 0;
				КонецЕсли;
			Исключение
				КодОшибки=0;
			КонецПопытки;
			
			// Регистрируем продажу
			Если 	  ТипЧека=0 Тогда КодОшибки = ВыполнитьКоманду("Регистрация");
			ИначеЕсли ТипЧека=1 Тогда КодОшибки = ВыполнитьКоманду("Возврат");
			КонецЕсли;
			Если КодОшибки<>0 Тогда Возврат КодОшибки; КонецЕсли;
			
			// Регистрируем скидку
			Если НЕ Поддерживает54ФЗ И СуммаСкидки <> 0 Тогда
				Устройство.Сумма=обМод(СуммаСкидки);
				Устройство.ОбластьДействия=1; // Скидка на позицию (а не на чек)
				Если СуммаСкидки>=0 Тогда 
					КодОшибки = ВыполнитьКоманду("Скидка");
				Иначе 
					КодОшибки = ВыполнитьКоманду("Надбавка");
				КонецЕсли;
				Если КодОшибки<>0 Тогда Возврат КодОшибки; КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		////////////////////////////////////////////////////////////­////////////////////////
		// НЕФИСКАЛЬНАЯ КОПИЯ ЧЕКА
	Иначе 
		Устройство.ПереносТекста = 2;
		Устройство.Строка= стрНаименование;
		КодОшибки = ВыполнитьКоманду("ПечатьСтроки"); Если КодОшибки<>0 Тогда Возврат КодОшибки; КонецЕсли;
		
		// Печатаем строку с количеством
		Отдел = " " + Строка(Отдел);
		Устройство.Строка=Отдел + обСтрокаПривести(Формат(Количество, "ЧДЦ=3") + " Х "+
		СокрЛ(Формат(Цена,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧН=0.00")) + 
		" ="+СокрЛ(Формат(Сумма,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧН=0.00")),
		" ",ДлинаСтроки - СтрДлина(Отдел));
		
		КодОшибки = ВыполнитьКоманду("ПечатьСтроки");
		Если КодОшибки<>0 Тогда Возврат КодОшибки; КонецЕсли;
		
		// Эмулируем регистрацию скидки на вид товара
		Если СуммаСкидки<>0 Тогда
			Если СуммаСкидки>=0 Тогда Стр="СКИДКА "; Иначе Стр="НАДБАВКА " КонецЕсли;
			Устройство.Строка=Стр+обСтрокаПривести("="+СокрЛ(Формат(обМод(СуммаСкидки),"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧН=0.00"))
			," ",ДлинаСтроки-СтрДлина(Стр));
			КодОшибки = ВыполнитьКоманду("ПечатьСтроки"); Если КодОшибки<>0 Тогда Возврат КодОшибки; КонецЕсли;
		КонецЕсли;
		
		//Эмулируем печать налогов
		Если (СтавкаНалога > 0) Тогда
			Стр = "ВКЛЮЧАЯ НАЛОГ  " + Формат(СтавкаНалога, "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧН=0.00") + "%";	
			Устройство.Строка = Стр + обСтрокаПривести("=" + СокрЛ(Формат(СуммаНалога, "ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧРГ=' '; ЧН=0.00")),
			" ", ДлинаСтроки-СтрДлина(Стр));
			Устройство.ШрифтЖирный = Истина;
			Устройство.ШрифтДвойнаяВысота = Истина;
			Устройство.ШрифтДвойнаяШирина = Истина;
			КодОшибки = ВыполнитьКоманду("ПечатьСтроки"); Если КодОшибки <> 0 Тогда Возврат КодОшибки; КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
	
	// Все ОК,закончили
	Возврат 0;
КонецФункции
Показать


В итоге переменная СтрокаМаркировки формируется верная, т.е. в 16тиричном формате, всё как должно быть.

Но вот если в отладчике в табло в момент передачи 1162 выполнить
Устройство.WriteAttribute();

то возвращается ошибка "-3895", этот код означает "Не верная длина", причём на форумах все пишут, что относится ошибка к длине наименования товара... а у нас ведь запись атрибута "1162"

В общем уже всю голову сломал.

Изначально функция перевода была взял из Альфа-Авто 5, но в данный момент работает функция взятая
вот этой разработке
Результат тот же...

Может кто тоже мучился с подобным? куда копать?
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dikd 17 20.10.20 18:25 Сейчас в теме
Вот из отладчика скрин
Прикрепленные файлы:
3. karpik666 3851 20.10.20 20:01 Сейчас в теме
Вот это решение поддерживает Альфа-Авто 4 и можно использовать 10-е драйвера АТОЛ без костылей. https://infostart.ru/public/590993/?ref=1050
5. dikd 17 20.10.20 20:33 Сейчас в теме +2 $m
(3) Опа! А про это я не знал! Спасибо!!! Сейчас вчитаюсь
4. papami 56 20.10.20 20:17 Сейчас в теме
А ведь официалы сейчас это шины и... одежда, обувь, духи, велики. Полный набор)
6. Vegner 34 26.10.20 08:03 Сейчас в теме
(1) получилось у Вас настроить передачу данных в честный знак через ОФД ?
7. dikd 17 26.10.20 10:29 Сейчас в теме
(6)Да, всё получилось

1. В Альфу4 перенесли весь функционал по маркировке из Альфы5
2. Воспользовались вот этой классной разработкой https://infostart.ru/public/590993/?ref=1050
8. BlackAngelPRM 06.11.20 11:17 Сейчас в теме
(7) Тоже думаю идти этим путем , перенос из 5 альфы ....подводных камней много ?
9. dikd 17 07.11.20 13:59 Сейчас в теме
(8) да в целом нет, камней не много.

Единственное что, я не переносил из 5ки такие документы как "Ввод в оборот кодов маркировки" и т.п.

Перенес маркировку только в Поступление, Реализации, Чеки, Заказ-наряд (там маркировка учитывается в перемещении товаров в производство) и Фронт кассира

Кажись в документе "Ввод в оборот кодов маркировки" есть процедуры и функции, которые зашиты в защищенные модули.
11. BlackAngelPRM 09.11.20 17:56 Сейчас в теме
(9)общий модуль ЗфЗащищенныеФункции
Обойти проверку документов Заказ и ВВодКМ
Функция зфФормаДокументаПриОткрытии(ЭтаФорма, ПовторноеОткрытие = Ложь) Экспорт
	ОбработкаЗащиты = Неопределено;

	Если Не зфПроверкаЗащиты(ОбработкаЗащиты) Тогда
		Возврат Ложь;
	КонецЕсли;

	пЭтаФорма = ЭтаФорма;
	пПовторноеОткрытие = ПовторноеОткрытие;
	Если ТипЗНЧ(ЭтаФорма.Ссылка) = Тип("ДокументСсылка.ЗаказКодовМаркировки") Тогда 
		Рез=Истина;
	ИначеЕсли ТипЗНЧ(ЭтаФорма.Ссылка) = Тип("ДокументСсылка.ВводВОборотКодовМаркировки") Тогда 
		Рез=истина;
	 Иначе 
	Рез = ОбработкаЗащиты.Компонента.дкФормаПриОткрытии(пЭтаФорма, пПовторноеОткрытие);
	КонецЕсли;
	ЭтаФорма.Модифицированность = Ложь;
	
	Возврат Рез;
КонецФункции
Показать
10. BlackAngelPRM 09.11.20 11:22 Сейчас в теме
(9)"Кажись в документе "Ввод в оборот кодов маркировки" есть процедуры и функции, которые зашиты в защищенные модули."
есть вчера нашел как обойти :)
12. dikd 17 10.11.20 10:58 Сейчас в теме
(10) Да, я так же сделал... вот только придётся дописывать заполнение организации, подразделения, автора и т.п. самому, т.к. он после этого все реквизиты "по-умолчанию" кажись не заполняет.
P.S. Именно на доках маркировки не проверял))
13. BlackAngelPRM 10.11.20 11:36 Сейчас в теме
(12 ) По факту если не производитель , эти документы нужны только при заполнении и маркировке остатков. Ну возможно понадобится перемаркировка.

Вопрос , а как решили проблему с получением и отправкой УПД с кодами маркировки ?
14. dikd 17 10.11.20 12:47 Сейчас в теме
(13)Пока никак.... подключили ЭДО от Сбис, которая с маркировкой работает.
Все доки принимаются и подтверждаются там. А потом их заносят в 1С и сканируют коды.

НО! У СБИС есть то ли API, то ли готовая обработка выгрузки доков в 1С, но до этого пока руки не дошли.
15. BlackAngelPRM 11.11.20 06:35 Сейчас в теме
(14)Каким образом заносят в 1с (в Альфу) ? И как проверяют ?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот