АНДРЕЙ ЛУКОНЬКИН, ведущий инженер-программист ОАО «НижегородАвтоДор». Занимается автоматизацией производства, бухгалтерского, управленческого и кадрового учета
Электронная проходная своими руками
Задача автоматизации учета рабочего времени сотрудников – типовая для средних и крупных организаций. Руководителю и отделу кадров важно знать время прихода и ухода, а также время присутствия или отсутствия человека на территории предприятия. Иногда также нужно контролировать время доступа на определенные объекты. Имея данные, можно принимать решения о премировании и депремировании, оплате сверхурочных часов, а также облегчить работу кадровой службы по ведению табелей учета рабочего времени.
Можно купить и поставить «вертушки», прилагающийся софт, закупить магнитные карточки и принтер для печати на них. Но на логичный вопрос руководства: «А почему выходит так дорого?» – можно скромно ответить: «Давайте за пару дней сэкономим несколько десятков или даже сотен тысяч рублей и создадим свою систему». Затраты минимальные: компьютер (подойдет даже старый), сканер штрихкодов (дешевый однолучевой Metrologic, подключаемый в разрыв клавиатуры) и работы по созданию программы и печати пропусков.
Итак, начнем с подготовительных работ. В любой базе «1С:Предприятия» имеется справочник «Физические лица», нам нужно добавить туда строковый реквизит «Штрихкод». Формировать штрихкод можно как вручную, так и автоматически, используя непериодический регистр сведений с одним измерением (сотрудник) и одним ресурсом (штрихкод). Формат штрихкода лучше выбрать самый распространенный – EAN13, начинать его с внутреннего префикса, используемого только на данном предприятии (например, 22). Также нам понадобится регистр сведений для фиксирования времени входа и выхода сотрудников. Назовем его «ПриходУходСотрудников», установим периодичность в пределах секунды и создадим следующую структуру: измерение «ФизЛицо» (справочник физических лиц), ресурсы «Вход» и «Выход», тип данных у которых Булево. Создадим обработку с реквизитами: «Штрихкод» (строка длиной 13), «НайденныйСотрудник» (справочник физических лиц), «СписокПрошедших» (таблица значений). Замысел прост: при сканировании напечатанного уникального штрихкода производится поиск нужного человека, затем проверяется, входит он или выходит. Информация отображается на экране и записывается в регистр сведений (см. рис. 1).
Рисунок 1. Рабочий режим обработки
В модуле формы обработки размещаем процедуру, срабатывающую при сканировании пропуска с напечатанным штрихкодом.
Процедура ШтрихкодПриИзменении(Элемент) ЭлементыФормы.НадписьОшибкаСотрудника.Заголовок = ""; ЭлементыФормы.НадписьНайденныйСотрудник.Заголовок = ""; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ФизическиеЛица.Штрихкод, | ФизическиеЛица.Ссылка |ИЗ | Справочник.ФизическиеЛица КАК ФизическиеЛица |ГДЕ | ФизическиеЛица.Штрихкод = &Штрихкод"; Запрос.УстановитьПараметр("Штрихкод", Штрихкод); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда НайденныйСотрудник = Выборка.Ссылка; ЭлементыФормы.НадписьНайденныйСотрудник.Заголовок = НайденныйСотрудник.Наименование; Штрихкод=""; ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Штрихкод; Иначе ЭлементыФормы.НадписьОшибкаСотрудника.Заголовок = "Не найден сотрудник с таким штрихкодом! Обратитесь к администратору."; Штрихкод=""; ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Штрихкод; возврат; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходУходСотрудниковСрезПоследних.ФизЛицо, | ПриходУходСотрудниковСрезПоследних.Вход, | ПриходУходСотрудниковСрезПоследних.Выход, | ПриходУходСотрудниковСрезПоследних.Период |ИЗ | РегистрСведений.ПриходУходСотрудников.СрезПоследних(&ТекДата, ФизЛицо.Ссылка = &Найденный) КАК ПриходУходСотрудниковСрезПоследних"; Запрос.УстановитьПараметр("ТекДата", ТекущаяДата()); Запрос.УстановитьПараметр("Найденный", НайденныйСотрудник.Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда //Проверим, последний раз входил или выходил Если Выборка.Вход Тогда //Значит выходим НовСтрока = СписокПрошедших.Добавить(); НовСтрока.Сотрудник = НайденныйСотрудник; НовСтрока.Выход = ТекущаяДата(); НовЗапись = РегистрыСведений. ? ПриходУходСотрудников. ?? СоздатьМенеджерЗаписи(); НовЗапись.ФизЛицо = НайденныйСотрудник; НовЗапись.Выход = Истина; НовЗапись.Период = ТекущаяДата(); НовЗапись.Записать(); ЭлементыФормы.СписокПрошедших.ТекущаяСтрока = НовСтрока; Иначе //Входим НовСтрока = СписокПрошедших.Добавить(); НовСтрока.Сотрудник = НайденныйСотрудник; НовСтрока.Вход = ТекущаяДата(); НовЗапись = РегистрыСведений. ? ПриходУходСотрудников. ? СоздатьМенеджерЗаписи(); НовЗапись.ФизЛицо = НайденныйСотрудник; НовЗапись.Вход = Истина; НовЗапись.Период = ТекущаяДата(); НовЗапись.Записать(); ЭлементыФормы.СписокПрошедших.ТекущаяСтрока = НовСтрока; Конецесли; Иначе //Не нашли, значит вход НовСтрока = СписокПрошедших.Добавить(); НовСтрока.Сотрудник = НайденныйСотрудник; НовСтрока.Вход = ТекущаяДата(); НовЗапись = РегистрыСведений.ПриходУходСотрудников.СоздатьМенеджерЗаписи(); НовЗапись.ФизЛицо = НайденныйСотрудник; НовЗапись.Вход = Истина; НовЗапись.Период = ТекущаяДата(); НовЗапись.Записать(); ЭлементыФормы.СписокПрошедших.ТекущаяСтрока = НовСтрока; Конецесли;КонецПроцедуры
При начале интерактивной работы, при открытии формы сформируем необходимые колонки таблицы значений и активизируем поле ввода штрихкода, чтобы обработка была готова для работы.
Процедура ПриОткрытии() СписокПрошедших.Колонки.Добавить("Сотрудник"); СписокПрошедших.Колонки.Добавить("Вход"); СписокПрошедших.Колонки.Добавить("Выход"); ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Штрихкод;КонецПроцедуры
Пример обработки – минимальный каркас, функционал которого можно наращивать. Например, можно добавить вывод фотографии сотрудника, его подразделения и должности.
Процедура КнопкаВыполнитьНажатие(Кнопка) Если (НЕ ЗначениеЗаполнено(НачПериода)) ИЛИ (НЕ ЗначениеЗаполнено(КонПериода)) Тогда Предупреждение("Выберите период!"); Возврат; КонецЕсли; //Создание объекта MS Excel Excel = Новый COMОбъект("Excel.Application"); //Создаём новую книгу в Excel Excel.WorkBooks.Add(); //Выводим текст заголовка документа Excel.WorkBooks(1).WorkSheets("Лист1").cells(1,1).value = "Таб. №"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(1,2).value = "Сотрудник"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(1,3).value = "Дата"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(1,4).value = "Время"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(1,5).value = "Подразделение"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(1,6).value = "Событие"; //Заполняем со 2-й строки Счетчик = 2; //Выберем записи о входах-выходах за период Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходУходСотрудников.Период, | ПриходУходСотрудников.ФизЛицо, | ПриходУходСотрудников.Вход, | ПриходУходСотрудников.Выход |ИЗ | РегистрСведений.ПриходУходСотрудников КАК ПриходУходСотрудников |ГДЕ | ПриходУходСотрудников.Период МЕЖДУ &НачПериода И &КонПериода"; Запрос.УстановитьПараметр("НачПериода", НачалоДня(НачПериода)); Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,1).NumberFormat = "@"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,1).value = Строка(Выборка.ФизЛицо.ТабНомер); Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,2).NumberFormat = "@"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,2).value = Строка(Выборка.ФизЛицо); Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,3).NumberFormat = "@"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,3).value = Строка(Формат(Выборка.Период,"ДЛФ=D")); Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,4).NumberFormat = "@"; Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,4).value = Строка(Формат(Выборка.Период,"ДЛФ=T")); Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,6).NumberFormat = "@"; Если Выборка.Вход Тогда Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,6).value = "Вход"; ИначеЕсли Выборка.Выход Тогда Excel.WorkBooks(1).WorkSheets("Лист1").cells(Счетчик,6).value = "Выход"; КонецЕсли; Счетчик = Счетчик + 1; КонецЦикла; //Записываем файл Excel Попытка Excel.ActiveWorkBook.SaveAs(СокрЛП(Путь)+ИмяФайла); Исключение Сообщить("Неудачная попытка сохранения файла"); КонецПопытки; //Закрываем книгу Excel Excel.ActiveWorkBook.Close();КонецПроцедурыПроцедура ВыбПериодНажатие(Элемент) НастройкаПериода = Новый НастройкаПериода; НастройкаПериода.УстановитьПериод(НачПериода,?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода))); НастройкаПериода.РедактироватьКакИнтервал = Истина; НастройкаПериода.РедактироватьКакПериод = Истина; НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период; Если НастройкаПериода.Редактировать() Тогда НачПериода = НастройкаПериода.ПолучитьДатуНачала(); КонПериода = НастройкаПериода. ? ПолучитьДатуОкончания(); КонецЕсли; ИмяФайла = Строка(Формат(НачПериода,"ДЛФ=D"))+".xls";КонецПроцедурыПроцедура НачПериодаПриИзменении(Элемент) ИмяФайла = Строка(Формат(НачПериода,"ДЛФ=D"))+".xls";КонецПроцедуры
Результатом нашей обработки будет являться сформированный набор записей, удобный для дальнейшего анализа (см. рис. 2).
Рисунок 2. Набор записей для анализа
Как можно использовать полученные данные? Зная графики работы, можно отслеживать несанкционированный выход за территорию предприятия, можно подсчитать общее рабочее время, можно выявлять опоздавших сотрудников. Также возможно автоматически формировать табель рабочего времени.
Как анализировать данные? Каждый выбирает свой способ. Идеальный вариант, если кадровый учет ведется в той же программе, в которой мы и запускали электронную проходную. Если же это другая база данных, то придется или подключаться через COM-соединение, или выгружать сведения в файл для дальнейшей загрузки и обработки.
Приведу пример выгрузки данных за определенный период в файл Excel (см. рис. 3).
Рисунок 3. Обработка выгрузки сведений в файл Excel
Итак, задача по автоматизации учета рабочего времени выполнена, финансовая экономия для организации очевидна, получены структурированные данные о времени прихода и ухода сотрудников. Теперь остается только использовать эти сведения на благо предприятия.