Управление нашей фирмой 1.6. Платформа 19.1264. Создал обработку с табличной частью на форме "СписокНоменклатуры" с колонками Номенклатура, Количество, Продукция. Как сканированием штрихкодов заполнять таблицу номенклатурой?
В форме есть реквизиты "ИспользоватьПодключаемоеОборудование"(булево) И "ПоддерживаемыеТипыПодключаемогоОборудования"(строка). Взял все процедуры и функции с документа перемещения касаемые штрих-кодов + ОбработкаОповещение. Буду так же рад ответу на вопрос: "Почему при сканировании первой отрабатывает процедура ПолучитьДанныеПоШтрихКодам, которая &НаСервереБезКонтекста?
---
Можно добавить поле "Штрихкод" и в него сканировать штрикод - а на событие "ПриИзменении" повесить механизм заполнения полей ТЧ.
---
```1c
    &НаКлиенте
    Процедура ШтрихкодПриИзменении(Элемент)

    Штрихкод = Элементы.Штрихкод.ТекстРедактирования;
    ТекШтрихкод = Новый Структура;
    ТекШтрихкод.Вставить("Штрихкод", Штрихкод);
    ТекШтрихкод.Вставить("Количество", 1);
    РазвернутьМассив(ТекШтрихкод);
    Штрихкод = ";
    Элементы.Штрихкод.ОбновитьТекстРедактирования();
    Штрихкод = ";

    ПодключитьОбработчикОжидания("ВернутьКурсорНаПолеВвода", 0.1, Истина);

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

    &НаКлиенте
    Процедура ВернутьКурсорНаПолеВвода()

    ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;

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

    &НаСервере
    Процедура РазвернутьМассив(ТекШтрихкод)

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

```1c
    //Сканер в режиме "разрыв клавиатуры"
    //Обработчик события окончания ввода текста ШК
    //Смена "ТекущийЭлемент" в этом событии приводит к краху платформы, поэтому, режим непрерывного чтения ШК, активируем асинхронным вызовом с минимально возможной задержкой
    &НаКлиенте
    Процедура СтрокаШКОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    //................
    ОбработатьСчитанныйШК(Текст);
    ПодключитьОбработчикОжидания("ПозиционированиеВводНовыйШК", 0.1, Истина);
    //................
    КонецПроцедуры

    //Активировать режим непрерывного считывания ШК, на мобильной платформе дополнительно необходимо вызовом "НачатьРедактированиеЭлемента"
    &НаКлиенте
    Процедура ПозиционированиеВводНовыйШК()
    // Вставить содержимое обработчика.
    СтрокаШК = ";
    ЭтаФорма.ТекущийЭлемент = Элементы.СтрокаШК;
    #Если МобильноеПриложениеКлиент Тогда
    ЭтаФорма.НачатьРедактированиеЭлемента();
    #КонецЕсли
    КонецПроцедуры

    &НаСервере
    Процедура ОбработатьСчитанныйШК(Текст)
    //................
    КонецПроцедуры
```
---
Там все просто - добавляете два реквизита на форму, при открытии дергаете менеджер оборудования на тему подключения сканера, при закрытии формы (тоже на клиенте) дергаете отключение.

Дальше к вам в обработку оповещения (не во внешнее событие) будут прилетать события подоткнутого таким образом оборудования. Но нужно убедиться, что в форме обработка оповещения приаттачена к соответствующему событию, а не просто скопипащена извне...
---
Вот почему-то такой способ у меня и не зашёл. База с веб размещением и отладка клиентские процедуры пропускает и я никак не мог отследить клиентский сканер. И кстати, чтобы пикнуть сканером приходилось звонить клиенту. Я скоро выложу своё решение
---
Я скоро выложу своё решениеИнтересно будет поглядеть на очередной костыль )())
---
Костыль - это изменение данных после их определения.
---
```1c
    &НаКлиенте
    Процедура ШтрихкодПриИзменении(Элемент)

    Штрихкод = Элементы.Штрихкод.ТекстРедактирования;
    ТекШтрихкод = Новый Структура;
    ТекШтрихкод.Вставить("Штрихкод", Штрихкод);
    ТекШтрихкод.Вставить("Количество", 1);
    РазвернутьМассив(ТекШтрихкод);
    Штрихкод = ";
    Элементы.Штрихкод.ОбновитьТекстРедактирования();
    Штрихкод = ";

    ПодключитьОбработчикОжидания("ВернутьКурсорНаПолеВвода", 0.1, Истина);

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

    &НаКлиенте
    Процедура ВернутьКурсорНаПолеВвода()

    ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;

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

    &НаСервере
    Процедура РазвернутьМассив(ТекШтрихкод)

    РегистрыСведений.ШтрихкодыНоменклатуры.ПреобразоватьВесовойШтрихкод(ТекШтрихкод);
    МассивШтрихкодов = Новый Массив;
    МассивШтрихкодов.Добавить(ТекШтрихкод);
    ДанныеПоШтрихКодам = РегистрыСведений.ШтрихкодыНоменклатуры.ПолучитьДанныеПоШтрихкодам(МассивШтрихкодов);
    ДанныеШтрихкода = ДанныеПоШтрихкодам[ТекШтрихкод.Штрихкод];
    Если НЕ ЗначениеЗаполнено(ДанныеШтрихкода) Тогда
    Сообщить("Такого штрих-кода не существует в базе!");
    Возврат;
    КонецЕсли;
    Ном = ДанныеШтрихкода.Номенклатура;
    Кол = ТекШтрихкод.Количество;
```