Автоматизация пропускного режима и учета рабочего времени (УРВ) — это классическая задача для многих производственных и торговых предприятий. В конфигурации 1С:Управление нашей фирмой (УНФ) стандартных инструментов для работы «в реальном времени» со считывателями магнитных карт в интерфейсе охранника не предусмотрено. Однако, используя механизмы платформы и Библиотеку подключаемого оборудования (БПО), мы можем создать эффективное решение. Разберем по шагам, как реализовать «Рабочий стол охраны» на управляемых формах.
Прежде чем приступать к написанию кода, проанализируем структуру будущей системы. Для полноценной работы нам понадобятся три компонента:
Табель.Рассмотрим подробнее способ подключения оборудования. Начиная с версии УНФ 1.5 и выше, крайне рекомендуется использовать БПО. Это позволит избежать проблем с драйверами при обновлении платформы или смене модели считывателя.
В управляемых формах работа с торговым оборудованием строится на событийной модели. Нам необходимо перехватывать внешнее событие от считывателя. Рассмотрим пример кода, который должен располагаться в модуле формы «Рабочего стола охраны».
Для начала инициализируем подключение оборудования при открытии формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем обработчик ожидания для инициализации оборудования
ПодключитьОбработчикОжидания("ПодключитьОборудованиеНаКлиенте", 1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПодключитьОборудованиеНаКлиенте()
// Здесь вызывается стандартный механизм БПО для активации считывателя
Результат = МенеджерОборудованияКлиент.ПодключитьОборудованиеПоТипу(УникальныйИдентификатор, "СчитывательМагнитныхКарт");
Если Не Результат Тогда
Сообщить("Не удалось подключить считыватель карт!");
КонецЕсли;
КонецПроцедуры
После того как устройство подключено, платформа будет генерировать событие ВнешнееСобытие каждый раз, когда сотрудник прикладывает карту. Нам нужно обработать этот сигнал:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Перем КодКарты;
// Проверяем, что событие пришло именно от нашего оборудования
Если МенеджерОборудованияКлиент.ИсточникСобытияСчитывательКарт(Источник) Тогда
// Очищаем данные от лишних символов (префиксов/суффиксов)
КодКарты = СокрЛП(Данные);
// Вызываем серверную процедуру для поиска сотрудника и регистрации прохода
ЗафиксироватьПроходСотрудника(КодКарты);
КонецЕсли;
КонецПроцедуры
Одной из главных проблем при использовании одного считывателя является определение: заходит сотрудник в здание или покидает его. Проанализируем ситуацию: если мы будем просто записывать время, мы не сможем корректно рассчитать отработанные часы.
Рекомендуем создать регистр сведений СобытияДоступа со следующей структурой:
Сотрудники)Алгоритм на сервере должен проверять последнюю запись по данному сотруднику. Выясним причину предыдущего действия: если последним событием был «Вход», значит, текущее событие — «Выход», и наоборот. Посмотрим на пример серверной логики:
&НаСервере
Процедура ЗафиксироватьПроходСотрудника(КодКарты)
// Ищем сотрудника по коду карты
СотрудникСсылка = Справочники.Сотрудники.НайтиПоРеквизиту("КодМагнитнойКарты", КодКарты);
Если СотрудникСсылка.Пустая() Тогда
// Оповещаем охранника, если карта не зарегистрирована
ВызватьИсключение "Карта не найдена в базе!";
КонецЕсли;
// Определяем направление
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СобытияДоступа.Направление КАК Направление
|ИЗ
| РегистрСведений.СобытияДоступа КАК СобытияДоступа
|ГДЕ
| СобытияДоступа.Сотрудник = &Сотрудник
|УПОРЯДОЧИТЬ ПО
| СобытияДоступа.Период УБЫВ";
Запрос.УстановитьПараметр("Сотрудник", СотрудникСсылка);
Результат = Запрос.Выполнить().Выбрать();
НовоеНаправление = ПредопределенноеЗначение("Перечисление.НаправленияДвижения.Вход");
Если Результат.Следующий() Тогда
Если Результат.Направление = ПредопределенноеЗначение("Перечисление.НаправленияДвижения.Вход") Тогда
НовоеНаправление = ПредопределенноеЗначение("Перечисление.НаправленияДвижения.Выход");
КонецЕсли;
КонецЕсли;
// Записываем новое событие
МенеджерЗаписи = РегистрыСведений.СобытияДоступа.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Сотрудник = СотрудникСсылка;
МенеджерЗаписи.Направление = НовоеНаправление;
МенеджерЗаписи.Записать();
КонецПроцедуры
Для «Рабочего стола охраны» важно не только фиксировать данные, но и выводить информацию на монитор для визуального контроля. Разберем, какие элементы стоит добавить на форму:
Чтобы список последних проходов обновлялся автоматически без участия пользователя, используйте динамический список с настроенным периодом обновления или вызывайте метод Элементы.СписокСобытий.Обновить() в конце процедуры обработки внешнего события.
Накопленные в регистре СобытияДоступа данные являются базой для формирования отчетов. В 1С:УНФ используется документ Табель. Проанализируем, как автоматизировать его заполнение:
Напишем обработку, которая за выбранный период (например, месяц) анализирует пары событий «Вход» и «Выход». Разница между временем выхода и временем входа составляет чистое рабочее время.
Важный нюанс: Если сотрудник забыл «пикнуть» картой при выходе, система может насчитать ему многочасовую смену. Для этого в алгоритме заполнения табеля нужно предусмотреть «контрольные точки» (например, автоматическое закрытие смены в конце рабочего дня) или выводить список ошибок для ручной корректировки менеджером по персоналу.
Если разработка с нуля кажется слишком трудоемкой, рассмотрим вариант интеграции со сторонними системами контроля и управления доступом (СКУД), такими как PERCo или ZKTeco. Многие современные контроллеры имеют собственные SDK или позволяют считывать данные напрямую из своих SQL-баз. В этом случае 1С не будет напрямую работать со считывателем, а будет лишь периодически забирать данные из СКУД и загружать их в РегламентныеЗадания.
Также существуют готовые модули на порталах вроде Инфостарт (например, «Простой пропускной пункт»), которые уже содержат необходимые формы и логику для управляемых приложений. Использование таких решений позволяет сэкономить время на отладке низкоуровневого взаимодействия с оборудованием.
Подводя итог, создание рабочего стола охраны в 1С:УНФ 1.5 — это задача, требующая понимания механизмов БПО и работы с управляемыми формами. Использование событийной модели и регистра сведений для хранения истории перемещений позволит вам не только автоматизировать проходную, но и получить точные данные для начисления заработной платы.