Сканер штрихкодов и 1С

 
Задание: с помощью сканера штрихкодов отсечь возможность у кладовщика отгрузить один и тот же товар 2 раза (конфигурация Управление торговлей 11).
 
Как сейчас работаем:
Менеджеры создают и проводят документ Реализация товаров. По нему распечатывают Расходную накладную на товары.
Кладовщику приносят распечатанную Расходную накладную, он находит документ в базе (и то не факт), смотрит список позиций и выдает товар.
 
Погуглил, есть следующий цивилизованный способ решения: использовать механизм Ордерных складов (или Ордерная схема документооборота). Что это такое?

 
Ордерная схема – это прежде всего разделение операций по движению товаров на Финансовые и Складские.
В этой схеме существуют финансовые документы (Поступление товаров, Реализация товаров) и складские (Приходный и расходный ордера). Соответственно финансовые документы делают движения по регистрам финансового учета (взаиморасчеты, выручка и т.д.), но движение по складам не происходит при проведении финансовых документов. Отражение движений по складским регистрам осуществляется складскими ордерами.
Так, менеджер выписывает сводную накладную (документ Реализация товаров), в которой склады указаны в табличной части, а кладовщик на основании этого документа оформляет несколько документов Расходный ордер, каждый на свой склад, и списывает товар. Второй раз отгрузить товар уже не получится – Расходный ордер по Реализации уже будет существовать.
 

1. Выбор пути

Все это, конечно, здорово, но ворошить сложившийся уклад в формировании документов Реализации из-за добавления небольшого дополнительного функционала – будет нехорошо.
Поэтому решили так, по-простому, по-деревенски:
С помощью сканера штрихкодов по предоставленной “Расходной накладной” 1С автоматически находит документ “Реализации товаров и услуг” и устанавливает в нем определенный статус (типа, отгружено).
Если же попытаться сканировать документ второй раз, то 1С посмотрит на статус и выдаст предупреждение, что “Товар уже был отгружен”.
Вот такой простой аналог механизма Ордерных складов, где информацию о том, отгружен ли уже товар можно узнать по признаку проведенности Расходного ордера.
 
В документах Реализации есть встроенный механизм статусов (К предоплате, Реализовано). Его можно включить в настройках:
НСИ и администрирование -> Настройки раздела Продажи -> Оптовые продажи -> галка Статусы реализаций товаро и услуг.
 
Но! Если реализация создана на основании “Заказа клиента”, то статус все равно не используется (скрывается на форме), т.к., как я понимаю, управление статусом реализации уже будет проводится в самом заказе.
Поэтому было решено добавить новый реквизит “Отгружено”, и не трогать имеющийся функционал, а то кто знает какой еще сакральный смысл внесли создатели конфигурации в эти статусы.
 

2. Подключение сканера

У нас был Metrologic MS9540.
Вот и вот руководства на русском языке.
 
2.1 Устанавливаем режим работы
В документации есть штрих-коды, которые при считывании изменяют настройки сканера. Мне известны 2 режима работы сканера:
 
а) режим эмуляции клавиатуры (USB Keyboard Emulation Mode)
Это режим по-умолчанию, при котором при считывании штрих-код будет возвращаться в виде текстовой строки, как будто его набрали на клавиатуре.
 
0) подключаем сканер к компу
1) считываем управляющие штрихкоды (необязательно, если сканер ненастроенный)
 
Сбрасываем настройки (на всякий):
 
Устанавливаем режим:
 
2) в Диспетчере устройств в разделе Контроллеры USB должно появиться устройство Honeywell Control Device
 
б) режим эмуляции COM-порта (Uni-Directional USB Serial Emulation Mode)
Недостаток этого режима работы состоит в том, что нельзя будет использовать сканер одновременно в нескольких базах. Т.е. если в первой базе откроете список номенклатуры/документов, то 1С уже поднимет COM-соединение со сканером (чтобы в любой момент обработать результат сканирования). Если запустить вторую базу и попытаться открыть другой список номенклатуры/документов, то 1С покажет предупреждение о неудачной попытке соединения со сканером. Можно, конечно, закрыть список в первой базе, и заново открыть во второй, т.е. использовать сканер “по очереди”, но это геморрой.
Вот пример подключения, или вот.
 
0) отключаем сканер от компа
1) скачиваем драйвера
2) запускаем Install_x86.bat или Install_x64.bat и устанавливаем 
3) подключаем сканер к компу
4) считываем управляющие штрихкоды
 
Сбрасываем настройки (на всякий):
 
Устанавливаем режим:
 
Сканер при этом должен радостно пикнуть.
 
5) в Диспетчере устройств в разделе Порты (COM и LPT) должно появиться устройство Honeywell Unidirectional Device (<COM_number>), где COM_number – номер COM-порта (понадобится в 1С)
 
2.2 Добавляем сканер в 1С

На сайте 1С есть драйвер “1С:Сканер штрихкода (COM)” с подписью “Используется в конфигурациях, не содержащих «1С:Библиотека подключаемого оборудования»”. Т.к. у нас конфигурация УТ, то ничего устанавливать не нужно.
 
Добавляем сканер в базу (примерная инструкция):
0) В НСИ и администрирование -> РМК и оборудование поставить галочку Использовать подключаемое оборудование (если не стоит)
1) НСИ и администрирование -> Подключаемое оборудование -> Создать
 
2) В зависимости от выбранного режима сканера выбираем Драйвер оборудования. Остальные поля меняем по желанию.
а) для режима USB Keyboard Emulation Mode выбираем “1С:Сканер штрихкода (NativeApi)”
 
 
б) для режима USB Serial Emulation Mode соответственно “1С:Сканер штрихкода (COM)”
 
3) Нажимаем Настроить и, возможно, Установить драйвер (установится само)
а) для режима USB Keyboard Emulation Mode ничего менять не придется
 
 
б) для режима USB Serial Emulation Mode указываем правильный COM-порт сканера
 
 

3. Смотрим в код

Оказалось, весь код уже был написан за нас.
В модуле ФормыСписка в Документы.РеализацияТоваровУслуг:
 
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
  // ПодключаемоеОборудование
  Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
    Если ИмяСобытия = "ScanData" И МенеджерОборудованияКлиентПереопределяемый.ЕстьНеобработанноеСобытие() Тогда
      ОбработатьШтрихкоды( МенеджерОборудованияКлиент.ПреобразоватьДанныеСоСканераВСтруктуру(Параметр));
    КонецЕсли;
  КонецЕсли;
И т.д. и т.п.
 
В процедуре ОбработатьШтрихкоды() вытаскивается штрихкод, производится поиск документа реализации и открывается его форма.
 
Имейте ввиду, что при пошаговой отладке метод ВводДоступен() всегда будет давать Ложь. Поэтому, точку останова ставьте уже после него.
 

4. Дописываем свой функционал

4.1 Добавляем константу УстанавливатьОтгруженоПриСканированииШтрихкодаРеализации
4.2 Добавляем реквизит Отгружено (тип Булево) в реализацию
4.3 Устанавливаем реквизит в Истина, когда просканировали штрихкод, или уведомление, если реквизит уже установлен.
В модуле ФормыСписка в Документы.РеализацияТоваровУслуг:
 
&НаКлиенте
Процедура ОбработатьШтрихкоды(Данные)
  МассивСсылок = СсылкаНаЭлементСпискаПоШтрихкоду(Данные.Штрихкод);
  Если МассивСсылок.Количество() > 0 Тогда
    Элементы.СписокРеализацииТоваровУслуг.ТекущаяСтрока = МассивСсылок[0];
    // 
    Ссылка = МассивСсылок[0];
    Если (ВключенаКонстанта()) Тогда
      УжеБылоОтгружено = ОбработкаОтгружено(Ссылка);
      ПоказатьЗначение(Неопределено, Ссылка);
      СообщитьРезультатОбработкиОтгружено(УжеБылоОтгружено,Ссылка);
    Иначе
      ПоказатьЗначение(Неопределено, Ссылка);
    КонецЕсли;
  Иначе
    ШтрихкодированиеПечатныхФормКлиент.ОбъектНеНайден(Данные.Штрихкод);
  КонецЕсли;
КонецПроцедуры
 
//
Функция ВключенаКонстанта()
  Возврат Константы.УстанавливатьОтгруженоПриСканированииШтрихкодаРеализации.Получить();
КонецФункции
 
// Проверка и установка реквизита Отгружено
Функция ОбработкаОтгружено(Ссылка)
  Если (Ссылка.Проведен) Тогда
    Док = Ссылка.ПолучитьОбъект();
    Если (Док.Отгружено) Тогда
      Возврат Истина;
    Иначе
      Док.Отгружено = Истина;
      Док.Записать();
      Возврат Ложь;
    КонецЕсли;
  КонецЕсли;
  Возврат Неопределено;
КонецФункции
 
&НаКлиенте
Процедура СообщитьРезультатОбработкиОтгружено(УжеБылоОтгружено,Ссылка)
  Если (УжеБылоОтгружено=Истина) Тогда
    ТекстСообщения = "В документе "+Ссылка+" уже установлен реквизит Отгружено !";
    ПоказатьПредупреждение(, ТекстСообщения);
  ИначеЕсли(УжеБылоОтгружено=Ложь) Тогда
    ТекстСообщения = "В документе "+Ссылка+" установлен реквизит Отгружено";
  Иначе
    ТекстСообщения = "Для установки реквизита Отгружено сначала необходимо провести документ "+Ссылка;
  КонецЕсли;
  ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = '"+ТекстСообщения+"'"),Ссылка,,,);
КонецПроцедуры
 
 
4.4 При распроведении Реализации сбрасываем флаг Отгружено.
В модуле объекта Реализации:
 
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
  ...
  ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
    ...
    // Сбрасываем флаг отгрузки
    Отгружено = Ложь;
  КонецЕсли;
 

Добавить комментарий

Ваш адрес email не будет опубликован.