Как организовать рабочее место охраны и учет рабочего времени в 1С:Управление нашей фирмой

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет
← На главную

Автоматизация пропускного режима и учета рабочего времени (УРВ) — это классическая задача для многих производственных и торговых предприятий. В конфигурации 1С:Управление нашей фирмой (УНФ) стандартных инструментов для работы «в реальном времени» со считывателями магнитных карт в интерфейсе охранника не предусмотрено. Однако, используя механизмы платформы и Библиотеку подключаемого оборудования (БПО), мы можем создать эффективное решение. Разберем по шагам, как реализовать «Рабочий стол охраны» на управляемых формах.

Архитектура решения: С чего начать?

Прежде чем приступать к написанию кода, проанализируем структуру будущей системы. Для полноценной работы нам понадобятся три компонента:

  1. Аппаратная часть: Считыватели магнитных или бесконтактных (RFID) карт. Обычно они работают либо в режиме «эмуляции клавиатуры», либо через COM-порт (RS-232).
  2. Программный интерфейс (Рабочее место): Форма в 1С, которая открыта на мониторе охранника. Она должна мгновенно реагировать на прикладывание карты.
  3. Учет данных: Механизм фиксации события входа/выхода и последующее формирование документа Табель.

Рассмотрим подробнее способ подключения оборудования. Начиная с версии УНФ 1.5 и выше, крайне рекомендуется использовать БПО. Это позволит избежать проблем с драйверами при обновлении платформы или смене модели считывателя.

Реализация обработки события считывания карты

В управляемых формах работа с торговым оборудованием строится на событийной модели. Нам необходимо перехватывать внешнее событие от считывателя. Рассмотрим пример кода, который должен располагаться в модуле формы «Рабочего стола охраны».

Для начала инициализируем подключение оборудования при открытии формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем обработчик ожидания для инициализации оборудования
    ПодключитьОбработчикОжидания("ПодключитьОборудованиеНаКлиенте", 1, Истина);
КонецПроцедуры

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

После того как устройство подключено, платформа будет генерировать событие ВнешнееСобытие каждый раз, когда сотрудник прикладывает карту. Нам нужно обработать этот сигнал:


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

Логика определения направления движения (Вход или Выход)

Одной из главных проблем при использовании одного считывателя является определение: заходит сотрудник в здание или покидает его. Проанализируем ситуацию: если мы будем просто записывать время, мы не сможем корректно рассчитать отработанные часы.

Рекомендуем создать регистр сведений СобытияДоступа со следующей структурой:

Алгоритм на сервере должен проверять последнюю запись по данному сотруднику. Выясним причину предыдущего действия: если последним событием был «Вход», значит, текущее событие — «Выход», и наоборот. Посмотрим на пример серверной логики:


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

    // Определяем направление
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   СобытияДоступа.Направление КАК Направление
        |ИЗ
        |   РегистрСведений.СобытияДоступа КАК СобытияДоступа
        |ГДЕ
        |   СобытияДоступа.Сотрудник = &Сотрудник
        |УПОРЯДОЧИТЬ ПО
        |   СобытияДоступа.Период УБЫВ";
    
    Запрос.УстановитьПараметр("Сотрудник", СотрудникСсылка);
    Результат = Запрос.Выполнить().Выбрать();
    
    НовоеНаправление = ПредопределенноеЗначение("Перечисление.НаправленияДвижения.Вход");
    Если Результат.Следующий() Тогда
        Если Результат.Направление = ПредопределенноеЗначение("Перечисление.НаправленияДвижения.Вход") Тогда
            НовоеНаправление = ПредопределенноеЗначение("Перечисление.НаправленияДвижения.Выход");
        КонецЕсли;
    КонецЕсли;

    // Записываем новое событие
    МенеджерЗаписи = РегистрыСведений.СобытияДоступа.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Период = ТекущаяДата();
    МенеджерЗаписи.Сотрудник = СотрудникСсылка;
    МенеджерЗаписи.Направление = НовоеНаправление;
    МенеджерЗаписи.Записать();
КонецПроцедуры

Интерфейс для охранника (Визуализация)

Для «Рабочего стола охраны» важно не только фиксировать данные, но и выводить информацию на монитор для визуального контроля. Разберем, какие элементы стоит добавить на форму:

  1. Фотография сотрудника: Позволяет охране убедиться, что карту приложил именно владелец.
  2. ФИО и Должность: Основная информация о человеке.
  3. Список последних событий: Динамический список, отображающий 10–15 последних проходов с указанием времени и направления (подсвечивайте «Выход» красным, а «Вход» — зеленым).
  4. Статус сотрудника: Крупный индикатор «ВНУТРИ» или «ОТСУТСТВУЕТ».

Чтобы список последних проходов обновлялся автоматически без участия пользователя, используйте динамический список с настроенным периодом обновления или вызывайте метод Элементы.СписокСобытий.Обновить() в конце процедуры обработки внешнего события.

Интеграция с учетом рабочего времени (УРВ)

Накопленные в регистре СобытияДоступа данные являются базой для формирования отчетов. В 1С:УНФ используется документ Табель. Проанализируем, как автоматизировать его заполнение:

Напишем обработку, которая за выбранный период (например, месяц) анализирует пары событий «Вход» и «Выход». Разница между временем выхода и временем входа составляет чистое рабочее время.

Важный нюанс: Если сотрудник забыл «пикнуть» картой при выходе, система может насчитать ему многочасовую смену. Для этого в алгоритме заполнения табеля нужно предусмотреть «контрольные точки» (например, автоматическое закрытие смены в конце рабочего дня) или выводить список ошибок для ручной корректировки менеджером по персоналу.

Альтернатива: Готовые решения и СКУД

Если разработка с нуля кажется слишком трудоемкой, рассмотрим вариант интеграции со сторонними системами контроля и управления доступом (СКУД), такими как PERCo или ZKTeco. Многие современные контроллеры имеют собственные SDK или позволяют считывать данные напрямую из своих SQL-баз. В этом случае 1С не будет напрямую работать со считывателем, а будет лишь периодически забирать данные из СКУД и загружать их в РегламентныеЗадания.

Также существуют готовые модули на порталах вроде Инфостарт (например, «Простой пропускной пункт»), которые уже содержат необходимые формы и логику для управляемых приложений. Использование таких решений позволяет сэкономить время на отладке низкоуровневого взаимодействия с оборудованием.

Подводя итог, создание рабочего стола охраны в 1С:УНФ 1.5 — это задача, требующая понимания механизмов БПО и работы с управляемыми формами. Использование событийной модели и регистра сведений для хранения истории перемещений позволит вам не только автоматизировать проходную, но и получить точные данные для начисления заработной платы.

← На главную