Всем привет! Вопрос достаточно срочный... т.к. уже неделю пытаемся это победить и всё безуспешно.
Так вот, имеется Альфа-Авто ред. 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, но в данный момент работает функция взятая
вот этой разработке Результат тот же...
Единственное что, я не переносил из 5ки такие документы как "Ввод в оборот кодов маркировки" и т.п.
Перенес маркировку только в Поступление, Реализации, Чеки, Заказ-наряд (там маркировка учитывается в перемещении товаров в производство) и Фронт кассира
Кажись в документе "Ввод в оборот кодов маркировки" есть процедуры и функции, которые зашиты в защищенные модули.
(10) Да, я так же сделал... вот только придётся дописывать заполнение организации, подразделения, автора и т.п. самому, т.к. он после этого все реквизиты "по-умолчанию" кажись не заполняет.
P.S. Именно на доках маркировки не проверял))
(13)Пока никак.... подключили ЭДО от Сбис, которая с маркировкой работает.
Все доки принимаются и подтверждаются там. А потом их заносят в 1С и сканируют коды.
НО! У СБИС есть то ли API, то ли готовая обработка выгрузки доков в 1С, но до этого пока руки не дошли.