Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 ноя 2024, 07:05

Дублирование информационных карт УТ 10.3

Автор kuji, 10 дек 2019, 08:53

0 Пользователей и 1 гость просматривают эту тему.

kuji

Всем привет.
Сразу хочу извинится за свою пока еще не опытность в программировании.

Дело в том что у меня есть справочник информационные карты, в которые они заносились ридером магнитных карт и все было хорошо, на форме карты присваивался код карты, вид карты - магнитная, тип карты - дисконтная, так же есть реквизит мбк_КодКарты карты который содержит 10 символов тех же самых что и код магнитной ленты

Сейчас нужно сканировать карты, которые заводились ридером, сканером штрих кода. И при сканировании сканером сканер считывает 13 символов штрихкода, при этом распознает ее как новую карту и получается что одна и таже карта дублируется.

На данный момент в Обработках - ТОСервер в модуле объекта есть функция ОбработатьСобытиеСШК:

// Функция осуществляет обработку внешнего события от сканеров штрихкода.
//
// Параметры:
//  Обработка                      - <ВнешняяОбработкаОбъект.*>
//                                 - Обработка обслуживания торгового оборудования.
//
//  Объект                         - <*>
//                                 - Объект, идентифицирующий драйвер торгового оборудования.
//
//  Клиент                         - <*>
//                                 - Клиент, для которого осуществляется обработка события.
//
//  Событие                        - <Строка>
//                                 - Имя события.
//
//  Данные                         - <Строка>
//                                 - Данные события.
//
//  СШК                            - Идентификатор устройства.
//
// Возвращаемое значение:
//  <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
//

Функция ОбработатьСобытиеСШК(Обработка, Объект, Клиент, Событие, Данные, СШК)
   
   Результат = мНетОшибки;

   ШК        = Неопределено;
   ТипШК     = Неопределено;
   Результат = Обработка.ОбработатьСобытиеСШК(Объект,
                                              Событие,
                                              Данные,
                                              ШК,
                                              ТипШК);
   Если ЗначениеЗаполнено(Результат) Тогда
      Обработка.СобытиеОбработано(Объект);
      Возврат Результат;
   КонецЕсли;

   Если ПустаяСтрока(ШК) Тогда
      Обработка.СобытиеОбработано(Объект);
      Возврат Результат;
   КонецЕсли;

   Если НЕ ЗначениеЗаполнено(ТипШК) Тогда
      Если      РаботаСТорговымОборудованием.ТипШтрихкодаEAN8ТО(ШК) Тогда
         ТипШК = мEAN8;
      ИначеЕсли РаботаСТорговымОборудованием.ТипШтрихкодаEAN13ТО(ШК) Тогда
         ТипШК = мEAN13;
      ИначеЕсли РаботаСТорговымОборудованием.ТипШтрихкодаCODE39ТО(ШК) Тогда
         ТипШК = мCODE39;
      КонецЕсли;
   КонецЕсли;

   Запрос = Новый Запрос(
   "ВЫБРАТЬ ПЕРВЫЕ 1
   |    СпрСН.Ссылка КАК СерийныйНомер
   |ИЗ
   |    Справочник.СерийныеНомера КАК СпрСН
   |ГДЕ
   |    (ВЫРАЗИТЬ(СпрСН.Код КАК СТРОКА(" + Формат(СтрДлина(ШК), "ЧН=0; ЧГ=0") + "))) = &Код");
   Запрос.УстановитьПараметр("Код", ШК);
   РезультатЗапроса = Запрос.Выполнить();
   Если Не РезультатЗапроса.Пустой() Тогда
      РезультатЗапроса = РезультатЗапроса.Выбрать();
      РезультатЗапроса.Следующий();

      Ответ = Клиент.СШКСерийныйНомер(РезультатЗапроса.СерийныйНомер, СШК);
      Если Ответ Тогда
         Обработка.СобытиеОбработано(Объект);
         Возврат Результат;
      КонецЕсли;
   КонецЕсли;

   Если ЗначениеЗаполнено(мПрефиксВесовогоТовара)
       И ЗначениеЗаполнено(мДлинаКодаВесовогоТовара)
       И ТипШК = мEAN13
       И Лев(ШК, 2) = "2" + мПрефиксВесовогоТовара Тогда

      КодТовара        = Сред(ШК, 3, мДлинаКодаВесовогоТовара);
      КоличествоТовара = Сред(ШК, 3 + мДлинаКодаВесовогоТовара, 10 - мДлинаКодаВесовогоТовара);
      Запрос           = Новый Запрос(
      "ВЫБРАТЬ ПЕРВЫЕ 1
      |    РегКВТ.Номенклатура                         КАК Номенклатура,
      |    РегКВТ.Номенклатура.ЕдиницаХраненияОстатков КАК ЕдиницаИзмерения,
      |    РегКВТ.ХарактеристикаНоменклатуры           КАК ХарактеристикаНоменклатуры,
      |    " + КоличествоТовара + " / 1000             КАК Количество,
      |    РегКВТ.СерияНоменклатуры                    КАК СерияНоменклатуры,
      |    ВЫБОР
      |        КОГДА РегКВТ.Качество = &КачествоПустаяСсылка ТОГДА
      |            &КачествоНовый
      |        ИНАЧЕ
      |            РегКВТ.Качество
      |    КОНЕЦ                                       КАК Качество
      |ИЗ
      |    РегистрСведений.КодыВесовогоТовара          КАК РегКВТ
      |ГДЕ
      |    РегКВТ.Код = &Код");
      Запрос.УстановитьПараметр("КачествоПустаяСсылка", мКачествоПустаяСсылка);
      Запрос.УстановитьПараметр("КачествоНовый",        мКачествоНовый);
      Запрос.УстановитьПараметр("Код",                  Число(КодТовара));

      РезультатЗапроса = Запрос.Выполнить();
      Если Не РезультатЗапроса.Пустой() Тогда
         РезультатЗапроса = РезультатЗапроса.Выбрать();
         РезультатЗапроса.Следующий();

         Ответ = Клиент.СШКНоменклатура(РезультатЗапроса.Номенклатура,
                                        РезультатЗапроса.ХарактеристикаНоменклатуры,
                                        РезультатЗапроса.СерияНоменклатуры,
                                        РезультатЗапроса.Качество,
                                        РезультатЗапроса.ЕдиницаИзмерения,
                                        РезультатЗапроса.Количество,
                                        СШК);
         Если Ответ Тогда
            Обработка.СобытиеОбработано(Объект);
            Возврат Результат;
         КонецЕсли;
      КонецЕсли;
   КонецЕсли;

   Запрос = Новый Запрос(
   "ВЫБРАТЬ ПЕРВЫЕ 1
   |    РегШК.Владелец                   КАК Владелец,
   |    РегШК.ЕдиницаИзмерения           КАК ЕдиницаИзмерения,
   |    РегШК.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   |    РегШК.СерияНоменклатуры          КАК СерияНоменклатуры,
   |    РегШК.Качество                   КАК Качество
   |ИЗ
   |    РегистрСведений.Штрихкоды        КАК РегШК
   |ГДЕ
   |    РегШК.Штрихкод = &Штрихкод");
   Запрос.УстановитьПараметр("Штрихкод", ШК);
   РезультатЗапроса = Запрос.Выполнить();
   
   // Старт
   
   КодКарты = ВРег(Объект.Драйвер.Данные);
   
   Запрос = Новый Запрос(
   "ВЫБРАТЬ
   |   СпрКарты.Ссылка КАК Карта,
   |   СпрКарты.мбк_КодКарты
   |ИЗ
   |   Справочник.ИнформационныеКарты КАК СпрКарты
   |ГДЕ
   |   СпрКарты.ВидКарты = &ВидКарты
   |   И СпрКарты.КодКарты = &КодКарты");
   Запрос.УстановитьПараметр("ВидКарты", мМагнитнаяКарта);
   Запрос.УстановитьПараметр("КодКарты", КодКарты);
   
      ШтрихКодБезНулей = УправлениеРозничнойТорговлей.УдалитьНулиСлева(ШК);
      Попытка   
         ЧисловойКод = Число(Лев(ШтрихКодБезНулей,10));
      Исключение
         ЧисловойКод = 0;
      КонецПопытки;
   
   мбк_КодКарты = Формат((ЧисловойКод), "ЧГ=0");
   
   РезультатЗапроса = Запрос.Выполнить();
      Если РезультатЗапроса.Пустой() Тогда
         РезультатЗапроса = РезультатЗапроса.Выгрузить();   
         Сообщить("Результат:" + " " + мбк_КодКарты);
         
         ЗапросПоКартам = Новый Запрос;
         ЗапросПоКартам.Текст =
            "ВЫБРАТЬ
            |   ИнформационныеКарты.Ссылка,
            |   ИнформационныеКарты.мбк_КодКарты
            |ИЗ
            |   Справочник.ИнформационныеКарты КАК ИнформационныеКарты
            |ГДЕ
            |   ИнформационныеКарты.мбк_КодКарты = &КодКарты";

            ЗапросПоКартам.УстановитьПараметр("КодКарты", мбк_КодКарты);
         
         РезультатЗапросаПоКартам = ЗапросПоКартам.Выполнить();   
         ВыборкаДетальныеЗаписиПоКартам = РезультатЗапросаПоКартам.Выбрать();
         
         Если ВыборкаДетальныеЗаписиПоКартам.Следующий() Тогда
            Ответ = Клиент.СШКИнформационнаяКарта(РезультатЗапросаПоКартам.Ссылка, СШК);
            Если Ответ Тогда
               Возврат Результат;
            КонецЕсли;
         КонецЕсли;
         
               
      КонецЕсли;
   
   // Финиш

   
   Если Не РезультатЗапроса.Пустой() Тогда
      РезультатЗапроса = РезультатЗапроса.Выбрать();
      РезультатЗапроса.Следующий();
      Если ТипЗнч(РезультатЗапроса.Владелец) = Тип("СправочникСсылка.ИнформационныеКарты") Тогда
         
         
         Если ЗначениеЗаполнено(мбк_ОбщегоНазначения.мбк_ПолучитьДатуИзъятияКартыПоКоду(ШК)) Тогда
            
            Обработка.СобытиеОбработано(Объект);
            Возврат Результат;
         
         КонецЕсли;
         
         
         Ответ = Клиент.СШКИнформационнаяКарта(РезультатЗапроса.Владелец, СШК);
         Если Ответ Тогда
            Обработка.СобытиеОбработано(Объект);
            Возврат Результат;
         КонецЕсли;
      Иначе // Если ТипЗнч(РезультатЗапроса.Владелец) = Тип("СправочникСсылка.Номенклатура")
         Ответ = Клиент.СШКНоменклатура(РезультатЗапроса.Владелец,
                                        РезультатЗапроса.ХарактеристикаНоменклатуры,
                                        РезультатЗапроса.СерияНоменклатуры,
                                        РезультатЗапроса.Качество,
                                        РезультатЗапроса.ЕдиницаИзмерения,
                                        1,
                                        СШК);
         Если Ответ Тогда
            Обработка.СобытиеОбработано(Объект);
            Возврат Результат;
         КонецЕсли;
      КонецЕсли;
   КонецЕсли;

   Ответ = Клиент.СШКНеизвестныйКод(ШК, ТипШК, СШК);
   Если Ответ Тогда
      Обработка.СобытиеОбработано(Объект);
      Возврат Результат;
   КонецЕсли;

   Результат = мОшибкаНеизвестныйШтрихкод;
   Клиент.СШКОшибка(Результат, ШК, ТипШК, СШК);
   Обработка.СобытиеОбработано(Объект);

   Возврат Результат;

КонецФункции // ОбработатьСобытиеСШК()


И есть функция ОбработатьСобытиеСМК:

// Функция осуществляет обработку внешнего события от устройств для считывания
// магнитных карт.
//
// Параметры:
//  Обработка                      - <ВнешняяОбработкаОбъект.*>
//                                 - Обработка обслуживания торгового оборудования.
//
//  Объект                         - <*>
//                                 - Объект, идентифицирующий драйвер торгового оборудования.
//
//  Клиент                         - <*>
//                                 - Клиент, для которого осуществляется обработка события.
//
//  Событие                        - <Строка>
//                                 - Имя события.
//
//  Данные                         - <Строка>
//                                 - Данные события.
//
//  СМК                            - Идентификатор устройства.
//
// Возвращаемое значение:
//  <ПеречислениеСсылка.ТООшибки*> - Результат работы функции.
//
Функция ОбработатьСобытиеСМК(Обработка, Объект, Клиент, Событие, Данные, СМК)

   Результат = мНетОшибки;

   
   //КодКарты  = Неопределено;
   //Результат = Обработка.ОбработатьСобытиеСМК(Объект,
   //                              Событие,
   //                              Данные,
   //                              КодКарты);
   Попытка
      
      Объект.Драйвер.НомерТекущегоУстройства = Объект.ИДУстройства;
      Объект.Драйвер.ПосылкаДанных  = 0;
      Объект.Драйвер.НомерСообщения = Число(Данные);
      КодКарты                      = ВРег(Объект.Драйвер.Данные);
      
      //Если Лев(КодКарты,8)= "%Z708337" Тогда  // карты ликард
      //   
      //   КодКарты  =  Сред(КодКарты,23,10);
      ПозицияМаркераКартЛикард = Найти(КодКарты, "Z708337");
      Если ПозицияМаркераКартЛикард>0 Тогда  // карты ликард
         
         КодКарты  =  Сред(КодКарты,ПозицияМаркераКартЛикард+21,10);
      
      
      Иначе
         
         НачалоКодаКарты = Найти(КодКарты,";")+1;
         КодКарты  = Прав(КодКарты,СтрДлина(КодКарты)+1-НачалоКодаКарты);
         КодКарты = СтрЗаменить(КодКарты,"?","");
         
      КонецЕсли;
      
   Исключение
      
      Результат = мОшибкаНеизвестно;
      
   КонецПопытки;
   
   
   Если ЗначениеЗаполнено(мбк_ОбщегоНазначения.мбк_ПолучитьДатуИзъятияКартыПоКоду(КодКарты)) Тогда
      
      Обработка.СобытиеОбработано(Объект);
      Возврат Результат;
      
   КонецЕсли;
   
   Если Не ЗначениеЗаполнено(КодКарты) Тогда
   
      Обработка.СобытиеОбработано(Объект);
      Возврат мОшибкаНеизвестно;
   
   КонецЕсли;
   
   
   
   Если ЗначениеЗаполнено(Результат) Тогда  // по пробуем тогда вызвать стандартную обработку ...
      
      КодКарты  = Неопределено;
      Результат = Обработка.ОбработатьСобытиеСМК(Объект,
      Событие,
      Данные,
      КодКарты);
      
      Если ЗначениеЗаполнено(Результат) Тогда
         
         Возврат Результат;
         
      КонецЕсли;                
      
   КонецЕсли;
   
   
   
   Запрос = Новый Запрос(
   "ВЫБРАТЬ ПЕРВЫЕ 1
   |    СпрКарты.Ссылка КАК Карта
   |ИЗ
   |    Справочник.ИнформационныеКарты КАК СпрКарты
   |ГДЕ
   |    СпрКарты.ВидКарты   = &ВидКарты
   |    И СпрКарты.КодКарты = &КодКарты");
   Запрос.УстановитьПараметр("ВидКарты", мМагнитнаяКарта);
   Запрос.УстановитьПараметр("КодКарты", КодКарты);

   РезультатЗапроса = Запрос.Выполнить();
   Если Не РезультатЗапроса.Пустой() Тогда
      РезультатЗапроса = РезультатЗапроса.Выгрузить()[0];
      Ответ            = Клиент.СМКИнформационнаяКарта(РезультатЗапроса.Карта, СМК);
      Если Ответ Тогда
         Обработка.СобытиеОбработано(Объект);
         Возврат Результат;
      КонецЕсли;
   КонецЕсли;

   Ответ = Клиент.СМКНеизвестныйКод(КодКарты, СМК);
   Если Ответ Тогда
      Обработка.СобытиеОбработано(Объект);
      Возврат Результат;
   КонецЕсли;

   Результат = мОшибкаНеизвестнаяКарта;
   Клиент.СМКОшибка(Результат, КодКарты, СМК);
   Обработка.СобытиеОбработано(Объект);
   Возврат Результат;

КонецФункции // ОбработатьСобытиеСМК()



В этом куске кода:
ШтрихКодБезНулей = УправлениеРозничнойТорговлей.УдалитьНулиСлева(ШК);
      Попытка   
         ЧисловойКод = Число(Лев(ШтрихКодБезНулей,10));
      Исключение
         ЧисловойКод = 0;
      КонецПопытки;

У получаемого штрихкода убираются все нули слева и остается только 10 значный код который совпадает с кодом на магнитной ленте карты и кодом который записывается в реквизит мбк_КодКарты. мне нужно сделать проверку по этому реквизиту, как я понимаю, чтобы при считывании штрих кода была проверка по 10 значному коду, и если он находится в справочнике то выводить существующую карту.
Если нет регистрировать новую.

вот тут: Сообщить("Результат:" + " " + мбк_КодКарты);
при сканировании штрихкода он выводит 10 символьный код который соотвествует коду магнитной ленты, пока не могу понять как дальше сделать проверку

За любой совет буду очень благодарен!

wise

(0) Запрос = Новый Запрос(
   "ВЫБРАТЬ ПЕРВЫЕ 1
   |    СпрКарты.Ссылка КАК Карта
   |ИЗ
   |    Справочник.ИнформационныеКарты КАК СпрКарты
   |ГДЕ
   |    СпрКарты.КодКарты = &КодКарты");

   Запрос.УстановитьПараметр("КодКарты", мбк_КодКарты);
Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

kuji

запрос поправил, но при проверке выдает ошибку
{Обработка.ТОСервер.МодульОбъекта(3534)}: Поле объекта не обнаружено (Владелец)
      Если ТипЗнч(РезультатЗапроса.Владелец) = Тип("СправочникСсылка.ИнформационныеКарты") Тогда

т.е. при проверке ушел на другое условие.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск