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

19.11.25

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

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

Файлы

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

Наименование Скачано Купить файл
Анализ посещаемости по СКУД Orion
.erf 20,01Kb
0 3 050 руб. Купить

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

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

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

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

И вот не долго думая, не гадая, выбор пал на СКУД (Система Контроля и Управления Доступа). Проанализировав внимательно возможности системы которая имелась, а это была СКУД 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С:ERP Управление предприятием 2 1C:ERP Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

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

25200 руб.

23.07.2025    2542    7    0    

7

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

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

16800 руб.

01.11.2012    102246    122    1    

133

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

Программа «Путевой лист грузового автомобиля в 1С:БП 3.0» - заполнить, распечатать, сохранить. Вы можете не только внести всю информацию и распечатать путевой лист грузового автомобиля в 1С, но и повторно использовать ранее введенные данные спустя любое время - данные путевого листа водителя сохраняются в "1С:Бухгалтерия 3.0" без каких-либо доработок.

14400 руб.

23.08.2019    63546    199    65    

193

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

Конфигурация СКУД предназначена для выдачи пропусков с qr-кодами и для учета рабочего времени сотрудников. Кроме того, конфигурация подойдет для организации пропускной системы на предприятиях, при массовых мероприятиях и др.

12000 руб.

16.02.2018    45945    10    25    

18

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

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

7800 руб.

23.03.2017    63274    86    99    

100

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

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

5000 руб.

29.08.2024    4381    4    2    

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

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