Добрый день. Подскажите, как правильно организовать связь. Есть ВнешнееСобытие(Источник, Событие, Данные). Откуда я получаю данные штрихКода или серии. Но мне нужно сделать переход от штрихКода к Серии.
Делаю так.

```1c
    Процедура ВнешнееСобытие(Источник, Событие, Данные)

    //ПолучитьСерверТО().ОбработатьВнешнееСобытие(Источник, Событие, Данные, ЭтаФорма);

    Если Лев(Данные,2) = "№№" или Лев(Данные,2) = ("$$") Тогда
    //это табельный номер
    ПодборПоТабельномуНомеру(Данные);
    ИначеЕсли ТребоватьСерийныеНомера = Ложь Тогда //это товар
    ПодборНоменклатуры(Данные);
    ИначеЕсли ТребоватьСерийныеНомера = Истина Тогда
    СканированиеПоСерии(Данные);
    КонецЕсли;

    КонецПроцедуры
```

Потом перехожу в процедуру ПроставитьКоличествоПоНоменклатуре(НайденнаяНоменклатура)
 и уже в этой процедуре мне нужно сканировать Серии. Как правильно обратиться к процедуре сканирования? и потом получить данные именно Серии.
Делаю все в УТ 10.4 не управляемое.
Может я не так строю процесс, только учусь(
---
Добавляйте после строки

НайденныеСтроки = Товары.НайтиСтроки(Отбор);
ТекущаяСтрокаНоменклатуры=НайденныеСтроки[0];

и в процедуре сканированиеПоСерии :

//заполнение серий
СерийныеНомера.Добавить();
...

//подстановка количества серий:
ТекущаяСтрокаНоменклатуры.КоличествоФакт=ТекущаяСтрокаНоменклатуры.КоличествоФакт+1;
---
В этой же процедуре проверяй, что сканируешь: номенклатуру или серию и переходи к соответствующим дальнейшим процедурам. При сканировании у тебя всегда попадает в обработку внешнего события.
---
У меня две таблицы Товары и СерийныеНомера. Когда я перехожу в процедуру ПроставитьКоличествоПоНоменклатуре(НайденнаяНоменклатура) там при определенных условиях нужно вводить Серийный номер. Вот тут и начинается моя проблема, я пытаюсь обратиться к процедуре Процедура ВнешнееСобытие(Источник, Событие, Данные), но данные то передаю не те, и понимаю, что это неправильно.

```1c
    Пока Количество < КоличествоФакт Цикл
    Количество = Количество +1;
    ТребоватьСерийныеНомера = Истина;
    Подсказка = "Введите Серийный номер";

    ВнешнееСобытие("Сканер штрихкода", "ПолученШтрихкод", Данные);
    КонецЦикла;
```

Вот примерно мое условие.

Может это в новую процедуру какую записать?
---
Вводить серийный номер с клавиатуры? или сканером?
---
Сканером, с ручным вводом все работает.
---
Когда ты делаешь пик сканером, в 1с у тебя вызывается процедура ВнешнееСобытие(). Обращаться к ней в цикле не нужно. Просто обрабатываешь в ней пик и смотришь по данным, что у тебя отсканировалось: номенклатура или серия.
---
Написала Предупреждение("Введите Серийный номер" ,0, );
и пока не нажмешь нужное количество раз на ОК оно висит, но это не совсем правильно. Мне надо, чтобы система понимала, что надо подождать и ввести этот серийный номер.
---
Можете описать суть задачи. Что в каком порядке идет? Если я правильно понимаю, то сначала пикается номенклатура, а потом по какому то условие должна пикаться или не пикаться серия. Если так, то вариант с предупреждением в принципе нормальный.
---
сначала пикается по штрихКоду, находится нужная номенклатура, потом в зависимости от условий(определяется количество Серийных номеров) нужно отсканировать эти серийные номера Сканером и записать их в таблицу СерийныеНомера
---
Как вариант можно сделать отдельную миниформу для ввода серийных номеров и ее показывать для сканирования, а затем из нее по кнопке копировать в вашу таблицу
---
хотят на одной форме документа. И нужно сделать переход от одной таблицы к другой. Чтобы, когда нужно сканировать Серийный номер курсор стоял в строке ТЧ серийные номера
---
пользователя надо как то заставлять вводить эти серийные номера или просто сообщения ему достаточно "введите серийные номера"?
---
Достаточно сообщения в любом виде.
---
Тогда можно Сообщить("отсканируйте серийные номер") и активизировать строку таблицы с серийными номерами
---
а как актиизировать в обычном приложении?

```1c
    ЭлементыФормы.СерийныеНомера=ТекущийЭлемент;?
```
---
ЭлементыФормы.СерийныеНомера.ТекущаяСтрока=СерийныеНомера[0];
---
Поле объекта не обнаружено (ТекущаяСтрока)
---
Должно бы, если СерийныеНомера - это тч на обычной форме.
---
да ТЧ с реквизитами серийный и номенклатура. причем смотрю отладкой и серийные номера все видны. Нашла ошибку в наименовании. Но как сделать, чтобы попадал курсор в пустую строку, если данные были заполнены другой номенклатурой?
---
должно бы работать, не видя кода и формы сложно сказать в чем причина.
---
```1c
    ИначеЕсли НайденнаяНоменклатура.Родитель.ВводСерийногоНомераДляЗаказа И НЕ НайденнаяНоменклатура.Родитель.ВводКоличестваДляЗаказа Тогда
    Пока НайденныеСтроки[0].КоличествоСчет > НайденныеСтроки[0].КоличествоФакт Цикл
    //Подсказка = "Введите ШтрихКод";
    ТребоватьСерийныеНомера = Истина;
    Подсказка = "Введите Серийный Номер";
    ЭлементыФормы.СерийныйНомер.ТекущаяСтрока=СерийныеНомера[0];

    НайденныеСтроки[0].КоличествоФакт = НайденныеСтроки[0].КоличествоФакт + 1;
    КонецЦикла;
    ТребоватьСерийныеНомера = Ложь;
```

Вот часть кода одно из условий, второе немного похоже.
и как решить вопрос с индексом массивов, если ничего не вводилось "Индекс находится за границами массива".
---
```1c
    ЭлементыФормы.СерийныйНомер.ТекущаяСтрока=СерийныеНомера[0];
```

тут не верно, нужно так:

```1c
    ЭлементыФормы.СерийныеНомера.ТекущаяСтрока=СерийныеНомера[0];
```
---
ЭлементыФормы.СерийныеНомера так не находит текущую строку, т.к тип почему-то "флажок" . Может из-за этого и ошибка....
---
какой тип флажок? можно скриншот со свойствами табличной части СерийныеНомера
---
Это когда отсканировала несколько Серийных номеров
---
ну ок, ЭлементыФормы.СерийныйНомер.ТекущаяСтрока=СерийныеНомера[0]; - вот это должно работать

только не надо это делать в цикле
---
а как тогда понять сколько раз нужно ввести серийных номер? у меня есть условия, когда по одной номенклатуре нужно вводить например 3 серийника?
---
а зачем это?
---
так прописано в задании. И как решить вопрос с индексом массивов, если ничего не вводилось "Индекс находится за границами массива". Я хотела сделать
ЭлементыФормы.СерийныеНомера.ТекущаяСтрока = СерийныеНомера.Добавить();
но не работает

И когда по первой номенклатуре серийный заполнен не работает условие ЭлементыФормы.СерийныеНомера.ТекущаяСтрока = СерийныеНомера[0]
---
никак, если сканер настроен как оборудование на событие ВнешнееСобытие, то ловить серийники в ней, а лучше настроить как "клавиатуру", тогда можно использовать ВвестиСтроку() или ПоказатьВводСтроки() где угодно.
---
пробовала через ВвестиСтроку() работает только с ручным вводом, на сканер реагирует, но окошко с вводом строки весит, пора не отменишь.
если я правильно понимаю, настроен как клавиатура
---
в смысле висит не реагирует, данные в поле ввода заполняются? если да то надо нажать ОК или добавить суфикс на сканер #13 тогда после ввода со сканера окно закроется как вроде вы нажали "энтер"
---
не заполняются, заполняется только табличная часть
---
можно полный текст задания, а то такие подсказки - это как пальцем в небо, пытаемся угадать, что нужно.
---
в документе есть табличная часть(заполняется с заказа) и всю номенклатуру в ней нужно просканировать. Сначала сканирую штрих-код, по которому определяется есть ли номенклатура в базе, потом если в свойствах ее стоить СканироватьСерийный, то нужно отсканировать определенное количество этой номенклатуры(в таблице это число есть).

По коду:
У меня после сканирования штрих-кода находится номенклатура и заполняется ее количество (вторая колонка, т.е фактическое число отсканированной номенклатуры) один раз отсканировал Серийный +1 в колонке фактическое число и т.д пока фактическое не будет равно количеству номенклатуры в документе.
---
, (38) ИндексТЧ - это у вас как я понял будет НайденныеСтроки[0]. Просто надо объявить его в переменную в модуле в начале, чтобы при сканировании серии он по нему записывал в строку
---
```1c
    Процедура ВнешнееСобытие(Источник, Событие, Данные)

    Если Данные=номенклатура Тогда
    НайтиНоменклатуруВТЧ_ЗаполнитьКоличество(); //тут находим строку, заполняем количество и записываем в переменную индекс этой строки (ИндексТЧ)

    ИначеЕсли Данные=серия Тогда

    СерийныеНомера[ИндексТЧ].КоличествоФакт= СерийныеНомера[ИндексТЧ].КоличествоФакт+1;

    КонецПроцедуры
```
---
у меня выше написано, что в процедуре ВнешнееСобытие(Источник, Событие, Данные)
там я сначала проверяю, есть ли такая номенклатура. А уже только если она нашлась нужно записать ее серийный номер, в табличную часть СерийныеНомера, а в колонку КоличествоФакт=1
---
смотрите, у вас идет процесс сканирования, т.е. вы пикнули штрих-код, сработала процедура внешнеесобытие - вы проверили штрих-код, это оказалась номенклатура, вы ее нашли в таблице, все. Далее вам программа сообщает: надо сканировать серии. Вы снова делаете пик сканером - снова срабатывает процедура внешнеесобытие - вы уже обрабатываете серию: прибавляете количество факт и добавляете серийный номер. Т.е. писать какой то код про действия с сериями после нахождения номенклатуры не нужно, т.к. вы еще не пикнули эту серию.
---
спасибо большое. попробую переделать. Зря наверное начала так мудрить.
---
Пожалуйста, напишите, получилось или нет?
---
работает, если одна номенклатура в таблице. Что-то не получается связать с условием.
---
выложите код, посмотрю.
---
ВнешнееСобытие(Источник, Событие, Данные)
ИначеЕсли ТребоватьСерийныеНомера = Ложь Тогда //это товар
  НайденнаяНоменклатура = ПодборНоменклатуры(Данные);
  Номенклатура = НайденнаяНоменклатура;
  Отбор = Новый Структура;
  Отбор.Вставить("Номенклатура", НайденнаяНоменклатура);
  НайденныеСтроки = Товары.НайтиСтроки(Отбор);
  Если НайденнаяНоменклатура.Родитель.ВводСерийногоНомераДляЗаказа И НайденнаяНоменклатура.Родитель.ВводКоличестваДляЗаказа Тогда
  КоличествоФакт = 1;
  ВвестиЧисло(КоличествоФакт,"Введите число КоличествоФакт",10,0);
  НайденныеСтроки[0].КоличествоФакт = КоличествоФакт;

   ТребоватьСерийныеНомера = Истина;
   Сообщить("Введите серийный номер");

  ИначеЕсли НайденнаяНоменклатура.Родитель.ВводСерийногоНомераДляЗаказа И НЕ НайденнаяНоменклатура.Родитель.ВводКоличестваДляЗаказа Тогда
   НайденныеСтроки[0].КоличествоФакт = 1;

    ТребоватьСерийныеНомера = Истина;
    Сообщить("Введите серийный номер");

  ИначеЕсли НайденнаяНоменклатура = Неопределено Тогда

  КонецЕсли;

 ИначеЕсли ТребоватьСерийныеНомера = Истина Тогда

  СканированиеПоСерии(Данные);
 КонецЕсли;
---
Добавляйте после строки

НайденныеСтроки = Товары.НайтиСтроки(Отбор);
ТекущаяСтрокаНоменклатуры=НайденныеСтроки[0];

и в процедуре сканированиеПоСерии :

//заполнение серий
СерийныеНомера.Добавить();
...

//подстановка количества серий:
ТекущаяСтрокаНоменклатуры.КоличествоФакт=ТекущаяСтрокаНоменклатуры.КоличествоФакт+1;
---
после того как я отсканировала номенклатуру выставилось условие Ввод сЕрийного номера и потом после ввода серийника данные номенклатуры пропадают.
пробую написать процедуру ПроверкаПозиций() после кажого пика сравнивает количество серийников с количеством Факт в номенклатуре
---
дак сохраняй его в переменную, я же написал:

ТекущаяСтрокаНоменклатуры=НайденныеСтроки[0]; //ТекущаяСтрокаНоменклатуры - это переменная, объявленная вначале модуля
---
не совсем понимаю что эта переменная даст.
как можно распределить серийные номера по номенклатуре?Чтобы при записи нового было понятно к какой от относится ?
---
это переменная - для запоминания текущей номенклатуры, чтобы когда мы сканируем серию - мы знаем по какой номенклатуре сканируцем
---
разобралась, спасибо.
теперь заполняет все правильно. Осталось только сделать проверку на повторяющиеся серийные номера.
---
ну тут вроде не сложно при сканировании серии - проверять есть ли такой номер уже в таблице серий)
---
это мне уже посильно))
---
примерно такой код, но начинается проблема с данными. Само условие прописывала и в этой процедуре и в СканированиеПо Серии....но мне нужно правильно передать данные номенклатуры... сложно работать с разными табличными данными. Как определить, что ТЧ СерийныеНомера заполняется? и узнать количество строк?

При вводе серийного номера, данные обновляются и по ним будет уже другая номенклатура. Как и где все эти данные объединить?
---
тч серийные номера заполняется, когда вы делаете СерийныеНомера.Добавить();
количество строк: СерийныеНомера.Количество()
---
С проверкой количества факт = количество счет тут возможно будут трудности, но не должно быть очень сложно - проверять скорее всего перед сканом новой номенклатуры