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