|   |   | 
| 
 | v7: Найти значение в ТЗ | ☑ | ||
|---|---|---|---|---|
| 0
    
        Mafiozaa 10.06.21✎ 04:03 | 
        Приветствую, неудобно вопрошать, но я встал колом, суть в чем, при пике кода маркировки, смотреть есть ли в тз уже этот код, если нет то записывать, если да то выдавать предупреждение(тратата)
 Есть вот такой код Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда ИтогТЗ.НоваяСтрока(); ИтогТЗ.КодМаркировки = Штрихкод; КодМаркировки = Штрихкод; Маркер = СокрЛП(Штрихкод); Иначе Предупреждение("Данный код маркировки, уже был проверен, просканируйте следующий код маркировки"); КонецЕсли; Ошибка в чем, после первого скана, он благородно попадает в ИтогТЗ, и в реквизит табличной части КодМаркировки, следовательно следующий пик этого же кода должен выбивать предупреждение, но второй пик проходит так же благородно, а вот третий выбивает предупреждение, через ИтогТЗ.ВыбратьСтроку() Вижу что два одиннаковых значения находятся в тзшке | |||
| 1
    
        ДенисЧ 10.06.21✎ 04:16 | 
        Для начала
 // стр = 0; //!! Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда // | |||
| 2
    
        Mafiozaa 10.06.21✎ 04:23 | 
        (1) стр = 0 выше по коду присутствует     | |||
| 3
    
        Sserj 10.06.21✎ 04:28 | 
        (2) 1. "..выше по коду присутствует.." - на сколько выше. Он точно обнуляется именно перед следующим сканированием?
 2. Предупреждение("Данный код маркировки, уже был проверен, просканируйте следующий код маркировки") - никто не будет читать такие портянки текста, они только раздражают. | |||
| 4
    
        Mafiozaa 10.06.21✎ 04:37 | 
        (3) 1. В начале обработчика внешнего события, тобишь при каждом пике нулит.
 2. Это самая наименьшая из проблем))) | |||
| 5
    
        Mafiozaa 10.06.21✎ 04:38 | 
        (3) Не исключаю ошибки по всей процедуре, но все работает так как должно работать
 Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные) // Процедура разбирает штрих-код, считанный сканером // и заполняет строки накладной Перем Упаковка,ТекКоличество, Спецификация; Перем ВремТовар, ВремЕдиница, ВремКоличество, ВремЦена; Перем СтрокаВозврЦена; Если Событие = "BarCodeValue" Тогда Штрихкод = Данные; стр = 0; Если глПолучитьТоварПоШтрихкоду(Штрихкод, ВремТовар, ВремЕдиница, ВремКоличество) = 1 Тогда Если ТЗШКоды.НайтиЗначение(ВремТовар, стр, "Номенклатура") = 1 Тогда; АктивизироватьСтроку(стр); Для стр = 1 По КоличествоСтрок() Цикл ПолучитьСтрокуПоНомеру(стр); Если (ПустоеЗначение(КодМаркировки) = 0) И (ВремТовар = Номенклатура) Тогда ПолучитьСтрокуПоНомеру(стр + 1); Если ВремТовар <> Номенклатура Тогда Иначе АктивизироватьСтроку(стр + 1); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда ИтогТЗ.НоваяСтрока(); ИтогТЗ.КодМаркировки = Штрихкод; КодМаркировки = Штрихкод; Маркер = СокрЛП(Штрихкод); Иначе Предупреждение("Данный код маркировки, уже был проверен, просканируйте следующий код маркировки"); КонецЕсли; ИтогТЗ.ВыбратьСтроку(); глСканерПосылкаДанных(1); Иначе глОбработкаВнешнегоСобытия(Источник, Событие, Данные); КонецЕсли; КонецПроцедуры // ОбработкаВнешнегоСобытия() | |||
| 6
    
        Sserj 10.06.21✎ 04:52 | 
        (5) Ну вот видишь:
 Если ТЗШКоды.НайтиЗначение(ВремТовар, стр, "Номенклатура") = 1 Тогда Вот тут если строка будет найдена то "стр" уже будет содержать номер этой строки. И тогда вот сюда: Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда "стр" придет уже не нулевой и поэтому поиск по ИтогТЗ будет уже не по любой строке а только по той строке номер которой будет в "стр". Мораль - всегда обнуляй переменные перед использованием. стр = 0; Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда | |||
| 7
    
        Mafiozaa 10.06.21✎ 04:56 | 
        (6) Щас оттестю, отпишусь))     | |||
| 8
    
        Mafiozaa 10.06.21✎ 04:58 | 
        (6) Добавил перед условием стр = 0, полет тот же     | |||
| 9
    
        Mafiozaa 10.06.21✎ 05:06 | 
        Вношу поправку, такое случается есть, первая и вторая строка одиннаковая, но если я пикаю дубль дальше, то корректно дает предупреждение     | |||
| 10
    
        Mafiozaa 10.06.21✎ 05:06 | 
        если*     | |||
| 11
    
        Sserj 10.06.21✎ 05:12 | 
        (9) Ну тогда вероятно что-то происходит с переменной Штрихкод. К примеру у нее какие-то пробелы или еще какие непечатные символы появляются.
 Попробуй искать и присваивать ее с усечением: Штрихкод = СокрЛП(Штрихкод); стр = 0; Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда ... | |||
| 12
    
        Mafiozaa 10.06.21✎ 05:15 | 
        (11) Да действительно, разницы в видимости не обнаружил, но сработало     | |||
| 13
    
        Mafiozaa 10.06.21✎ 05:17 | 
        (11) Спасибо тебе добрый человек))     | |||
| 14
    
        big 10.06.21✎ 05:17 | 
        Позанудничаю...
 ПустоеЗначение(КодМаркировки) - лучше пользовать ПустаяСтрока(). ЕМНИП на именно пустую строку "" ПустоеЗначение не срабатывает. И не увидел при НЕнахождении КодМаркировки вызова метода НоваяСтрока(). | |||
| 15
    
        big 10.06.21✎ 05:18 | 
        (14)  И где глСканерПосылкаДанных(0) ?   В буфер сканера влетают новые данные, но они не обработаются.     | |||
| 16
    
        Sserj 10.06.21✎ 05:19 | 
        (12) Просто добавь в начале:
 Если Событие = "BarCodeValue" Тогда Штрихкод = СокрЛП(Данные); Потому что если заглянуть в процедуру: глПолучитьТоварПоШтрихкоду(Штрихкод, ВремТовар, ВремЕдиница, ВремКоличество) Там первой строкой идет: Штрихкод = СокрЛП(пШтрихкод); Т.е. фактически тебе и нужно всегда работать сразу с усеченным штихкодом, как это делают типовые процедуры. | |||
| 17
    
        Mafiozaa 10.06.21✎ 05:33 | 
        (16) Так и сделал     | |||
| 18
    
        Злопчинский 10.06.21✎ 13:43 | 
        (14) ересь детектед! все правильно срабатывает
 ПустоеЗначение(РазделительСтрок) = 1 ПустоеЗначение(" ") = 1 ПустоеЗначение("") = 1 | |||
| 19
    
        Злопчинский 10.06.21✎ 13:45 | 
        (16) "Т.е. фактически тебе и нужно всегда работать сразу с усеченным штихкодом, как это делают типовые процедуры."
 - ну тут зависит от того как в ТЗ типизирована колонка с типом "Строка", если типизирована с указанием длины - тогда искать надо с добавлением пробелов в хвост искомой строки, если типизирована без указания длины - то с обрубкой пробелов в искомой строке | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |