Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Найти значение в ТЗ

v7: Найти значение в ТЗ
Я
   Mafiozaa
 
10.06.21 - 04:03
Приветствую, неудобно вопрошать, но я встал колом, суть в чем, при пике кода маркировки, смотреть есть ли в тз уже этот код, если нет то записывать, если да то выдавать предупреждение(тратата)
Есть вот такой код
Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
    ИтогТЗ.НоваяСтрока();
    ИтогТЗ.КодМаркировки = Штрихкод;
    КодМаркировки = Штрихкод;
    Маркер = СокрЛП(Штрихкод);    
Иначе
    Предупреждение("Данный код маркировки, уже был проверен, просканируйте следующий код маркировки");
КонецЕсли;

Ошибка в чем, после первого скана, он благородно попадает в ИтогТЗ, и в реквизит табличной части КодМаркировки, следовательно следующий пик этого же кода должен выбивать предупреждение, но второй пик проходит так же благородно, а вот третий выбивает предупреждение, через ИтогТЗ.ВыбратьСтроку() Вижу что два одиннаковых значения находятся в тзшке
   ДенисЧ
 
1 - 10.06.21 - 04:16
Для начала
//

стр = 0;//!!

Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
//
   Mafiozaa
 
2 - 10.06.21 - 04:23
(1) стр = 0 выше по коду присутствует
   Sserj
 
3 - 10.06.21 - 04:28
(2) 1. "..выше по коду присутствует.." - на сколько выше. Он точно обнуляется именно перед следующим сканированием?
2. Предупреждение("Данный код маркировки, уже был проверен, просканируйте следующий код маркировки") - никто не будет читать такие портянки текста, они только раздражают.
   Mafiozaa
 
4 - 10.06.21 - 04:37
(3) 1. В начале обработчика внешнего события, тобишь при каждом пике нулит.
2. Это самая наименьшая из проблем)))
   Mafiozaa
 
5 - 10.06.21 - 04:38
(3) Не исключаю ошибки по всей процедуре, но все работает так как должно работать

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    // Процедура разбирает штрих-код, считанный сканером

    // и заполняет строки накладной

    Перем Упаковка,ТекКоличество, Спецификация;
    Перем ВремТовар, ВремЕдиница, ВремКоличество, ВремЦена;
    
    Перем СтрокаВозврЦена;
    Если Событие = "BarCodeValue" Тогда
        Штрихкод = Данные;
        стр = 0;
        Если глПолучитьТоварПоШтрихкоду(Штрихкод, ВремТовар, ВремЕдиница, ВремКоличество) = 1 Тогда
            Если ТЗШКоды.НайтиЗначение(ВремТовар, стр, "Номенклатура") = 1 Тогда;
                АктивизироватьСтроку(стр);
                Для стр = 1 По КоличествоСтрок() Цикл
                ПолучитьСтрокуПоНомеру(стр);
                    Если (ПустоеЗначение(КодМаркировки) = 0) И (ВремТовар = Номенклатура) Тогда
                        ПолучитьСтрокуПоНомеру(стр + 1);
                        Если ВремТовар <> Номенклатура Тогда
                            
                        Иначе
                            АктивизироватьСтроку(стр + 1);
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        КонецЕсли;
        Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
            ИтогТЗ.НоваяСтрока();
            ИтогТЗ.КодМаркировки = Штрихкод;
            КодМаркировки = Штрихкод;
            Маркер = СокрЛП(Штрихкод);    
        Иначе
            Предупреждение("Данный код маркировки, уже был проверен, просканируйте следующий код маркировки");
        КонецЕсли;
        ИтогТЗ.ВыбратьСтроку();
        глСканерПосылкаДанных(1);
    Иначе
        глОбработкаВнешнегоСобытия(Источник, Событие, Данные);    
    КонецЕсли;

КонецПроцедуры// ОбработкаВнешнегоСобытия()
   Sserj
 
6 - 10.06.21 - 04:52
(5) Ну вот видишь:
Если ТЗШКоды.НайтиЗначение(ВремТовар, стр, "Номенклатура") = 1 Тогда

Вот тут если строка будет найдена то "стр" уже будет содержать номер этой строки. И тогда вот сюда:
Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
"стр" придет уже не нулевой и поэтому поиск по ИтогТЗ будет уже не по любой строке а только по той строке номер которой будет в "стр".
Мораль - всегда обнуляй переменные перед использованием.
стр = 0;
Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
   Mafiozaa
 
7 - 10.06.21 - 04:56
(6) Щас оттестю, отпишусь))
   Mafiozaa
 
8 - 10.06.21 - 04:58
(6) Добавил перед условием стр = 0, полет тот же
   Mafiozaa
 
9 - 10.06.21 - 05:06
Вношу поправку, такое случается есть, первая и вторая строка одиннаковая, но если я пикаю дубль дальше, то корректно дает предупреждение
   Mafiozaa
 
10 - 10.06.21 - 05:06
если*
   Sserj
 
11 - 10.06.21 - 05:12
(9) Ну тогда вероятно что-то происходит с переменной Штрихкод. К примеру у нее какие-то пробелы или еще какие непечатные символы появляются.
Попробуй искать и присваивать ее с усечением:
Штрихкод = СокрЛП(Штрихкод);
стр = 0;
Если ИтогТЗ.НайтиЗначение(Штрихкод, стр, "КодМаркировки") = 0 Тогда
...
   Mafiozaa
 
12 - 10.06.21 - 05:15
(11) Да действительно, разницы в видимости не обнаружил, но сработало
   Mafiozaa
 
13 - 10.06.21 - 05:17
(11) Спасибо тебе добрый человек))
   big
 
14 - 10.06.21 - 05:17
Позанудничаю...


ПустоеЗначение(КодМаркировки)   - лучше пользовать ПустаяСтрока(). ЕМНИП на именно пустую строку "" ПустоеЗначение не срабатывает.
И не увидел при НЕнахождении КодМаркировки вызова метода НоваяСтрока().
   big
 
15 - 10.06.21 - 05:18
(14)  И где глСканерПосылкаДанных(0) ?   В буфер сканера влетают новые данные, но они не обработаются.
   Sserj
 
16 - 10.06.21 - 05:19
(12) Просто добавь в начале:
Если Событие = "BarCodeValue" Тогда
  Штрихкод = СокрЛП(Данные);

Потому что если заглянуть в процедуру:
глПолучитьТоварПоШтрихкоду(Штрихкод, ВремТовар, ВремЕдиница, ВремКоличество)
Там первой строкой идет:
Штрихкод = СокрЛП(пШтрихкод);
Т.е. фактически тебе и нужно всегда работать сразу с усеченным штихкодом, как это делают типовые процедуры.
   Mafiozaa
 
17 - 10.06.21 - 05:33
(16) Так и сделал
   Злопчинский
 
18 - 10.06.21 - 13:43
(14) ересь детектед! все правильно срабатывает
ПустоеЗначение(РазделительСтрок) = 1
ПустоеЗначение(" ") = 1
ПустоеЗначение("") = 1
   Злопчинский
 
19 - 10.06.21 - 13:45
(16) "Т.е. фактически тебе и нужно всегда работать сразу с усеченным штихкодом, как это делают типовые процедуры."
- ну тут зависит от того как в ТЗ типизирована колонка с типом "Строка", если типизирована с указанием длины - тогда искать надо с добавлением пробелов в хвост искомой строки, если типизирована без указания длины - то с обрубкой пробелов в искомой строке

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.