|
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) "Т.е. фактически тебе и нужно всегда работать сразу с усеченным штихкодом, как это делают типовые процедуры."
- ну тут зависит от того как в ТЗ типизирована колонка с типом "Строка", если типизирована с указанием длины - тогда искать надо с добавлением пробелов в хвост искомой строки, если типизирована без указания длины - то с обрубкой пробелов в искомой строке |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |