Всім привіт. є дані. УПП для України 1.3, Платформа 8.3.10, прості форми Як можна в запиті вибрати запис з меншою датою із записів, які відрізняються між собою декількома секундами і залишити один.
Тобто виключити так звані дублі із різницею в 1-2 секунди.
Запит додаю:
ВЫБРАТЬ
РеєстрСистемиКонтролюДоступу.Период КАК Период,
РеєстрСистемиКонтролюДоступу.Вид,
РеєстрСистемиКонтролюДоступу.devName,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.ФизическоеЛицо <> НЕОПРЕДЕЛЕНО
ТОГДА РеєстрСистемиКонтролюДоступу.ФизическоеЛицо
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК ФизическоеЛицо,
ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, ДЕНЬ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, НЕДЕЛЯ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, МЕСЯЦ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, ДЕКАДА)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, КВАРТАЛ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, ПОЛУГОДИЕ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, ГОД)
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК Периодичность,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Входящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Вид
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК ВидВхідне,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Исходящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Вид
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК ВидВихідне,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Входящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Период
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК ВремяВход,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Исходящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Период
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК ВремяВыход,
ДЕНЬ(РеєстрСистемиКонтролюДоступу.Период) КАК ПериодДень
ИЗ
РегистрСведений.РеєстрСистемиКонтролюДоступу КАК РеєстрСистемиКонтролюДоступу
ГДЕ
РеєстрСистемиКонтролюДоступу.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
РеєстрСистемиКонтролюДоступу.Период,
РеєстрСистемиКонтролюДоступу.Вид,
РеєстрСистемиКонтролюДоступу.devName,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.ФизическоеЛицо <> НЕОПРЕДЕЛЕНО
ТОГДА РеєстрСистемиКонтролюДоступу.ФизическоеЛицо
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ
привести дату до дати без секунд і вибрати мінімальне з групуванняям по датіБезСекунд
Для прикладу...
це дані із системи входу-виходу працівників
людина зайшла о 9:00:00
система собі добавила два записи
9:00:01
9:00:02
потім людина вийшла о 10:00:00
і
зайшла о 11:00:00
і знов система продублювала
11:00:01
11:00:02
і потім людина знову
вийшла о 15:00:00
потрібно запишити такі записи
зайшла о 9:00:00
вийшла о 10:00:00
зайшла о 11:00:00
вийшла о 15:00:00
kolkovyj @ Сегодня, 12:52
,
Ну sava1 правильно написал, если у Вас дубли идут в пределах секунд 0-9 то просто режь(округляй) последню цифру, а потом минимум с группировкой;
Зробив осьь так в запиті.
НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, МИНУТА)
і дублі забрало
kolkovyj @ Сегодня, 15:11
,
как вариант еще можно запись в регистр сведений писать дату всегда с 00 секунд ( будет замещать ) и все.
а як тепер порахувати час між виходом і входом?
РазностьДат(ВремяВыход, ВремяВход,Час) не хоче працювати.
Тобто при створенні поля видає помилку , що неправильні параметри.
kolkovyj @ Сегодня, 18:53
,
Думаю, что тут проблема в типах. Теоретически ВремяВход и ВремяВыход может быть НЕОПРЕДЕЛЕНО, а РазностьДат() актуально только для Даты. Замените НЕОПРЕДЕЛЕНО, например, на ДАТАВРЕМЯ(1,1,1,0,0,0)
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Входящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Период
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК ВремяВход,
TohaMonster @ Вчера, 18:11
,
Разностьдат працює, але різниця в датах виходить між Времявхлод і ДАТАВРЕМЯ(1,1,1,0,0,0), і відповідно між Времявиход і ДАТАВРЕМЯ(1,1,1,0,0,0)
Як це виправити, підкажіть будь ласка?
Фактично потрібно взяти дату-час виходу відняти від дати-часу входу, навіть,якщо дати в різних днях. Якщо це початок місяця, і 1го числа є тільки дата виходу то взнайти різницю між датою виходу і 24:00 годиною. відповідно і кінцем місяця..датою входу і 24:00 годиною якщо не було виходу в цей останній день.
Даний звіт будую на СКД. Чи можна це реалізувати в запиті, чи може в функціоналі СКД це реалізувати?
ось такий вигляд має зараз звіт
kolkovyj @ Сегодня, 11:38
,
По разности времени в шапке темы вы такого не описывали, у Вас был вопрос как убрать дубли
Если я правильно понимаю вы хотите отчет по сотрудникам вход-выход; и время , т.е задача по табелированию типа через турникет ( тут и регистр сведений);
Я б вам рекомендовал написать 2 запроса - 1 события выхода 2 события входа ; потом их ОБЪЕДЕНИТЬ с условием период день и группировать Сотрудник, Дата; У Вас буду все готовые поля для СКД
Profi_1C77 @ Сегодня, 12:38
,
Так теж не йде(
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, МИНУТА) КАК Период1,
РеєстрСистемиКонтролюДоступу.Вид КАК Вид1,
РеєстрСистемиКонтролюДоступу.ФизическоеЛицо КАК ФизическоеЛицо1,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Входящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Период
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ КАК ВремяВходящее1
ПОМЕСТИТЬ ВТВходящие
ИЗ
РегистрСведений.РеєстрСистемиКонтролюДоступу КАК РеєстрСистемиКонтролюДоступу
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, МИНУТА) КАК Период2,
РеєстрСистемиКонтролюДоступу.ФизическоеЛицо КАК ФизическоеЛицо2,
РеєстрСистемиКонтролюДоступу.Вид КАК Вид2,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Исходящее)
ТОГДА РеєстрСистемиКонтролюДоступу.Период
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ КАК ВремяИсходящее2
ПОМЕСТИТЬ ВТИсходищее
ИЗ
РегистрСведений.РеєстрСистемиКонтролюДоступу КАК РеєстрСистемиКонтролюДоступу
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТИсходищее.ВремяИсходящее2 КАК ВремяИсходящее3,
ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, ДЕНЬ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Неделя)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, НЕДЕЛЯ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Месяц)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, МЕСЯЦ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Декада)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, ДЕКАДА)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Квартал)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, КВАРТАЛ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Полугодие)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, ПОЛУГОДИЕ)
ИНАЧЕ ВЫБОР
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.Год)
ТОГДА НАЧАЛОПЕРИОДА(ВТИсходищее.Период2, ГОД)
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК Периодичность3,
РАЗНОСТЬДАТ(ВТИсходищее.ВремяИсходящее2, ВТВходящие.ВремяВходящее1, ЧАС) КАК РазностьДат3,
ВТВходящие.ВремяВходящее1 КАК ВремяВходящее3,
ВТВходящие.ФизическоеЛицо1 КАК ФизическоеЛицо3,
ВТИсходищее.Период2 КАК Период3
ИЗ
ВТВходящие КАК ВТВходящие
ПОЛНОЕ СОЕДИНЕНИЕ ВТИсходищее КАК ВТИсходищее
ПО ВТВходящие.ФизическоеЛицо1 = ВТИсходищее.ФизическоеЛицо2
И ВТВходящие.Период1 = ВТИсходищее.Период2
ГДЕ
ВТИсходищее.Период2 МЕЖДУ &НачалоПериода И &КонецПериода
НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, День) КАК ДатаСобытия,
РеєстрСистемиКонтролюДоступу.ФизическоеЛицо КАК ФизическоеЛицо ,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Входящее)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, МИНУТА)
КОНЕЦ КАК ВремяВхода;
2 Запрос
НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, День) КАК ДатаСобытия,
РеєстрСистемиКонтролюДоступу.ФизическоеЛицо КАК ФизическоеЛицо ,
ВЫБОР
КОГДА РеєстрСистемиКонтролюДоступу.Вид = ЗНАЧЕНИЕ(Перечисление.ВходящееИсходящееСобытие.Исходящее)
ТОГДА НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, МИНУТА)
КОНЕЦ КАК ВремяВыхода;
Дякую всім за допомогу, є ще одна ідея, для роздумів.
Можливо це спростить завдання.
Тобто фактично потрібно порахувати час між входом і виходом за день ,якщо їх було декілька то додати один до одного .
ну і відповідно це помістити в таблицю
ПІБ РОБОЧИЙ ЧАС
01.12.24 02.12.24
Іваненко 12 10
ось таким кодом я відсіяв дублі з різницею в 1-2 секунди і вибрав дані по взходу і виходу людини
ВЫБРАТЬ различные
РеєстрСистемиКонтролюДоступу.ФизическоеЛицо КАК ФизическоеЛицо,
НАЧАЛОПЕРИОДА(РеєстрСистемиКонтролюДоступу.Период, минута) как Период,
РеєстрСистемиКонтролюДоступу.Вид КАК Вид
ИЗ
РегистрСведений.РеєстрСистемиКонтролюДоступу КАК РеєстрСистемиКонтролюДоступу
ГДЕ
РеєстрСистемиКонтролюДоступу.ФизическоеЛицо = &ФизЛицо и
РеєстрСистемиКонтролюДоступу.Период МЕЖДУ &началоПериода И &КонецПериода
kolkovyj @ Сегодня, 1:05
,
Я решал похожую задачу следующим образом
1. Сортируем события по времени, присваиваем каждому событию НомПП
2. Выбираем все пары, где НомПП - вход, НомПП+1 - выход
3. Для каждой пары вычисляем интервал и складываем их в пределах дня.
4. Остальные "шумы", которые не найдут себе пару, не учитываем
Например
08:00:01 Вход
08:00:03 Вход
17:01:03 Выход
17:01:04 Выход
1. 08:00:01 Вход - шум
2. 08:00:03 Вход - пара1 (9 часов)
3. 17:01:03 Выход - пара1
4. 17:01:04 Выход - шум
ДатаВремя можно представить как какую-то дату + количество секунд, Например Дата(2020, 1, 1) + 157766400 = 01.01.2025 .
Тогда можно сделать накопительный регистр, в котором вход будет расходом, выход приходом, будет достаточно быстро считать за любой период.
xlmel @ Сегодня, 14:33
,
Задача не така проста в загальному вигляді.
Цікаво, чи автор розглядає нічні зміни, які як правило зміщені в часі і переходять на наступну добу, і інші види виробничих календарів?
с ночными сменами проблем нет. Пусть нулевая дата 19.12.2024. человек вошел в офис в 20-00, это 72000, а вышел в 4-00 20.12.2024 - это 100800. В итоге добавится 28800, или 8 часов.
если интересует накопление времени, которое человек провел в офисе, то вот это и будет решением.
Зробив по іншому як планувалось. Не в СКД
Запит - цикл-ТЗ-Запит..далі ще в процесі
Як дороблю повністю викладу сюда. Можливо комусь буде цікаво і корисно.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua