Подключение сканера штрихкода к Бухгалтерии 3.0


Возникла потребность обеспечить идентификацию номенклатуры по штрихкоду. На складе уже было рабочее место с Бухгалтерией 3.0. Поиск по ключевой фразе «сканер ШК БП 3.0» выдал не так много результатов. На ИС была обнаружена статья от 2013 года, которая сейчас несколько устарела.
В 2024 году процесс подключения сканера штрихкода стал существенно проще.

Ссылка на статью //infostart.ru/public/203591/ (сейчас она несколько устарела).

В 2024 году процесс подключения сканера штрихкода стал существенно проще.

В разделе «Администрирование» есть пункт «Подключаемое оборудование» и в ней есть закладка «Сканеры штрихкода». Тут все просто. Нажимаем «Создать», выбираем тип оборудования «Сканеры штрихкоды» и драйвер. Например, «1С:Сканеры штрихкода (NativeApi)». Если драйвер еще не установлен будет выдано предложение сделать это сейчас и база сама зарегистрирует нужную компоненту.

Для проверки нажимаем (в этой же форме) «Настроить» и «Тест устройства». Сканер я предварительно перевел в режим virtual COM и установил драйвер виртуального COM порта. В окне теста сразу видно, что доступен порт COM3. После считывания штрихкода данные отображаются в окне. Значит, 1С получает событие от сканера.

Следующий шаг — описать, как база должна реагировать на событие сканирования штрихкода.

Коротко напомню как все устроено в типовых конфигурациях.

У форм документов нет обработчика события «Внешнее событие». Все реализовано через событие управляемого приложения.

Его обработчик получает все события, определяет от какого оборудования они пришли.

Передача управления обработчикам формы выполняется через механизм оповещения.

Реакция системы на штрихкод описывается уже в модуле формы в обработчике события ОбработкаОповещения.

Поиск по конфигурации не порадовал. «Из коробки» штрих код работает только в трех видах документов.

Поскольку конфигурация на поддержке изменения будем вносить через расширение.

Реализуем 2 сценария — привязка штрихкода к карточке номенклатуры и обработка считывания штрихкода для длокумента «Перемещение товаров».

Начнем с номенклатуры.

Чтобы форма элемента получала оповещения от драйвера подключаемого оборудования необходимо добавить обработчики событий ПриОткрытии и ПриЗакрытии (оба с вызовом После).

&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)

ТипыПО = Новый Массив();
ТипыПО.Добавить("СканерШтрихкода");

ОповещениеПриПодключении = Новый ОписаниеОповещения("ПодключениеОборудованияЗавершено", ЭтотОбъект);

МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу(ОповещениеПриПодключении, УникальныйИдентификатор, ТипыПО);

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

&НаКлиенте
Процедура ПодключениеОборудованияЗавершено(РезультатВыполнения, Параметры) Экспорт

Если Не РезультатВыполнения.Результат Тогда
ТекстСообщения = НСтр( "ru = 'При подключении оборудования произошла ошибка:""%ОписаниеОшибки%"".'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки);
Сообщить(ТекстСообщения);
Иначе
ТекстСообщения = НСтр("ru = 'Оборудование подключено.'" );
КонецЕсли;

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

&НаКлиенте
Процедура Расш1_ПриЗакрытииПосле(ЗавершениеРаботы)

ТипыПО = Новый Массив();
ТипыПО.Добавить("СканерШтрихкода");

ОповещениеПриОтключении = Новый ОписаниеОповещения("ОтключениеОборудованияЗавершено", ЭтотОбъект);

МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоТипу(ОповещениеПриОтключении, УникальныйИдентификатор, ТипыПО);

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

&НаКлиенте
Процедура ОтключениеОборудованияЗавершено(РезультатВыполнения, Параметры) Экспорт

Если Не РезультатВыполнения.Результат Тогда
ТекстСообщения = НСтр( "ru = 'При отключении оборудования произошла ошибка:""%ОписаниеОшибки%"".'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки);
Сообщить(ТекстСообщения);
Иначе
ТекстСообщения = НСтр("ru = 'Оборудование подключено.'" );
КонецЕсли;

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

Если код вызывает вопросы — напишите в комментарии — отвечу.

Далее создадим обработчик события ОбработкаОповещения (вызов также После).

&НаКлиенте
Процедура Расш1_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)

Если Источник = "ПодключаемоеОборудование" Тогда

Если ИмяСобытия = "ScanData" Тогда

Если Параметр[1] = Неопределено Тогда
ТекущийКод = Параметр[0];
Иначе
ТекущийКод = Параметр[1][1];
КонецЕсли;

Номенклатура = "";
Если ЕстьНоменклатураПоШтрихкоду(ТекущийКод, Номенклатура) Тогда
ТекстСообщения = НСтр("ru = 'Штрихкоду %Штрихкод% уже сопоставлена номенклатура %Номенклатура%'" );
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Штрихкод%" , ТекущийКод);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Номенклатура%" , Номенклатура);
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = ТекстСообщения;
СообщениеПользователю.Сообщить();
Иначе
ВопросСоздатьНоменклатуруЗавершение = Новый ОписаниеОповещения("ПривязатьШтрихкодКНоменклатуреПослеВопроса", ЭтаФорма, ТекущийКод);
ТекстСообщения = НСтр("ru = 'Привязать штрихкод %Штрихкод% к номенклатуре %Номенклатура%?'" );
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Штрихкод%" , ТекущийКод);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Номенклатура%" , Объект.Наименование);
ПоказатьВопрос(ВопросСоздатьНоменклатуруЗавершение, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет);
КонецЕсли;

КонецЕсли;

КонецЕсли;

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

&НаСервере
Функция ЕстьНоменклатураПоШтрихкоду(Штрихкод, Номенклатура)

Рез = Ложь;

ТаблицаНоменклатурыПоШтрихкоду = РегистрыСведений.ШтрихкодыНоменклатуры.НоменклатураПоШтрихкоду(Штрихкод);

Если ТаблицаНоменклатурыПоШтрихкоду.Количество() > 0 Тогда
Номенклатура = ТаблицаНоменклатурыПоШтрихкоду[0].Номенклатура;
Рез = Истина;
КонецЕсли;

Возврат Рез;

КонецФункции

&НаКлиенте
Процедура ПривязатьШтрихкодКНоменклатуреПослеВопроса(Результат, Параметры) Экспорт

Если Результат = КодВозвратаДиалога.Да Тогда
ПривязатьШтрихкодКНоменклатуре(Параметры);
КонецЕсли;

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

&НаСервере
Процедура ПривязатьШтрихкодКНоменклатуре(Штрихкод) Экспорт

НовыйШК = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
НовыйШК.Штрихкод = Штрихкод;
НовыйШК.Номенклатура = Объект.Ссылка;
НовыйШК.Записать();

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

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

Со справочником на этом все.

Переходим к документу.

Аналогично добавляем код для событий ПриОткрытии и ПриЗакрытии для подключения (и отключения) подписки на получение событий от подключаемого оборудования.

В обработчике ОбработкаОповещения размещаем код

&НаКлиенте
Процедура Расш1_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)

Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
Если ИмяСобытия = "ScanData" Тогда
Если Параметр[1] = Неопределено Тогда
ТекущийКод = Параметр[0];
Иначе
ТекущийКод = Параметр[1][1];
КонецЕсли;
ДобавитьПоШтрихкодуНаСервере(ТекущийКод);
КонецЕсли;
КонецЕсли;

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

Процедура ДобавитьПоШтрихкодуНаСервере выполняет поиск номенклатуры сопоставленной с штрихкодов. Если номенклатура не найдена выдает сообщение пользователю. Иначе — добавляет строку в документ. Добавление строки реализовано по аналогии с документом ПоступлениеТоваровУслуг.

&НаСервере
Функция ДобавитьПоШтрихкодуНаСервере(Штрихкод)
ТаблицаНоменклатурыПоШтрихкоду = РегистрыСведений.ШтрихкодыНоменклатуры.НоменклатураПоШтрихкоду(Штрихкод);

Если ТаблицаНоменклатурыПоШтрихкоду.Количество() = 1 Тогда
ДобавитьНоменклатуруНаСервере(ТаблицаНоменклатурыПоШтрихкоду[0].Номенклатура);
Иначе
ТекстСообщения = НСтр("ru = 'Штрихкоду %Штрихкод% не сопоставлена ни одна номенклатура'" );
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Штрихкод%" , Штрихкод);
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = ТекстСообщения;
СообщениеПользователю.Сообщить();
КонецЕсли;

КонецФункции

&НаСервере
Процедура ДобавитьНоменклатуруНаСервере(Номенклатура)

ПараметрыОтбора = Новый Структура("Номенклатура", Номенклатура);

мСтрок = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
Если мСтрок.Количество() = 0 Тогда

ТаблицаТовары = Новый ТаблицаЗначений;
ТаблицаТовары.Колонки.Добавить("Номенклатура");
ТаблицаТовары.Колонки.Добавить("Количество");
ТаблицаТовары.Колонки.Добавить("Цена");


СтрокаТаблицаТовары = ТаблицаТовары.Добавить();

СтрокаТаблицаТовары.Номенклатура = Номенклатура;
СтрокаТаблицаТовары.Количество = 1;
СтрокаТаблицаТовары.Цена = 0;

Значение = Новый Структура("АдресПодобраннойНоменклатурыВХранилище, КоличествоДобавленныхСтрок", ПоместитьВоВременноеХранилище(ТаблицаТовары, УникальныйИдентификатор));

ОбработкаВыбораПодборВставкаИзБуфераНаСервере(Значение, "Товары");

Иначе

СтрокаТовары = мСтрок[0];
СтрокаТовары.Количество = СтрокаТовары.Количество + 1;

КонецЕсли;

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

На этом всё.

Взаимодействие сканера с другими документами выполняется аналогичным образом.

19 Comments

  1. muskul

    Разве по умолчанию ШК в БП 3.0 не работает во всех местах в которых должен по логике?

    Reply
  2. Dem1urg

    (1) Я же специально сделал скриншот с результатом поиска текста ScanData.

    Работает в двух местах — поступление и розничная продажа.

    Можете сами проверить.

    Reply
  3. muskul

    (2)Проверил, действительно, логика и 1с теперь редко пересекаются.

    Reply
  4. k0pai22

    (3) Нельзя просто взять и оптимизировать БП для всех видов торговли. Может кануть в лету немалая часть продаж УТ. Сам когда писал ШК для реализации в БП 3.0 был в недоумении, потом понял.

    Reply
  5. kembrik

    Ничто так не печалит меня, как штрихкод в Измерениях

    Reply
  6. Dem1urg

    (5) Почему? Это ж по сути вспомогательный регистр.

    Reply
  7. kembrik

    (6) Потому что мы не можем хранить в таком случае одинаковый штрихкод у разной номенклатуры. А это сплошь и рядом. У производителя иной раз сменилась упаковка, состав и комплектация изделия, а штрихкод там один и тот же. И без самостоятельной принудительной маркировки это потом не разгрести. Речь понятно не только про бухгалтерию, скорее про УТ. Вот и приходится хранить в допреквизите и перепиливать процедуру поиска.

    Reply
  8. Rustig

    (7)

    У производителя иной раз сменилась упаковка, состав и комплектация изделия, а штрихкод там один и тот же.

    а как вам поможет допреквизит? и что за допреквизит вы добавляете?

    пока не понятно, как в ситуации Товар1+ШК1 и Товар2+ШК1 — однозначно идентифицировать по ШК1 нужный Товар?…даже без учета конфигурации, на пальцах алгоритм расскажите

    Reply
  9. Rustig

    (0) интересная тема. спасибо!

    Reply
  10. kembrik

    (8) 1. Штрихкод с коробки бьётся в допреквизит «Штрихкод производителя»

    2. У номенклатуры жесткая иерархия в зависимости от сезона поставки

    3. Периодически запускается регламентная обработка, которая сигнализирует, что у нескольких позиций одинаковый штрихкод у разных поставок, а собственный штрихкод ещё не присвоен

    4. Присваивается собственный штрихкод каждой из задвоившейся номенклатуры, если ещё нет, после визуального контроля, отличается ли состав, комплектация товара и т.д. Если не отличается то такой же, как у прошлой поставки, если отличается — то новый. Как то так

    Соответственно типовое «пиканье» учим искать и в регистре сведений номенклатуры и в допреквизитах, и отображать все варианты, а не единственное

    Reply
  11. Rustig

    (10)

    1. Штрихкод с коробки бьётся в допреквизит «Штрихкод производителя»

    этот ШК к новой номенклатуре привязывается или к имеющейся старой?

    по моему уже на этом этапе происходит визуальный контроль — отличается ли состав, комплектация товара и т.д

    (10)

    2. У номенклатуры жесткая иерархия в зависимости от сезона поставки

    иерархия в зависимости от срока поставки — не хочу вас судить, но, имхо, в целом это плохая идея, плохо решенная задача — это первое мое мнение не видя решения и причин…

    (10)

    Периодически запускается регламентная обработка, которая сигнализирует, что у нескольких позиций одинаковый штрихкод у разных поставок, а собственный штрихкод ещё не присвоен

    если в регистре сведений использовать только типовые измерения Товар + ШК, то регламентная процедура для разных позиций нормально отработает — и определит что у нескольких позиций одинаковый шк…

    Reply
  12. Rustig

    (10) в целом, непонятно все-таки за что вы критикуете «Штрихкод» в измерении…

    Reply
  13. kembrik

    (11)

    этот ШК к новой номенклатуре привязывается или к имеющейся старой?

    по моему уже на этом этапе происходит визуальный контроль — отличается ли состав, комплектация товара и т.д

    К новой. Товар ещё на таможне, но производитель уже прислал «Баркоды». Визуальный осмотр товара в контейнере особо не произведёшь, а приходовать уже пора

    (11)

    иерархия в зависимости от срока поставки — не хочу вас судить, но, имхо, в целом это плохая идея, плохо решенная задача — это первое мое мнение не видя решения и причин…

    Сроки поставки укрупненные, например сейчас идёт поступление товара на сезон «Весна-лето 2019», чуть позже начнется «Осень-зима 2019-2020». Кроме иерархии справочника ессно заводится допреквизит сезона и т.д. Это новый товар, произведенный специально для этого сезона.

    (11)

    если в регистре сведений использовать только типовые измерения Товар + ШК, то регламентная процедура для разных позиций нормально отработает — и определит что у нескольких позиций одинаковый шк…

    Я не знаю про какие вы конфигурации говорите — в последних типовых штрихкод это ЕДИНСТВЕННОЕ измерение. В том то и дело, отсюда и корень проблем

    Reply
  14. kembrik

    (12) За то что кроме «Штрихкода» в измерении больше ничего нет. См. выше

    Reply
  15. Rustig

    (13) ясно, понял вас, спасибо за картинку — лучше один раз увидеть, чем сто раз услышать.

    я привык, что в ут 10.3 несколько измерений : Номенклатура, Штрихкод, Серия, Тип ШК и еще какой-то….

    Reply
  16. user619273_alevtina

    Статья интересная, спасибо.

    Reply
  17. Xershi

    Добрый день, пытаюсь завести сканер ШК, но не выходит. https://forum.infostart.ru/forum72/topic210249/

    Вы писали:

    Для проверки нажимаем (в этой же форме) «Настроить» и «Тест устройства». Сканер я предварительно перевел в режим virtual COM и установил драйвер виртуального COM порта.

    Но не написали как это сделать, если это скрин, с оборудованием в справочнике, то это сделано!

    Reply
  18. Dem1urg

    (17) Процедуры настройки сканера лежат за рамками публикации.

    В каком режиме у вас сейчас работает сканер? Если запустить Блокнот и попытаться считать штрихкод что-нибудь происходит?

    Reply
  19. Xershi

    (18) это сразу работало. В теме уже нашли решение!

    Можете почитать последние ответы. Там остались не понятки почему оно криво работало.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *