Анализ посещаемости по СКУД Orion

29.01.26

Учетные задачи - Учет рабочего времени

Отчет по посещаемости персонала, который строится по базе данных СКУД Orion. С возможностью запустить в любой базе, имеющей подключение к Orion.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Анализ посещаемости по СКУД Orion
.erf 23,83Kb
1 4 200 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Как-то раз, в самый обычный день, для самого обычного программиста прилетела на голову задача: "Нужно учитывать фактическое пребывание персонала на территории".    

И вот не долго думая, не гадая, выбор пал на СКУД (Система Контроля и Управления Доступа). Проанализировав внимательно возможности системы которая имелась, а это была СКУД Orion, стало очевидно, что функционала, который она дает, недостаточно для учета посещений.

Так появилась идея для доработки функционала.

Первым делом необходимо было проанализировать базу данных системы и оценить хранимые в ней данные. 

Таким образом, в результате анализа выяснилось что, например, таблица pLogData хранила в себе нужные события прохода по пропускам, а таблица pList это таблица сотрудников.

После тщательного анализа продумывались запросы к базе данных которые будут исходить из 1С и просить вернуть необходимые данные.

Так получился запрос для сбора необходимых данных: 

	|Select 
	|   [TimeVal]
    |  	,PCompany.[Name] as Company
	|  	,PDivision.Name as Division
	|  	,[DoorIndex] as DoorIndex
	|	,AP.Name as DoorName
	|  	,PPost.Name as Post
	|	,pList.Post as IDPost
    |  	,pList.Name + ' ' + pList.FirstName  + ' ' + pList.MidName as FIO
	|	,pList.Name + ' ' + SUBSTRING(pList.FirstName, 1, 1) + '. ' + SUBSTRING(pList.MidName, 1, 1) + '.' as ShortFIO
	|	,pList.ID as IDWoker
	|   ,pList.Company as IDCompany
	|   ,pList.Section as IDDivision
    |  	,[Remark]
    |  	,[pLogData].[Mode]
    |  	,[DeviceTime] 
	|	,pLogData.[Event] as Event
  	|From [dbo].[pLogData]
	|	inner join [dbo].[pList]
	|		ON pList.ID = pLogData.HozOrgan "
	+ ?(ЗначениеЗаполнено(Сотрудник) ИЛИ ЗначениеЗаполнено(Подразделение) ИЛИ ЗначениеЗаполнено(Организация) ИЛИ ЗначениеЗаполнено(Турникет),  
	?(ЗначениеЗаполнено(Сотрудник), "and HozOrgan in (" + СтрЗаменить(Строка(Сотрудник) + ")", " ", ""), "") + 
	?(ЗначениеЗаполнено(Подразделение), "and Section in (" + СтрЗаменить(Строка(Подразделение) + ")", " ", ""), "") +
	?(ЗначениеЗаполнено(Организация), "and Company in (" + СтрЗаменить(Строка(Организация) + ")", " ", ""), "" ) +
	?(ЗначениеЗаполнено(ТурникетП), "and DoorIndex in (" + СтрЗаменить(Строка(ТурникетП) + ")", " ", ""), "" ) + 
	?(ЗначениеЗаполнено(событиеП), "and pLogData.[Event] in (" + СтрЗаменить(Строка(событиеП) + ")", " ", ""), "" ),
	"") +
	"
	|   	And TimeVal BETWEEN CAST(Convert(varchar, '"+НачалоПериода +"', 103) AS DateTime) AND CAST(Convert(varchar, '"+КонецПериода +"', 103) AS DateTime)

	|	left join [dbo].[PCompany]	
	|		on pList.Company = PCompany.ID
	|	left join [dbo].[PDivision]
	|		on pList.Section = PDivision.ID
	|	left join [dbo].[PPost]
	|		on pList.Post = PPost.ID
	|	Inner join [dbo].[AcessPoint] as AP
	|		on pLogData.DoorIndex = AP.GIndex " 
	+ ?(ЗначениеЗаполнено(НомерНужнойЗоны), "and AP.IndexZone2 = " + СтрЗаменить(Строка(НомерНужнойЗоны), " ", ""), "") + 
	"
	|	Order by PCompany.[Name], PDivision.Name, pList.Name + ' ' + pList.FirstName  + ' ' + pList.MidName, pList.ID, TimeVal

А теперь получается что мы получили запрос, которому необходимо передавать параметры, чтобы он отработал правильно.

Значит, при формировании отчета мы должны их откуда-то брать, а перед этим еще и выбрать нужные нам параметры. 

Решение пало на загрузку параметров из базы данных СКУД. 

Тем самым мы получили еще один пакетный запрос:

|Set NOCOUNT ON
	| 
	|SELECT [pList].[ID] as IDWorker
    |  ,[pList].[Name] + ' ' + [FirstName] + ' ' + [MidName] as FIO
    |  ,[Company] as IDCompany
    |  ,[Section] as IDSection
    |  ,[Post] as IDPost
	|  ,[PCompany].[Name] as NameCompany
	|  ,[PDivision].[Name] as NameDivision
	|  ,[PPost].[Name] as NamePost
  	|FROM [Orion].[dbo].[pList]
  	|left join [Orion].[dbo].[PCompany]
  	|on pList.Company = PCompany.ID
  	|left join [Orion].[dbo].[PDivision]
  	|on pList.Section = PDivision.ID
  	|left join [Orion].[dbo].[PPost]
  	|on pList.Post = PPost.ID
	|
	|SELECT  
	|	   [ID]
	|     ,[Name]
	| FROM [Orion].[dbo].[AccessZone] 
	|
	|SELECT [GIndex]
    |  ,[Name]
	|FROM [Orion].[dbo].[AcessPoint]
    |
	|SELECT [Event] as ID
    |  ,[Contents] as Name
	|FROM [Orion].[dbo].[Events]
	|

Этим самым запросом мы получаем данные, необходимые для подстановки в первый запрос.

Теперь мы получили необходимые данные и готовы использовать их.

Так как внешний отчет формируется на СКД (Система Компоновки Данных), необходимо полученные параметры передать в параметры СКД и показать пользователю для выбора.

Для этого распределяем полученные данные в таблицы подобным образом:

				Пока Результат <> Неопределено Цикл   
					
					
					Если НомерРекордсета = 1 Тогда
						
						Пока Не Результат.EOF Цикл 
							
							Таблица							= ТаблицаСотрудников;
							
							ТаблицаЗапись               	= Таблица.Добавить();
							
							ТаблицаЗапись.ИДСотрудника  	= Число(Результат.Fields("IDWorker").Value);
							ТаблицаЗапись.ФИОСотрудника	 	= СокрЛП(Строка(Результат.Fields("FIO").Value));
							ТаблицаЗапись.ИДОрганизации		= Число(Результат.Fields("IDCompany").Value);
							ТаблицаЗапись.ИмяОрганизации	= СокрЛП(Строка(Результат.Fields("NameCompany").Value));
							ТаблицаЗапись.ИДПодразделения   = Число(Результат.Fields("IDSection").Value);
							ТаблицаЗапись.ИмяПодразделения	= СокрЛП(Строка(Результат.Fields("NameDivision").Value));
							
							
							Результат.MoveNext();
							
						КонецЦикла; 
						
					ИначеЕсли НомерРекордсета = 2 Тогда
						
						Пока Не Результат.EOF Цикл 
							
							Таблица						= ТаблицаЗоны;
							
							ТаблицаЗапись               = Таблица.Добавить();
							
							ТаблицаЗапись.Идентификатор =  Число(Результат.Fields("ID").Value);
							ТаблицаЗапись.Значение 	    =  СокрЛП(Строка(Результат.Fields("Name").Value));  
							
							
							Результат.MoveNext();
							
						КонецЦикла;  
					ИначеЕсли НомерРекордсета = 3 Тогда
						
												
						Пока Не Результат.EOF Цикл 
							
							Таблица						= ТаблицаТурникетов;
							
							ТаблицаЗапись               = Таблица.Добавить();
							
							ТаблицаЗапись.Идентификатор =  Число(Результат.Fields("GIndex").Value);
							ТаблицаЗапись.Значение 	    =  СокрЛП(Строка(Результат.Fields("Name").Value));  
							
							
							Результат.MoveNext();
							
						КонецЦикла;  
						
					ИначеЕсли НомерРекордсета = 4 Тогда
						
						
						Пока Не Результат.EOF Цикл 
							
							Таблица						= ТаблицаСобытий;
							
							ТаблицаЗапись               = Таблица.Добавить();
							
							ТаблицаЗапись.Идентификатор =  Число(Результат.Fields("ID").Value);
							ТаблицаЗапись.Значение 	    =  СокрЛП(Строка(Результат.Fields("Name").Value));  
							
							
							Результат.MoveNext();
							
						КонецЦикла;  
						
					КонецЕсли;

					
					
					Результат 		= Результат.NextRecordSet();
					НомерРекордсета = НомерРекордсета + 1; 
					
				КонецЦикла;

Теперь загружаем полученные таблицы в параметры СКД и получаем данные из СКУД с учетом параметров и также распределяем данные событий. 

			Если Выборка <> Неопределено И НЕ Выборка.BOF Тогда 
				
				ТаблицаСКУД.Очистить();   
				
				Выборка.MoveFirst();
				Пока Не Выборка.EOF Цикл
					
					СтрокаТаблицаСКУД = ТаблицаСКУД.Добавить(); 
					
					СтрокаТаблицаСКУД.Время 			  = Дата(Выборка.Fields("TimeVal").Value);
					СтрокаТаблицаСКУД.Организация      	  = СокрЛП(Выборка.Fields("Company").Value);
					СтрокаТаблицаСКУД.Подразделение    	  = СокрЛП(Выборка.Fields("Division").Value);
					СтрокаТаблицаСКУД.Должность		 	  = СокрЛП(Выборка.Fields("Post").Value);
					
					Если ПолноеИмя Тогда
						СтрокаТаблицаСКУД.ФИО   		  = СокрЛП(Выборка.Fields("FIO").Value);
					Иначе	
					    СтрокаТаблицаСКУД.ФИО   		  = СокрЛП(Выборка.Fields("ShortFIO").Value);
					КонецЕсли;

					СтрокаТаблицаСКУД.ИДСотрудника		  = Число(Выборка.Fields("IDWoker").Value);
					СтрокаТаблицаСКУД.КраткоФИО     	  = СокрЛП(Выборка.Fields("ShortFIO").Value);
					СтрокаТаблицаСКУД.Комментарий 	      = СокрЛП(Выборка.Fields("Remark").Value); 
					СтрокаТаблицаСКУД.ВходВыход		      = Число(Выборка.Fields("Mode").Value); 

					Выборка.MoveNext();
					
				КонецЦикла;
			КонецЕсли;  

Для удобства пользователя ячейки отчета с выходными, итогами по дням и итогами по месяцу, слишком большим отклонением и отсутствием прохода были раскрашены в разные цвета. Чтобы пользователи всегда понимали какой цвет что обозначает, была создана Легенда цветов с обозначением каждого цвета.   

Каждое цветовое обозначение отчета представлено на второй картинке в описании.

Задача была формировать отчет независимо от того в какой конфигурации будет он формироваться, он должен работать. Как результат, отчет не привязан к объектам конфигурации, полностью собирает данные из СКУД и обрабатывает не используя данные конфигурации.

В заключении, таким образом был создан отчет, который показывает фактическое пребывание персонала на территории; показывает время прихода и ухода сотрудников; собирает данные в удобном представлении для пользователя и так как отчет на СКД использует все возможности отчетов СКД. Не используя при этом данные и объекты конфигурации 1С, что позволяет запускать его в любой конфигурации, которая имеет возможность чтобы взаимодействовать с базой данных пропускной системы.

Проверено на следующих конфигурациях и релизах:

  • Бухгалтерия предприятия КОРП, редакция 3.0, релизы 3.0.186.21
  • Бухгалтерия предприятия, редакция 3.0, релизы 3.0.186.21

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Зарплата Производство готовой продукции (работ, услуг) Учет рабочего времени Рабочее место Бизнес-аналитик Пользователь Руководитель проекта 1С:Предприятие 8 1С:Управление торговлей 10 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Торговля и склад 7.7 Бытовые услуги, сервис Оптовая торговля, дистрибуция, логистика Электротехника и микроэлектроника Управленческий учет Платные (руб)

Модуль или расширение «Сервисный центр для 1С» позволяет принимать в ремонт оборудование (компьютеры, бытовая техника и т.п.), оформлять заявки инженеров на посещение клиентов и вести начисление заработной платы для сотрудников. Позволяет наладить автоматизированный учет в сервисном центре на уже существующей базе.

18800 руб.

01.11.2012    106206    131    1    

140

Загрузка и выгрузка в Excel Зарплата Учет рабочего времени Бухгалтер 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Внешняя обработка, позволяет пакетно создать шаблоны по подразделениям для заполнения табеля в Excel, после чего загрузить заполненные шаблоны в документы ЗУП "Табель учета рабочего времени", «Данные для расчета зарплаты». Поддерживается заполнение до 6 видов рабочего времени. Тестировалась на ЗУП 3.1.25.40. Подключается как дополнительная внешняя обработка. Необходима версия платформы с 8.3.18.

7930 руб.

23.03.2017    64265    88    99    

101

Учет рабочего времени Пользователь 1С:Предприятие 8 Управленческий учет Платные (руб)

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

5084 руб.

29.08.2024    5223    6    2    

9

Печатные формы Учет рабочего времени Учет ОС и НМА Бухгалтер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1C:ERP Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Программа для автоматизации учета путевых листов в 1С - расширение, добавляющее в конфигурацию "ERP", документ Путевой лист и печатные формы установленных образцов для легковых и грузовых авто, расчет и списание нормативного количества топлива, отчет "Реестр путевых листов" с отбором по автомобилю и по водителю (через настройки) Позволит контролировать расход топлива, потому что сразу будет виден сверхнормативный расход.

25620 руб.

23.07.2025    4811    10    0    

10

Учет рабочего времени Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Абонемент ($m)

Расширение для конфигураций ЗУП 3.1 и 1С:ERP Управление предприятием 2, позволяющее настроить цвета для разных видов времени в документе "Табель".

1 стартмани

07.05.2024    4763    33    Dima69    5    

17
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. V.Nikonov 125 20.11.25 08:13 Сейчас в теме
А как решалась проблема Фильтрации событий?
При отсутствии Турникета, вполне может появиться ДВА последовательных прихода...
Может отсутствовать в Смену Приход или Уход?
Может быть несколько "Цехов" и работник по очереди их посещает...
В Ночную смену приход одной календарной датой, а уход на следующий день...
2. Brawler 466 20.11.25 13:39 Сейчас в теме
(1) Мы не пытались даже это решать запросом к СКУД. Сделана отдельная система с регистрами соответсивий сотров, подразделений, территорий.
Запилили регистр событий.
Еще один регистр событий вносимых через спец документ
И вот уже эти два регистра скрещиваешь в запросе и начинаешь играться с периодами, двойными входами и выходами, с разбивкой по территориям и тд и тп.
При этом введено понятие базы данных СКУД и можно параллельно из разных баз разного типа (каким обучишь систему) грести данные и консолидировать.
5. SVLong 46 20.11.25 18:13 Сейчас в теме
(2) может быть идея не плохая сделать отдельную базу, но это было бы излишне в рамках поставленной задачи.
7. Brawler 466 20.11.25 19:44 Сейчас в теме
(5) все в расширении в erp
9. V.Nikonov 125 21.11.25 11:30 Сейчас в теме
(2) А есть ли смысл хранить в Базе "Зеркало базы СКУД"? Подозреваю, что в Базу ИС записываются уже отфильтрованные события?

Я просто хотел полюбопытствовать: Какие преобразования (фильтрации) реализовывали?
10. Brawler 466 21.11.25 12:15 Сейчас в теме
(9) Смысл есть
Скачиваются многократно в течении дня данные, кадровики смотрят отчеты напиленные на скд, сверяют с табелями и тд и тп. Кому доплатить, кого наказать. Вводят, если нужно вручную документом события, которые в СКУД отсутствуют. Забыл пропуск, выключили свет еще ночью, с утра люди идут, перко не пашет, так запускают по записи, потом кадровики вносят вручную проходы.
Скачиваем из СКУД по территориям все события проходов и выходов. Проходы внутри территории предприятия и из наружи или в наружу научили систему отличать, ради отчетов.
А забыл, запилены свои графики работы, с указанием времени рабочего, переревыва, и нерабочего но с возможностью переработки, штрафуемые интервалы (на работе быть нужно за 10 мин до начала этой самой работы)
Регламентное задание обмена обеспечивает наличие данных текущего месяца и прошлого. Данные старые можно сносить, если кадрам не нужны. Есть и обработка позволяющая загружать разные периоды, хоть назад вернуть то что ранее снесли.
Прикрепленные файлы:
11. SVLong 46 21.11.25 13:44 Сейчас в теме
(10) а как часто происходит обмен со СКУД?
12. Brawler 466 21.11.25 14:11 Сейчас в теме
(11) каждый день, с 7 по 22, каждые 300 секунд
13. SVLong 46 21.11.25 14:25 Сейчас в теме
(12) Не сильно сеть нагружает у вас?
14. Brawler 466 21.11.25 14:44 Сейчас в теме
4. SVLong 46 20.11.25 18:10 Сейчас в теме
(1) если посмотреть инструкцию к СКУД, то там можно найти информацию о том что при записи существует несколько событий: прикладывание пропуска, есть доступ или нет и поворот турникета(это основные события). Отчёт учитывает именно когда турникет был провернут, то есть фактический вход или выход.
Что касается турникета, то на входе он есть.
Если подумать про цеха, то учитывается вход из внешней территории, на которой находятся все цеха.
А учёт по сменам происходит за счёт ограничения времени пребывания на территории предприятия.
3. sivatorov 20.11.25 15:56 Сейчас в теме
Не совсем понятно: статья называется СКУД RusGuard, а в статье написано, что СКУД Orion..
6. SVLong 46 20.11.25 18:15 Сейчас в теме
(3) orion и rusguard это части одной системы. Но вы правы, название нужно исправить на orion.
8. sivatorov 21.11.25 10:21 Сейчас в теме
(6) Скорее всего в Вашем случаи это так, а так это разные компании и разные устройства.
Просто у нас в компании используем компоненту для работы с RusGuard, которую представляет сама компания RusGuard.
Для отправки сообщения требуется регистрация/авторизация