Имя: Пароль:
1C
1C 7.7
v7: Переход к следующей строке во внешнем событии
0 Mafiozaa
 
25.01.21
03:38
Приветствую, ткните носом где у меня ошибка, ибо я не понимаю в чем затык, вообщем
У меня в табличной части находится 2 колонки, номенклатура и кодмаркировки.
Номенклатура заполняется путем выгрузки табличнойчасти
При сканировании товара он должен позиционироваться на нужном товаре И проверять на заполненность колонку "кодмаркировки" и если заполнено переходить ниже

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

При этом коде, все выполняется корректно но лишь до 2ой позиции, тоесть я пикаю товар, пикаю кодмаркировки, перешло ниже, пикаю еще раз, перешло ниже, потом пикаю и все замерло, в отладчике поймать не смог, условия все выполняются
1 Mafiozaa
 
25.01.21
04:20
Один косяк нашел, устранил, при каждом пике стр = 0, поменял на штатное НомерСтроки
2 Mafiozaa
 
25.01.21
04:20
Теперь одну позицию пикаю, все условия проходят, а вторую позицию пикаю, не проходит условие
Если ТЗШКоды.НайтиЗначение(ВремТовар, стр, "Номенклатура") = 1 Тогда;
                АктивизироватьСтроку(стр);
КонецЕсли;
3 Mafiozaa
 
25.01.21
04:24
ТЗШкоды.НайтиЗначение(ВремТовар, НомерСтроки, "Номенклатура") - Возвращает 0, хотя товар есть в колонке "Номенклатура"
4 Cthulhu
 
25.01.21
04:33
(3): какой наф НомерСтроки???
5 Cthulhu
 
25.01.21
04:34
в отладчике ТЗШкоды.НайтиЗначение(ВремТовар, , "Номенклатура") что дает?
6 Mafiozaa
 
25.01.21
04:34
(4) НомерСтроки
Синтаксис:
НомерСтроки
Назначение:
Доступ к номеру строки многострочной части документа.
Замечание:
Атрибут имеет смысл только при выбранной строке.
Подробнее см. в документации, глава 'Работа с Документами'
7 Mafiozaa
 
25.01.21
04:34
(5) На одну позицию ворачивает 1, на другую позицию 0
8 Mafiozaa
 
25.01.21
04:35
При всем при том, что обе находятся в колонке номенклатура
9 Mafiozaa
 
25.01.21
04:38
Тоесть 2 позиции в колонке номенклатура, одну ищет, другую нет
10 Cthulhu
 
25.01.21
04:39
значит нету. тип не совпадает (того что ищешь и того что там есть)
11 Mafiozaa
 
25.01.21
04:40
ТЗШкоды.НайтиЗначение(ВремТовар, , "Номенклатура") отладчик 1 вернул
12 Mafiozaa
 
25.01.21
04:40
(11) Без номерастроки
13 Cthulhu
 
25.01.21
04:42
(11),(12): блин. еще раз. какой нафиг номерстроки??? там должнно быть тстр, которое на момент поиска равно нулю - тогда при успешном поиске в тстр будет искомй номер строки.
читать документацию - срочно!
(по НайтиЗначение в частности)
14 Mafiozaa
 
25.01.21
04:42
(12) Но теперь нет привязки к строке, и пикая любую позицию переходит ниже
15 Cthulhu
 
25.01.21
04:43
если в этом параметре (номер строки) задать ненулевое значение - то поиск будет выполться только(!) в указанной строке.
16 Mafiozaa
 
25.01.21
04:44
(15) С стр, максимум 2 раза вниз уходит,и все
17 Mafiozaa
 
25.01.21
04:45
(16) Перем Стр;
     ПриОткрытии Стр = 0
     ОбработкаВнешСобытия
     Если ТЗШКоды.НайтиЗначение(ВремТовар, Стр , "Номенклатура") = 1 Тогда;
     Находит, но всего 2 раза вниз могу уйти и привет котенку
18 Cthulhu
 
25.01.21
04:47
(16): как напрограммировано - так и делает. при этом находит то что есть (вопреки вашим утверждениям).
программируйте не хрензнаетчто а то что надо - и будет вам щястье.
19 Cthulhu
 
25.01.21
04:48
и - научитесь разговаривать не на птичьем языке. а то по вашим объяснениям - только вам самому понятно что вы имеете ввиду и что надо
20 Mafiozaa
 
25.01.21
04:48
(18) Я понимаю что как ему указано так он и делает, но в чем же я неправильно ему указываю
21 Cthulhu
 
25.01.21
04:49
(20): да хрен его знает что вам надо...
22 Mafiozaa
 
25.01.21
04:50
(19) Логика какая, я пикаю штрихкод товара (EAN - 13) он позиционируется на товаре, пикаю код маркировки, он заносит в соседнюю колонку.
Следом я пикаю опять EAN13 он позиционируется на след строке
23 Cthulhu
 
25.01.21
04:51
и - да, главное.
если вы только начинаете - не надо ковыряться в 7-ке. надо идти ковыряться в 8-ку.
оставьте семерку старым пердунам вроде меня. она (7-ка) все равно после 2037-го года перестанет работать (не верите - поставьте системную дату на 2038 и попробуйте запустить 7-ку)))
24 Cthulhu
 
25.01.21
04:53
(22) а в тз точно ли все товары есть с теми еан-ами что вы пропикиваете?
25 Mafiozaa
 
25.01.21
04:54
(23) В ТЗ или табличной части? В табличной части точно, а тз щас проверю
26 Cthulhu
 
25.01.21
04:55
ну если у вас ТЗШКоды отличается от таб.части - то вообще нифига не должно работать...
27 Cthulhu
 
25.01.21
04:55
т.к. ищете в ТЗШКоды - а значение реквизита устанавливаете в таб.части
28 Mafiozaa
 
25.01.21
04:57
(24) А как оно может ТЗШкоды быть различным, если я в нее выгружаю табличную часть
29 Mafiozaa
 
25.01.21
05:00
(27)
ТЗШкоды.НайтиЗначение(ВремТовар, , "Номенклатура") = 1
ТЗШкоды.Номенклатура = Супер-клей Момент для Обуви на блистер карте 3гр. 12шт. [12;!]
ТЗШкоды.КодТовара = "4600611312194"
Данные = "4600611312194"

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

КонецПроцедуры // ОбработкаВнешнегоСобытия()


Вот такой код работает, более менее правильно
31 Cthulhu
 
25.01.21
05:03
(30) то за говнокод?
Если ТЗШКоды.НайтиЗначение(ВремТовар, НомерСтроки , "Номенклатура") = 1 Тогда
выполнится ТОЛЬКО ели раньше была активизирована строка таб.части, в которой стоит тот товар, который только что пропикали. хрень какая-то вместо поиска.
но если вас устраивает - то вперед.
удачи.
32 Mafiozaa
 
25.01.21
05:04
Не это фигня какая то, не то пальто
33 Mafiozaa
 
25.01.21
05:05
(31) А разве он активизирует строку не при условии что находит это значение в ТЗШкоды?
34 Cthulhu
 
25.01.21
05:05
(31): и даже не так, а ещё кривее. только если в той же (по номеру) строке, которая активна в таб.части, та же самая номенклатура, что в тз. если таб.часть и тз синхронные - то это уловие будет выполняться всегда. если не синхронны - то не будет выполняться никогда.
35 Cthulhu
 
25.01.21
05:06
(33): еслинаходит в строке(!) тз с тем же номером. что активна в таб.части.
36 Mafiozaa
 
25.01.21
05:07
(34) Хорошо, как мне нужно это все переделать?
37 Cthulhu
 
25.01.21
05:08
(36) за вас сделать работу?
потому что все подсказки уже вроде дали. и то именно неясно - не понятно.
38 Mafiozaa
 
25.01.21
05:10
(37) Нет, за меня делать ничего не нужно, спасибо за отклик
39 Bigbro
 
25.01.21
05:10
Если ТЗШКоды.НайтиЗначение(ВремТовар, НомерСтроки , "Номенклатура") = 1 Тогда;
это надо убрать, вторую часть оставить, но стр =0 добавить, не вижу где она обнуляется.
40 Mafiozaa
 
25.01.21
05:13
(39) Так она тогда при каждом пике будет обнулятся
41 Mafiozaa
 
25.01.21
05:18
(39) Ну, дальше второй позиции не ухожу
42 hhhh
 
25.01.21
05:19
(40) тебе нужно перед каждым пиком обнулять: стр = 0. Сначала это было, а потом ты выкинул.
43 Mafiozaa
 
25.01.21
05:21
(42) Я вернул, обнуляю каждый пиком стр, и дальше второй строки не ухожу
44 Mafiozaa
 
25.01.21
05:23
(43) Но на другую позицию прыгает, и так же не более двух строк вниз
45 Mafiozaa
 
25.01.21
05:27
(42) Нашел строку -> Активизировал -> КодМаркировки заполнен -> Активизировал +1 и все, а дальше ничего
46 Bigbro
 
25.01.21
05:31
(43) тебе и надо обнулять на каждом.
у тебя событие случилось - ты по новой ищешь код
если не находишь дальше 2й строки - может у тебя в данных ерунда.
попробуй впереди этих строк 1-2 которые находятся вставить другие строки.
47 Mafiozaa
 
25.01.21
05:35
(46) Ну данные то одни и те же, если находит первую строку, вторую строку, почему не находит 7,10?
48 Mafiozaa
 
25.01.21
05:38
49 Mafiozaa
 
25.01.21
05:39
Это вот, дохожу до второй строки, дальше не иду, пикаю другую позицию прыгает на 12 строку, и дальше тоже мрем
50 Bigbro
 
25.01.21
05:43
так у тебя одинаковая номенклатура, она у тебя и находится, что не так?
по какому принципу у тебя должна найтись не 1я строка?
51 Mafiozaa
 
25.01.21
05:44
(50) По заполненности кодамаркировки
52 Mafiozaa
 
25.01.21
05:44
(50) Смотрю вижу что в этой строке код маркировки заполнен, перейти к следущей
53 Cthulhu
 
25.01.21
05:45

// ВНИМАНИЕ!!! ПЕРЕД ТЕМ КАК НАЧИНАТЬ ПРОПИКИВАТЬ - надо в том месте, где создается
// ТЗШКоды, в самый конец уэе заполненной в соответствии с таб.частью тз - добавить
// вустую чтроку! тупо вот так: ТЗШКоды.НоваяСтрока();    // чтобы запоминать ошибку поиска ШК
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    // Процедура разбирает штрих-код, считанный сканером и заполняет строки накладной
    Перем Упаковка,ТекКоличество, Спецификация;
    Перем ВремТовар, ВремЕдиница, ВремКоличество, ВремЦена;
    Перем СтрокаВозврЦена;
    Если Событие = "BarCodeValue" Тогда
        Штрихкод = СокрЛП(Данные);
        Если глПолучитьТоварПоШтрихкоду(Штрихкод, ВремТовар, ВремЕдиница, ВремКоличество) = 1 Тогда
            тСтр = 0;
            Если ТЗШКоды.НайтиЗначение(ВремТовар, тСтр , "Номенклатура") = 1 Тогда;
                АктивизироватьСтроку(тСтр); Сообщить("по ШК("+Штрихкод+") товар """
                +ВремТовар+""" найден в строке "+НомерСтроки+" ...",".");
                ТЗШКоды.ПолучитьСтрокуПоНомеру(тСтр);
            Иначе
                АктивизироватьСтроку(тСтр); Сообщить("по ШК("+Штрихкод+") товар """
                +ВремТовар+""" НЕ найден документе!","!!!");
                ТЗШКоды.ПолучитьСтрокуПоНомеру(ТЗШКоды.КоличествоСтрок());
            КонецЕсли;
        ИначеЕсли ТЗШКоды.НомерСтроки<ТЗШКоды.КоличествоСтрок() Тогда
            Сообщить(СимволТабуляции+"... и в этой строке "+?(КодМаркировки
            =0,"устоновлен Код маркировки ","Код маркировки "+КодМаркировки+" заменен на ")+Штрихкод,"");
            КодМаркировки = Штрихкод;
        Иначе
            Сообщить(СимволТабуляции+"(непонятно куда всунуть Код маркировки "+Штрихкод+"...","!");
        КонецЕсли;
        глСканерПосылкаДанных(1);
    Иначе
        глОбработкаВнешнегоСобытия(Источник, Событие, Данные);
    КонецЕсли;
КонецПроцедуры// ОбработкаВнешнегоСобытия()
54 Mafiozaa
 
25.01.21
05:49
(53) Красавчик конечно, спасибо, но если дублей небыло бы, было бы сказочно
55 hhhh
 
25.01.21
05:55
(54) так тебе нужно просто сформировать список дублей, а потом спокойно их в цикле их обработать. Нахрена тут найти каждый раз?
56 Cthulhu
 
25.01.21
06:15
(54) совсем ленивый?
        ИначеЕсли ТЗШКоды.НомерСтроки<ТЗШКоды.КоличествоСтрок() Тогда
            тСтр=НомерСтроки; Пока Номерклатура=ТЗШКоды.Номерклатура Цикл
                Сообщить(СимволТабуляции+"в строке "+НомерСтроки+" для """+Номерклатура+""""
                +?(КодМаркировки=0,"устоновлен Код маркировки ","Код маркировки "+КодМаркировки
                +" заменен на ")+Штрихкод,""); КодМаркировки = Штрихкод; тСтр=тСтр+1;
                Если тСтр>КоличествоСтрок() Тогда Прервать Иначе АктивизироватьСтроку(тСтр) КонецЕсли;
            КонецЦикла;
            Сообщить("=== Всего по номенклатуре """+ТЗШКоды.Номенклатура+""" Код маркировки "
            +Штрихкод+" установлен в "+(тСтр-ТЗШКоды.НомерСтроки)+" строках.","i");
57 Bigbro
 
25.01.21
06:55
а когда закончатся строки в таблице с незаполненными Маркировками и придет событие с тем же штрихом - что делать?
58 Mafiozaa
 
25.01.21
07:01
(56) Не ленивый, а не соображающий, ну не идет у меня))
59 Mafiozaa
 
25.01.21
07:12
(56) Не выходит
60 Bigbro
 
25.01.21
07:18
у тебя в 0 почти рабочий код
только вместо вот этого

                Если ПустоеЗначение(КодМаркировки) = 0 Тогда
                    АктивизироватьСтроку(стр + 1);
                КонецЕсли;

сделай цикл по таблице начиная с стр и до конца таблицы.
в цикле проверяй ПустоеЗначение(КодМаркировки) чтобы найти очередную пустую строку
и дополнительно проверяй ВремТовар на равенство, чтобы не закончились пустые строки и ты не начал писать штрихи в другой товар.
и все.
61 Mafiozaa
 
25.01.21
07:47
(60) Пробую, отпишусь
62 Mafiozaa
 
25.01.21
08:10
(60) По пустой строке разобрался, но если пикаю другой товар, то переходит ниже, а не позиционнируется на пикнутой позиции
63 Bigbro
 
25.01.21
08:19
ну значит снова где то накуролесил)
отладчик в зубы и вперед.
задача то простая.
64 Mafiozaa
 
25.01.21
08:23
(63) Согласен, буду лазить, все равно спасибо))