Вход в 1С по штрих-коду

Хотите поделиться интересным решением, идеей, просто помочь другим не наступать на известные грабли? Или почитать заметки бывалых о работе с терминальными серверами Windows?
Ответить
MAGNet
Сообщения: 91
Зарегистрирован: Чт сен 19, 2013 4:04 pm
Откуда: Новосибирск
Контактная информация:

Вход в 1С по штрих-коду

Сообщение MAGNet »

Сразу оговорюсь, что в 1cv8 есть специальные конфиги для ККМ, поэтому речь пойдет о старенькой 1cv77, перепиленой под кассу.
При входе на терминальный сервер у кассира сразу запускается 1С и предлагается авторизация. Т.к. мышек у них нет и клавиаткры специализированные, то это немного затруднительно. Пришла мысь авторизовать их карточкой со штрих-кодом. Сканер всё равно клавиатуру эмулирует, почему бы нет?
Использовать будем самый распространенный Code 128 (ISO 15417). Его поддерживают практически все генераторы и там широкий набор символов. Я для генерации использовал беслатный Zint Barcode Generator.
Выглядеть должно всё это примерно так: сразу после старта на пустом экране появляется окно с сообщением и система не реагирует ни на что кроме "правильных" штрих-кодов.
Окно приветствия
Окно приветствия
logon_screen.png (5.21 КБ) 14826 просмотров
После запуска 1С табличка меняется. На ней отображается имя зарегистрированного кассира и она прячется . Если 1С закрыть, то всё опять вернется в режим ожидания штрих-кода.

Приступим.
Для начала нужно создать конфиг с названием settings.ini и вашими настройками. Это понятно из комментариев:

Код: Выделить всё

var run1c = "D:\\RemoteApp\\1Cv77-0027\\BIN_net\\1cv7.exe ENTERPRISE /DD:\\1C_Bases\\Shop"; // Строка запуска приложения
var winWidth=450; // ширина окна приветствия
var winHeight=70; // высота окна приветствия
// положние окна - в центр экрана
var winPosX=screen.width/2-winWidth/2;
var winPosY=screen.height/2-winHeight/2;
Следующим шагом будет файл с описанием пользователей, которые у вас заведены в 1Цэ. Примерно так, users.ini

Код: Выделить всё

var barcode = {
  mtX4U74qKDn7 : {     // Это штрихкод
    user  : "Кассир",  // Это юзер 1С
    pass  : "iIH667"   // Это пароль, назначенный юзеру в 1С
  },
  BCcfJ725ft4E : {
    user  : "ReIndex",
    pass  : "DDD /M"   // Это значит, что 1С запустится в монопольном режиме
  },
  qwe : {              // а в этом случае можно будет войти Админом просто набрав на клавиатуре qwe
    user  : "Admin",   // ..но об этом ведь никто не узнает )))
    pass  : "DDD"
  }
}
Обратите внимание, что в штрих-кодах нельзя использовать спец.символы и начинаться они должны с буквы, потому что это переменные javascript, да-да :lol:
Далее самое интересное! Нужно сделать html-приложение, которое будет запускаться при стате и творить всё это безобразие.
Очень просто. Создаем какой-нибудь файл с расширением .hta например launcher.hta и помещаем в него следующий текст:

Код: Выделить всё

<html><head>
<hta:application id=logon_id
applicationName=logon_1c
showInTaskBar=no
caption=no
innerBorder=no
selection=no
scroll=no
contextmenu=no />

<script type = "text/javascript" src = "users.ini"></script>
<script type = "text/javascript" src = "settings.ini"></script>

<script language=javascript>
var str = ""; // введенная строка
var works = 0; // флаг открытой сессии

window.resizeTo(winWidth, winHeight); // изменяем размер
window.moveTo(winPosX, winPosY); // позиционируем окно

function getChar(event) {
if (works) return 0; // сессия открыта - на кнопки не реагируем
var key = String.fromCharCode(event.keyCode);
  if (event.keyCode == 27) close(); // нажат Esc - закрыть программу
  if (event.keyCode == 13) {        // нажат Enter - начинаем проверку баркода
    if (str in barcode) {           // есть такой баркод
      document.getElementById('msg').innerHTML = "Работает кассир " + barcode[str].user;
      document.getElementById('esc').innerHTML = "";
      works = 1;
      var run1cUser = run1c + " /N" + barcode[str].user + " /P" + barcode[str].pass;
      var WshShell = new ActiveXObject("WScript.Shell");
      WshShell.Run (run1cUser, 3, 1); 
      document.getElementById('msg').innerHTML = "Авторизуйтесь для работы с ККМ";
      document.getElementById('esc').innerHTML = "<strong>ESC</strong> - выключить";
      works = 0;
      str = "";
      return 0;
    }
// нет такого баркода
    str = ""; // занулить ввод и выйти
    return 0;
  }
  if (event.keyCode < 32) return null; // спец. символ
  str = str + key
//document.getElementById('msg').innerHTML = str;
  return 0;
}
</script>
</head>

<title>Авторизация 1С</title>
<style type="text/css">
#msg {
   align : center;
   }
#esc {
    color: #FF0040;
    position: absolute;
    bottom: 6px;
    right: 6px;
    font: 8pt;
   }
  </style>
<body bgcolor=buttonface text=buttontext style="padding: 2px;font: 18pt 'MS Sans serif'" onkeypress = "getChar(event)">
<div id="msg" align="center">Авторизуйтесь для работы с ККМ</div>
<div id="esc"><strong>ESC</strong> - выключить</div>
</body></html>
Все три файлика должны лежать в одном месте.
Следующим шагом нужно добавить C:\Windows\System32\mshta.exe в RemoteApp сервера с разрешением аргументов.
Ну а конфиг терминала может выглядеть примерно так:

Код: Выделить всё

user=domain\user[Кассир]:password
clienthostname=KASSA
serial=COM1(usb)
turnoffmenu=poweroff
shell=mshta d:\remoteapp\launcher\launcher.hta
server=192.168.0.100
connection
Ну вы поняли, что все три файлика нужно сложить в d:\remoteapp\launcher\ или куда вам понравится, но не забудьте указать нужный путь в конфиге.

Да, как принято говорить: если у кого-то что-то не работает, значит вы чего-то не поняли. у меня работает.

зы
есть один известный баг. при двойном срабатывании сканера всё безжалостно виснет :lol:
..но вас ведь это не смущает, правда? :wink:
aka
Разработчик
Разработчик
Сообщения: 11806
Зарегистрирован: Ср окт 01, 2003 12:06 am
Откуда: Роcсия, Тольятти
Контактная информация:

Re: Вход в 1С по штрих-коду

Сообщение aka »

MAGNet писал(а):Да, как принято говорить: если у кого-то что-то не работает, значит вы чего-то не поняли. у меня работает.
Хорошая фраза, надо запомнить :mrgreen:
Ответить

Вернуться в «Tips and tricks»