Всем привет. Возникла необходимость реализовать СКУД со сканером штрихкодов и турникетом. Я подумал и решил сделать данную систему на основе 1С.Розница 2.3. Причина выбора 1с в том, что через нее легко можно продавать (подключение КТТ онлайн) и вести учет, ну а СКУД - всего лишь надстройка.
Тестировалось на Розница, редакция 2.3 (2.3.3.19), платформа 1С:Предприятие 8.3 (8.3.15.1869)
Делюсь, потому как информации на этот счет не так уж и много, вдруг кому понадобится.
Практически весь функционал реализован в самой обработке, но кое где все таки пришлось влазить в основную конфигурацию.
Схема работы.
При продаже через РКМ, в процедуру
Процедура ПробитьЧекККМЗавершение(РезультатВыполнения, ПараметрыОперации) Экспорт
Добавлен код формирования и печати билета с ШК:
- Проверяем все позиции в чеке. Если есть номеклатура, принадлежащая товарной группе "Билеты", то по количеству этой номеклатуры, в независимом регистре сведений "БилетыНаПроход" формируется запись с новым штрих кодом и указанием времени продажи, ссылкой на чек, и на саму номеклатуру
- По количеству позиций отправляем на принтер этикеток печать билетов со штрих кодом
Далее для прохода через турникет должна быть запущена обработка СКУД, она и управляет возможностью прохода. При срабатывании внешнего события от сканера, проверяется принадлежит ли штрихкод текущим суткам и не является ли он погашенным. Если штрихкод не погашен, то дается команда турникету на открытие, далее штрихкод гасится.
Турникет управляется посылкой команды "open" http запросом на запрограммированный адрес, у меня 192.168.0.250.
Управление турникетом я реализовал на базе ардуино уно + шилд 5100.
При запущенной обработке, турникетом можно управлять как обычной процедурой, так и в фоновом потоке, чтобы не висла форма. Для управления в потоке я добавил в конфигурацию общий модуль "ОткрытиеТурникета" с кодом
////////////////////////////////////////////////////////////////
// Открытие турникета в потоке по условиям
// 1 - ШК принадлежит текущим суткам
// 2 - ШК непогашен
// Погашение ШК в случае успешного прохода через турникет
Процедура ОткрытьТурникет(Штрихкод,IP_Port,CMD) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БилетыНаПроход.Штрихкод КАК Штрихкод,
| БилетыНаПроход.ДатаГенерации КАК ДатаГенерации,
| БилетыНаПроход.Погашен КАК Погашен
|ИЗ
| РегистрСведений.БилетыНаПроход КАК БилетыНаПроход
|ГДЕ
| БилетыНаПроход.Штрихкод ПОДОБНО &Штрихкод
| И БилетыНаПроход.Погашен = Ложь";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если (Формат(ВыборкаДетальныеЗаписи.ДатаГенерации, "ДЛФ=Д") = Формат(ТекущаяДата(), "ДЛФ=Д")) Тогда
Соединение = Новый HTTPСоединение(IP_Port,,,,,10);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=Windows-1251");
Запрос = Новый HTTPЗапрос("/" + CMD , Заголовки);
ОтветСервера = Соединение.Получить(Запрос); // Ответ от контроллера
Ответ = ОтветСервера.ПолучитьТелоКакСтроку(); // переводим в строку и получаем код странички
Если Ответ="event_step_in" Тогда // Ответ "event_step_in" говорит, о совершенном переходе через турникет
ТекущийБилет = РегистрыСведений.БилетыНаПроход.СоздатьНаборЗаписей();
//ТекущийБилет.Отбор.Погашен.Установить(Ложь);
ТекущийБилет.Отбор.Штрихкод.Установить(Штрихкод);
ТекущийБилет.Прочитать();
Для Каждого Билет Из ТекущийБилет Цикл
Билет.Погашен = Истина;
Билет.ДатаПогашения = ТекущаяДата();
КонецЦикла;
ТекущийБилет.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Особенность подключения сканера ШК в том, что он подключается с использованием драйверов DTO 2009 года, тех что еще бесплатны. Сделано это для того, чтобы событие сканирования не возникало в РМК.
Вот код вставленный в РМК
&НаКлиенте
Процедура ПробитьЧекККМЗавершение(РезультатВыполнения, ПараметрыОперации) Экспорт
ПараметрыЗаполнения = ПараметрыОперации.ПараметрыЗаполнения;
Если РезультатВыполнения.Результат Тогда
// Установить полученное значение номера чека реквизиту документа.
ПараметрыЗаполнения.Вставить("СтатусЧекаККМ", ПредопределенноеЗначение("Перечисление.СтатусыЧековККМ.Пробитый"));
ПараметрыЗаполнения.Вставить("Дата", ОбщегоНазначенияКлиент.ДатаСеанса());
ПараметрыЗаполнения.Вставить("НомерСменыККМ", РезультатВыполнения.ВыходныеПараметры[0]);
ПараметрыЗаполнения.Вставить("НомерЧекаККМ" , РезультатВыполнения.ВыходныеПараметры[1]);
Если НЕ ЗначениеЗаполнено(ПараметрыЗаполнения.НомерЧекаККМ) Тогда
Если НомерДокументаКассыККМ[ПараметрыОперации.КассаККМ] <> Неопределено Тогда
НомерЧекаККМ = НомерДокументаКассыККМ[ПараметрыОперации.КассаККМ];
Иначе
НомерЧекаККМ = ПорядковыйНомерПродажи;
КонецЕсли;
ПараметрыЗаполнения.Вставить("НомерЧекаККМ", НомерЧекаККМ);
КонецЕсли;
Иначе
ЗаголовокИнформации = НСтр("ru = 'При печати чека произошла ошибка.'");
ТекстСообщения = НСтр("ru = 'Чек не напечатан на устройстве для печати чеков.
|Дополнительное описание: %ДополнительноеОписание%'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ДополнительноеОписание%", РезультатВыполнения.ОписаниеОшибки);
ОбщегоНазначенияРТКлиент.ВывестиИнформациюДляРМКУправляемой(ЗаголовокИнформации, ТекстСообщения);
КонецЕсли;
ПараметрыЗаполнения.ЧекПробит = РезультатВыполнения.Результат;
ВыполнитьОбработкуОповещения(ПараметрыОперации.ОповещениеПриЗавершении, ПараметрыЗаполнения);
///////////////////////////////////////////////////////////////
//Процедура генерации штрихкода
НовыеШК = Массив_ШК(ПараметрыОперации.ЧекККМСсылка);
Для Каждого Штрихкод из НовыеШК Цикл
ДокПечать = ПечатьБилета(Штрихкод);
//ДокПечать.ИмяПринтера="HP LaserJet 3055 PCL5 LAN";
ДокПечать.ОтображатьСетку = Ложь;
ДокПечать.Защита = Ложь;
ДокПечать.ТолькоПросмотр = Ложь;
ДокПечать.ОтображатьЗаголовки = Ложь;
ДокПечать.ПолеСлева=3;
ДокПечать.ПолеСправа=3;
ДокПечать.АвтоМасштаб = Истина;
ДокПечать.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецЦикла;
//Завершение процедуры
///////////////////////////////////////////
КонецПроцедуры
В конце модуля формы РМК
////////////////////////////////////////////////////////////////////
//Вызовы серверным методов из модуля менеджера обработки СКУД
Функция Массив_ШК(ЧекККМСсылка)
Возврат Обработки.СКУД.ГенерацияШК(ЧекККМСсылка);
КонецФункции
&НаСервере
Функция ПечатьБилета(ШК)
Возврат Обработки.СКУД.ПечатьБилетаНаСервере(ШК);
КонецФункции
////////////////////////////////////////////////////////////////////
Для упрощения работы, я создал подсистему "СКУД", пользователя "СКУД" и назначил пользователю все необходимые права. При заходе под пользователем "СКУД", ему доступна только его подсистема и обработка запускается автоматически, т.е. от продажи билетов управление турникетом отделено.
Хочу заметить, что я выложил данную обработку, не как готовую систему, а как пример для тех, у кого возникают сходные задачи. Вся реализация сделана на управляемых формах клиент серверной.