- Изменение конфигурации Розницы для работы с Yarus.
Для того чтобы конфигурация Розница, редакция 1.0 смогла передавать нужные данные через обработку в Штрих ККТ необходимо изменить конфигурацию.
В функции “ПечатьЧекаККМ” изменим следующий код, чтобы передавать данные по штрихкоду:
Иначе
//>>
СтрокаЧека = Новый Структура("Наименование, Количество, Цена, Скидка, НомерСекции, СтавкаНДС, Штрихкод,НеПечатать");
СтрокаЧека.Наименование = Позиция.Наименование;
Если СуммаСоСкидкой1С = СуммаСоСкидкойФР Тогда
СтрокаЧека.Количество = Позиция.Количество;
СтрокаЧека.Цена = Позиция.Цена;
СтрокаЧека.Скидка = Позиция.Скидка;
СтрокаЧека.НомерСекции = Позиция.НомерСекции;
СтрокаЧека.СтавкаНДС = Позиция.СтавкаНДС;
СтрокаЧека.НеПечатать = Истина;
СтрокаЧека.Штрихкод = Позиция.Штрихкод;
Иначе
СтрокаЧека.Количество = 1;
СтрокаЧека.Цена = СуммаСоСкидкой1С;
СтрокаЧека.Скидка = 0;
СтрокаЧека.НомерСекции = Позиция.НомерСекции;
СтрокаЧека.СтавкаНДС = Позиция.СтавкаНДС;
СтрокаЧека.НеПечатать = Истина;
СтрокаЧека.Штрихкод = Позиция.Штрихкод;
КонецЕсли;
Результат = ПолучитьСерверТО().ПечатьСтрокиЧека(Идентификатор, СтрокаЧека);
//<<
КонецЕсли;
Далее изменим структуру для печати позиции
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Если СтруктрураШаблона <> Неопределено И СтруктрураШаблона.ОднаФискальнаяСтрока Тогда
МассивСтрокДляПечати = ПроцедурыПечатиФискальныхЧеков.ПреобразоватьМассивСоответствийВМассивТекстовыхСтрок(СтруктрураШаблона.СоставнойМассив);
Результат = ПОлучитьСерверТО().ПечатьТекста(Идентификатор, МассивСтрокДляПечати, СтруктрураШаблона.ШиринаЧека);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
КонецЕсли;
//>>
Если НЕ (СтруктрураШаблона <> Неопределено) Тогда
СтрокаЧека = Новый Структура("Наименование, Количество, Цена, Скидка, НомерСекции, СтавкаНДС");
СтрокаЧека.Наименование = "Всего:";
СтрокаЧека.Количество = 1;
СтрокаЧека.Цена = Товары.Итог("Сумма");
СтрокаЧека.Скидка = 0;
СтрокаЧека.СтавкаНДС = 0;
СтрокаЧека.НомерСекции = Позиция.НомерСекции;
Результат = ПолучитьСерверТО().ПечатьСтрокиЧека(Идентификатор, СтрокаЧека);
КонецЕсли;
Изменим функцию «ПровестиИРаспечататьЧек», добавим колонку для штрихкода:
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Наименование");
ТаблицаТоваров.Колонки.Добавить("НомерСекции");
ТаблицаТоваров.Колонки.Добавить("Цена");
ТаблицаТоваров.Колонки.Добавить("Количество");
ТаблицаТоваров.Колонки.Добавить("Скидка");
ТаблицаТоваров.Колонки.Добавить("СтавкаНДС");
ТаблицаТоваров.Колонки.Добавить("Штрихкод");//>>
Далее в цикле заполним колонку «Штрихкод»
Пока Выборка.Следующий() Цикл
Товар = ТаблицаТоваров.Добавить();
Товар.Наименование = СокрЛП(Выборка.Номенклатура)
+ "(" + СокрЛП(Выборка.ЕдиницаИзмерения)
+ ?(ПустаяСтрока(Выборка.ХарактеристикаНоменклатуры), "", ", " + СокрЛП(Выборка.ХарактеристикаНоменклатуры)) + ")";
Товар.НомерСекции = 1;
Товар.Цена = Выборка.Цена;
Товар.Количество = Выборка.Количество;
Товар.Скидка = Выборка.ПроцентСкидкиНаценки;
Товар.СтавкаНДС = ?(ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ, Ценообразование.ПолучитьСтавкуНДС(Выборка.СтавкаНДС), 0);
Товар.Штрихкод = ПолучитьШК(Выборка); //MI++>>
КонецЦикла;
Функция ПолучитьШК:
Функция ПолучитьШК(Выборка)
Нм = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Номенклатура);
Хр = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(Выборка.ХарактеристикаНоменклатуры);
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.ХарактеристикаНоменклатуры,
| Штрихкоды.Штрихкод,
| Штрихкоды.Владелец,
| ХарактеристикиНоменклатуры.Ссылка
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
| ПО Штрихкоды.Владелец = ХарактеристикиНоменклатуры.Владелец
|ГДЕ
| Штрихкоды.Владелец = &Ссылка
| И ХарактеристикиНоменклатуры.Наименование = &Наименование";
Запрос.УстановитьПараметр("Ссылка",Нм.Ссылка);
Запрос.УстановитьПараметр("Наименование",Выборка.ХарактеристикаНоменклатуры);
Рез = Запрос.Выполнить();
Если Рез.Пустой() Тогда
Возврат "";
Иначе
_Выборка = РЕз.Выбрать();
Пока _Выборка.Следующий() Цикл
Если Найти(_Выборка.ХарактеристикаНоменклатуры.Наименование,Выборка.ХарактеристикаНоменклатуры)>0 Тогда
Возврат _Выборка.Штрихкод;
КонецЕсли;
Конеццикла;
КонецЕсли;
Возврат "";
КонецФункции
Изменим процедуру «КнопкаКупоныНажатие» в Форме регистрации продаж, для корректного открытия денежного ящика:
Если Результат = Перечисления.ТООшибкиОбщие.ПустаяСсылка() Тогда
//>>
Попытка
врОтвет = Объект.Драйвер.ОткрытьДенежныйЯщик(Объект.ИДУстройства,0);// НомерДенежногоЯщика)
КодОшибки = Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
Исключение
Объект.Драйвер.Password = Объект.Параметры.ПарольАдминистратора;
Объект.Драйвер.DrawerNumber = 0;
врОтвет = Объект.Драйвер.ОткрытьДенежныйЯщик();// НомерДенежногоЯщика)
КодОшибки = Объект.Драйвер.ResultCode;
Объект.ОписаниеОшибки = Объект.Драйвер.ResultCodeDescription;
КонецПопытки;
//<<
КонецЕсли;
И изменим в обработке «ТОСервер» функцию ПечатьСтрокиЧека:
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Результат = Обработка.ПечататьСтроку(Объект,
СтрокаЧека.Наименование,
СтрокаЧека.Количество,
СтрокаЧека.Цена,
СтрокаЧека.Скидка,
СтрокаЧека.НомерСекции,
СтрокаЧека.СтавкаНДС,
СтрокаЧека.Штрихкод,
СтрокаЧека.НеПечатать); //>>
- Изменение обработки для работы с Yarus
Для основы возьмем обработку “ShtrihMFiscalPrinters_v2.epf”, в модуле обработки опишем сперва стандартные функции и процедуры:
функция «СоздатьОбъектДрайвера»
Вместо кода
ПрогИД = "AddIn.DrvFR1C";
будет код
ПрогИД = "Addin.DrvFR";
И код
мВерсияИзДрайвера = Драйвер.ПолучитьНомерВерсии();
заменим кодом
мВерсияИзДрайвера = Драйвер.DriverVersion;//
Функция «Подключить»
Код
Если Не Объект.Драйвер.Подключить(МассивЗначений, Объект.ИДУстройства) Тогда
КодОшибки = Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
Результат = мОшибкаНеизвестно;
Иначе
Если Объект.Параметры.ОтменятьЧекПриПодключении Тогда
Объект.Драйвер.ОтменитьЧек(Объект.ИДУстройства);
КонецЕсли;
КонецЕсли;
заменим на
Попытка
Если ПодключитьFR(Объект,Объект.ОписаниеОшибки) Тогда
Пока Истина Цикл
Рез = ОбработкаОшибок(Объект,Объект.ИДУстройства, Истина);
Если Рез > 0 Тогда
КодОшибки = Объект.Драйвер.ResultCodeDescription;//Описание
Результат = мОшибкаНеизвестно;
Возврат Результат;
ИначеЕсли Рез = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ТаблицыККМ = Неопределено Тогда
ТаблицыККМ = Новый Соответствие;
КонецЕсли;
Если ШиринаЛентыККМ = Неопределено Тогда
ШиринаЛентыККМ = Новый Соответствие;
КонецЕсли;
Если НомераСисАдминов = Неопределено Тогда
НомераСисАдминов = Новый Соответствие;
КонецЕсли;
НомерЛУ = Объект.ИДУстройства;
ЗаполнитьПараметрыККМ(Объект,НомерЛУ);
ЗагрузитьТаблицуПерекодировки();
Исключение
Результат = мОшибкаНеизвестно;
КонецПопытки;
Процедура “Отключить”:
Если ОтключитьFR(Объект) Тогда
Пока Истина Цикл
Рез = ОбработкаОшибок(Объект,Объект.ИДУстройства, Истина);
Если Рез > 0 Тогда
Объект.ОписаниеОшибки = мОшибкаНеизвестно;
Возврат;
ИначеЕсли Рез = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Функция “ТестУстройства”:
Результат = Подключить(Объект);
РезультатТеста = Объект.Драйвер.ResultCodeDescription;
Если Результат = мНетОшибки Тогда
Отключить(Объект);
КонецЕсли;
Возврат Результат;
Функция ХОтчет:
Результат = мНетОшибки;
Mistake="";
ФискальныйРегистратор = Объект.Драйвер;
НомерККМ=0;
ОтчетНомерЧека=0;
ОтчетНомерОтчета=0;
ОтчетНаличностьВКассе=0;
ОтчетВыручка=0;
ФискальныйРегистратор.GetECRStatus();
Если CheckMistakeFR(Mistake,Объект)<>0 Тогда
Объект.ОписаниеОшибки = Mistake;
Результат = мОшибкаНеизвестно;
Возврат Результат;
КонецЕсли;
Если ФискальныйРегистратор.ECRAdvancedMode=3 Тогда
ФискальныйРегистратор.ContinuePrint();
ФискальныйРегистратор.Password=Объект.Параметры.ПарольАдминистратора;
ФискальныйРегистратор.GetECRStatus();
Если CheckMistakeFR(Mistake,Объект)<>0 Тогда
Объект.ОписаниеОшибки = Mistake;
Результат = мОшибкаНеизвестно;
Возврат Результат;
КонецЕсли;
КонецЕсли;
Если ПолучитьПараметрыОтчета(Объект,ОтчетНомерЧека,ОтчетНомерОтчета,ОтчетНаличностьВКассе,ОтчетВыручка)=1 Тогда
Результат = мОшибкаНеизвестно;
Возврат Результат;
КонецЕсли;
ФискальныйРегистратор.Password=Объект.Параметры.ПарольАдминистратора;
ФискальныйРегистратор.PrintReportWithoutCleaning();
Если CheckMistakeFR(Mistake,Объект)<>0 Тогда
Объект.ОписаниеОшибки = Mistake;
Результат = мОшибкаНеизвестно;
Возврат Результат;
КонецЕсли;
Для Ном=1 по 10 Цикл
Пауза(3);
ФискальныйРегистратор.Password=Объект.Параметры.ПарольАдминистратора;
ФискальныйРегистратор.RegisterNumber=152;
ФискальныйРегистратор.GetOperationReg();
Если ФискальныйРегистратор.ResultCode=0 Тогда
Если ФискальныйРегистратор.ContentsOfOperationRegister+1<>ОтчетНомерЧека Тогда
Прервать;
КонецЕсли;
КонецЕсли;
Сбой=0;
ФискальныйРегистратор.GetECRStatus();
Если ФискальныйРегистратор.ResultCode=0 Тогда
Если ФискальныйРегистратор.ECRAdvancedMode=2 Тогда
Пока 1=1 Цикл
Предупреждение("Ошибка кассы"+?(Ном=0,""," №"+Ном)+": нет бумаги! Вставьте бумагу.","Вставьте бумагу");
ФискальныйРегистратор.GetECRStatus();
Если ФискальныйРегистратор.ResultCode<>0 Тогда
Сбой=1;
Прервать;
КонецЕсли;
Если ФискальныйРегистратор.ECRAdvancedMode<>2 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ФискальныйРегистратор.ECRAdvancedMode=3 Тогда
ФискальныйРегистратор.ContinuePrint();
КонецЕсли;
Иначе
Сбой=1;
КонецЕсли;
Если Сбой=1 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
Функция ZОтчет аналогична.
Функция ОткрытьЧек:
DescMistake="";
НомерЛУ = Объект.ИДУстройства;
Если ТребуетсяОткрытиеСмены(Объект,НомерЛУ) Тогда
ОткрытьСмену(Объект,НомерЛУ, НомерСмены);
Res = CheckMistakeFR(DescMistake,Объект);
Если (Res > 0) Тогда
//"Ошибка подсоединения ФР.");
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
ИначеЕсли (Res = 0) Тогда
Результат = мНетОшибки;
ИначеЕсли Res = -1 Тогда
//"Аннулирование чека ФР.");
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = мНетОшибки;
НомерЧека = 0;
НомерСмены = 0;
FR = Объект.Драйвер;
FR.Password = Объект.Параметры.ПарольАдминистратора;
Если НЕ Объект.Параметры.ВыключитьОФД Тогда
Если ЭтоВозврат Тогда
FR.CheckType=3;
Иначе
FR.CheckType=1;
КонецЕсли;
Иначе
Если ЭтоВозврат Тогда
FR.CheckType=2;
Иначе
FR.CheckType=0;
КонецЕсли;
КонецЕсли;
Попытка
НаименованиеМодели = Объект.Модель.Наименование;
Исключение
НаименованиеМодели = Объект.Модель;
КонецПопытки;
Если (Найти(НаименованиеМодели,"ШТРИХ-ККТ ЯРУС М2100Ф")>0) Тогда
Иначе
FR.OpenCheck();
КонецЕсли;
Res = CheckMistakeFR(DescMistake,Объект);
Если (Res > 0) Тогда
//"Ошибка подсоединения ФР.");
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
ИначеЕсли (Res = 0) Тогда
Результат = мНетОшибки;
ИначеЕсли Res = -1 Тогда
//"Аннулирование чека ФР.");
ОтменитьЧек(Объект);
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
КонецЕсли;
//-----------Теперь получим номер чека---------------------------------------------------------------------------------------------
НомерЧека=FR.OpenDocumentNumber;
НомерСмены =FR.SessionNumber+1; //!
Возврат Результат;
Функция “ЗакрытьЧек”:
Результат = мНетОшибки;
DescMistake="";
Polucheno=СуммаНал;
Если Не CloseCheck(Объект,СуммаНал, СуммаБезнал,Polucheno) Тогда
ОтменитьЧек(Объект);
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
КонецЕсли;
Возврат Результат;
Функция “ПечататьСтроку”:
Результат = мНетОшибки;
СуммаПозиции = Количество*Цена - Окр(Количество*Цена*Скидка/100, 2, РежимОкругления.Окр15как20);
СуммаСкидки = Окр(Количество*Цена*Скидка/100, 2, РежимОкругления.Окр15как20);
НомерЛУ = Объект.ИДУстройства;
Если Штрихкод=Неопределено Тогда
ШтрихКод = ПолучитьШК(Наименование,"Наименование");//Найти ШК товара
КонецЕсли;
Попытка
НаименованиеМодели = Объект.Модель.Наименование;
Исключение
НаименованиеМодели = Объект.Модель;
КонецПопытки;
БлокСтрок = СформироватьБлокСтрок(Истина,НомерЛУ,Наименование, Количество, Цена, Скидка, Секция, НДС,Штрихкод,,НаименованиеМодели);
Если Объект.Параметры.ЗаписьКопииЧека Тогда
ДокуметНТМЛ = ДокуметНТМЛ + КонвертироватьБлокСтрокВХТМЛ(НомерЛУ, БлокСтрок);
КонецЕсли;
НеПечатать = ?(НеПечатать=Неопределено,Ложь,НеПечатать);
Если Не НеПечатать Тогда
Если Не ПечатьСтроки(Объект, НомерЛУ, КонвертироватьБлокСтрокВСтрокиДляПечати(НомерЛУ, БлокСтрок)) Тогда
Возврат Ложь;
КонецЕсли;
КонецЕсли;
DescMistake="";
ФР = Объект.Драйвер;
Если Объект.Параметры.ЗаписьКопииЧека Тогда
ТаблицаНалогов = Новый ТаблицаЗначений();
ТаблицаНалогов.Колонки.Добавить("Ставка");
ТаблицаНалогов.Колонки.Добавить("СуммаНалога");
КонецЕсли;
Налоги="";
Если НЕ Объект.Параметры.ВыключитьОФД Тогда
ФР.Password = Объект.Параметры.ПарольАдминистратора;
тНаименование = СокрЛП(Наименование);
Если Штрихкод=Ложь Тогда
Штрихкод = "";
КонецЕсли;
Если (Найти(НаименованиеМодели,"ШТРИХ-ККТ ЯРУС М2100Ф")=0) Тогда
ФР.StringForPrinting = "//" + тНаименование;
Иначе
ФР.StringForPrinting = тНаименование;
КонецЕсли;
ФР.Barcode = СокрЛП(Штрихкод);
Если ПустаяСтрока(ФР.Barcode) Тогда
ФР.Barcode = 0;
КонецЕсли;
ФР.Quantity = Количество;
ФР.Department = Секция;
ФР.Price = СуммаПозиции/Количество;
ФР.DiscountValue = 0;
ФР.ChargeValue = 0;
Если СуммаСкидки > 0 Тогда
ФР.DiscountValue = СуммаСкидки;
ИначеЕсли СуммаСкидки < 0 Тогда
ФР.ChargeValue = СуммаСкидки * -1;
КонецЕсли;
ТабНалоговНаПокупку = GetTaxesOnBuy(НДС,Количество*Цена,СуммаСкидки);
Если Объект.Параметры.ЗаписьКопииЧека И (ТабНалоговНаПокупку <> Неопределено) Тогда
Для Каждого СтрНалог Из ТабНалоговНаПокупку Цикл
НовСтр = ТаблицаНалогов.Добавить();
НовСтр.Ставка = СтрНалог.Ставка;
НовСтр.СуммаНалога = СтрНалог.СуммаНалога;
КонецЦикла;
КонецЕсли;
ЗаполнитьНалоги(Объект,ТабНалоговНаПокупку);
Пока Истина Цикл
ФР.FNDiscountOperation();
Рез = CheckMistakeFR(DescMistake,Объект);//ОбработкаОшибок(НомерЛУ, Истина);
Если Рез > 0 Тогда
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
ИначеЕсли Рез = 0 Тогда
Результат = мНетОшибки;
Прервать;
ИначеЕсли Рез = -1 Тогда
//"Аннулирование чека ФР.");
ОтменитьЧек(Объект);
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
КонецЕсли;
КонецЦикла;
Иначе
ФР.Password = Объект.Параметры.ПарольАдминистратора;
ФР.Quantity = 1;
ФР.Price = Абс(СуммаПозиции);
ФР.Department = Секция;
ФР.StringForPrinting = "";
Если Объект.Параметры.ЗаписьКопииЧека И (Налоги <> Неопределено) Тогда
Для Каждого СтрНалог Из Налоги Цикл
НовСтр = ТаблицаНалогов.Добавить();
НовСтр.Ставка = СтрНалог.Ставка;
НовСтр.СуммаНалога = СтрНалог.СуммаНалога;
КонецЦикла;
КонецЕсли;
ЗаполнитьНалоги(Объект,Налоги);
Подитог = _ПолучитьПодитог(Объект,НомерЛУ);
Если Подитог = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Пока Истина Цикл
Если (ФР.CheckType=0) Тогда//Параметры[НомерЛУ]["ТипЧека"] = 0 Тогда
ФР.Sale();
Иначе
ФР.ReturnSale();
КонецЕсли;
Рез = CheckMistakeFR(DescMistake,Объект);//ОбработкаОшибок(НомерЛУ, Истина, Подитог);
Если Рез > 0 Тогда
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
ИначеЕсли Рез = 0 Тогда
Результат = мНетОшибки;
Прервать;
ИначеЕсли Рез = -1 Тогда
//"Аннулирование чека ФР.");
ОтменитьЧек(Объект);
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = DescMistake + ". Операция печати чека отменена.";
Возврат Результат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Объект.Параметры.ЗаписьКопииЧека Тогда
ТаблицаНалогов.Свернуть("Ставка", "СуммаНалога");
КонецЕсли;
Результат = мНетОшибки;
Возврат Результат;
Описание других функций приложено в обработке “ShtrihMFiscalPrinters_v2.epf”
- Настройка в Рознице
В меню “Сервис” – “Торговое оборудование”
Подключение и настройка торгового оборудования
Добавим в настройку в Фискальные регистраторы
Ниже настройки в случае подключения Yarus через COM-соединение:
Можно приступать к пробитию чеков.
Если делать соединение по Wi-Fi тогда timeout должен быть не менее 10000.