ПеремConnection Экспорт;
Перем _ТаблицаЗагрузки Экспорт;
//при открытии формы основные данные для строки подключения к БД
Процедура ПриОткрытии()
Сервер = "192.168.9.50";
БД = "tc-db-log";
Порт = "3305";
Логин = "root";
Пароль = "";
Driver = "{MySQL ODBC 5.1 Driver}";
//Подразделение=мДокументОбъект.ПодразделениеОрганизации;
//ДатаНачала=мДокументОбъект.неоДатаНачалаПериода;
//ДатаОкончания=мДокументОбъект.неоДатаОкончанияПериода;
КонецПроцедуры
//подключение к базе
Процедура ПодключитьсяНажатие(Элемент)
ConString = "Driver="+СокрЛП(Driver)+"; SERVER="+Сервер+"; Port="+Порт+"; Database="+БД+"; Uid="+Логин+"; PWD="+Пароль+"";
Connection = НовыйCOMОбъект("ADODB.Connection");
Connection.CommandTimeOut= 600;
Попытка
Connection.Open(ConString);
ЭлементыФормы.Подключиться.Доступность = Ложь;
ЭлементыФормы.Отключится.Доступность = Истина;
Сообщить("Сервер: "+Сервер+":"+Порт+" Подключен!"+" "+"Доступна база"+" "+БД+"!!!");
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("Строка подключения: " + ConString, СтатусСообщения.Информация);
Возврат;
КонецПопытки;
ЭтотОбъект.ПодключитьсяКБазеСотрудниковВСКУД();
КонецПроцедуры
//отключение от базы
Процедура ОтключитсяНажатие(Элемент)
Connection.Close();
Сообщить("Сервер: "+Сервер+":"+Порт+" Отключен!"+" "+"Отключена база"+" "+БД+"!!!");
ЭлементыФормы.Подключиться.Доступность = Истина;
ЭлементыФормы.Отключится.Доступность = Ложь;
ЭтотОбъект.ОтключитьсяОтБазыСотрудниковВСКУД();
КонецПроцедуры
//процедура создает описание таблицы значений в которой будут храниться события в СКУД
|
Процедура СоздатьТаблицуЗагрузкиДанныхSKUD()
_ТаблицаЗагрузки = Новый ТаблицаЗначений;
_ТаблицаЗагрузки.Колонки.Добавить("LOGTIME",ОбщегоНазначения.ПолучитьОписаниеТиповДаты(ЧастиДаты.ДатаВремя));
_ТаблицаЗагрузки.Колонки.Добавить("LEMPHINT",ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(4,0));
КонецПроцедуры
//процедура загружает в таблицу значений данные
Процедура КнопкаНажатиеНажатие(Элемент)
Сотрудники.Очистить();
ЭтотОбъект.ПолучитьДанныеТаблицыPersonalбазыMain();
//ЗагрузитьТаблицуЗначенийДаннымиИзТаблицыLOGS();
Запрос=Новый Запрос("ВЫБРАТЬ
| ТТ.TABID,
| ТТ.ID
|ПОМЕСТИТЬ ВТТабб
|ИЗ
| &Табб КАК ТТ");
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Табб",_ТаблицаЗагрузкиСотрудников);
Запрос.Выполнить();
ЗапросТМП=Новый Запрос("ВЫБРАТЬ
| ВТТабб.ID,
| ВТТабб.TABID,
| РаботникиОрганизацийСрезПоследних.Сотрудник,
| РаботникиОрганизацийСрезПоследних.КодРабочегоМеста,
| РаботникиОрганизацийСрезПоследних.ГрафикРаботы КАК График,
| ШтатноеРасписаниеОрганизацийСрезПоследних.ШПЗ
|ИЗ
| ВТТабб КАК ВТТабб
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Дата,) КАК РаботникиОрганизацийСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(&Дата,) КАК ШтатноеРасписаниеОрганизацийСрезПоследних
| ПО РаботникиОрганизацийСрезПоследних.КодРабочегоМеста = ШтатноеРасписаниеОрганизацийСрезПоследних.КодРабочегоМеста
| ПО ВТТабб.TABID = РаботникиОрганизацийСрезПоследних.Сотрудник.Код");
|
Если ЗначениеЗаполнено(Подразделение) Тогда
ЗапросТМП.Текст=ЗапросТМП.Текст+"
|ГДЕ
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации = &ПодразделениеОрганизации";
ИначеЕсли
ЗначениеНеЗаполнено(Подразделение) и ЗначениеЗаполнено(Сотрудник) Тогда
ЗапросТМП.Текст=ЗапросТМП.Текст+"
|ГДЕ
| РаботникиОрганизацийСрезПоследних.Сотрудник = &Сотрудник";
ЗапросТМП.Текст=ЗапросТМП.Текст+"
|";
КонецЕсли;
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
ЗапросТМП.УстановитьПараметр("Дата",ДатаНачала);
ЗапросТМП.УстановитьПараметр("ПодразделениеОрганизации",Подразделение);
ЗапросТМП.УстановитьПараметр("Сотрудник",Сотрудник);
_Выборка = ЗапросТМП.Выполнить().Выбрать();
_КоличествоСотрудников=_Выборка.Количество();
_форма=ЭтотОбъект.ПолучитьФорму("ФормаИндикатор");
_форма.Открыть();
Индикатор=_форма.ЭлементыФормы.Индикатор;
Индикатор.МаксимальноеЗначение=_КоличествоСотрудников;
Пока _Выборка.Следующий() Цикл
_строкатаб=Сотрудники.Добавить();
_строкатаб.Сотрудник=_Выборка.Сотрудник;
//_индекс=ЭтотОбъект.ПолучитьIDСотрудникаПоТабельномуНомерубазыMain(СокрЛП(_Выборка.Сотрудник.Код));
IDСтрокой=Строка(_Выборка.ID);
_IDСтрокой=СтрЗаменить(IDСтрокой, Символы.НПП, "");
_ID=_IDСтрокой;
ЗагрузитьТаблицуЗначенийДаннымиИзТаблицыLOGS(_ID);
_строкатаб.КодРабочегоМеста=_Выборка.КодРабочегоМеста;
_строкатаб.График=_Выборка.График;
_строкатаб.ШПЗ=_Выборка.ШПЗ;
ЗаполнитьСтрокуОтработанногоВремениТабеля(_строкатаб);
|
Индикатор.Значение=Индикатор.Значение+1;
_форма.ЭлементыФормы.надпись.заголовок="Загружаем данные объекта доступа из SKUD"+" "+_строкатаб.Сотрудник;
КонецЦикла;
_форма.Закрыть();
КонецПроцедуры
//Процедура заполняет структуру рабочего дня
Процедура ЗаполнитьСтрокуОтработанногоВремениТабеля(строкаТЧ)
Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГрафикиРаботыПоСменам.Дата КАК Дата,
| ГрафикиРаботыПоСменам.Часы КАК Часы,
| ГрафикиРаботыПоСменам.ВечерниеЧасы КАК ВечерниеЧасы,
| ГрафикиРаботыПоСменам.НочныеЧасы КАК НочныеЧасы,
| ГрафикиРаботыПоСменам.ГрафикРаботы КАК ГрафикРаботы,
| ГрафикиРаботыПоСменам.Смена КАК Смена,
| ВЫБОР
| КОГДА ГрафикиРаботыПоСменам.ГрафикРаботы = &ГрафикРаботы
| ТОГДА ДОБАВИТЬКДАТЕ(ГрафикиРаботыПоСменам.Дата, ЧАС, 8)
| КОНЕЦ КАК ДатаНачалоРабочегоДняПоГрафику,
| ВЫБОР
| КОГДА ГрафикиРаботыПоСменам.Часы> 0
| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ГрафикиРаботыПоСменам.ГрафикРаботы = &ГрафикРаботы
| ТОГДА ДОБАВИТЬКДАТЕ(ГрафикиРаботыПоСменам.Дата, ЧАС, 8)
| КОНЕЦ, ЧАС, ГрафикиРаботыПоСменам.Часы + 1)
| КОНЕЦ КАК ДатаОкончанияРабочегоДняПоГрафику
|ИЗ
| РегистрСведений.ГрафикиРаботыПоСменам КАК ГрафикиРаботыПоСменам
|ГДЕ
| ГрафикиРаботыПоСменам.ГрафикРаботы = &ГрафикРаботы
| И ГрафикиРаботыПоСменам.Дата МЕЖДУ &Дата1 И &Дата2
|
|УПОРЯДОЧИТЬ ПО
| Дата";
Запрос.УстановитьПараметр("Дата1",ДатаНачала);
Запрос.УстановитьПараметр("Дата2",ДатаОкончания);
Запрос.УстановитьПараметр("ГрафикРаботы",строкаТЧ.График);
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
_строкаДнем=Строка(День(Выборка.Дата));
_дата_контроль_ранняя=ПолучитьДатуПроходаСотрудника(Выборка.Дата);
_дата_контроль_поздняя=ПолучитьДатуУходаСотрудника(Выборка.Дата);
//день входа по графику
_НачалоСмены=ПолучитьДеньНачалаСменыПоГрафику(строкаТЧ.График);
_ОкончаниеСмены=ПолучитьДеньОкончанияСменыПоГрафику(строкаТЧ.График);
Если _дата_контроль_ранняя<_НачалоСмены и _дата_контроль_поздняя>_ОкончаниеСмены и ИспользоватьФактическоеВремяПрисутствия=Ложь тогда
_разница_регистрация=ПолучитьРазницуВРегисрацииВSKUDФактическогоВремениПрохода(_НачалоСмены, _ОкончаниеСмены);
ИначеЕсли _дата_контроль_ранняя<_НачалоСмены и _дата_контроль_поздняя>_ОкончаниеСмены и ИспользоватьФактическоеВремяПрисутствия=Ложь и Сверхурочно=Истина ТОгда
_разница_регистрация_сверхурочно=ПолучитьРазницуВРегисрацииВSKUDФактическогоВремениПрохода(_дата_контроль_поздняя, _ОкончаниеСмены);
ИначеЕсли _дата_контроль_ранняя<_НачалоСмены и _дата_контроль_поздняя>_ОкончаниеСмены и ИспользоватьФактическоеВремяПрисутствия=Истина тогда
_разница_регистрация=ПолучитьРазницуВРегисрацииВSKUDФактическогоВремениПрохода(_дата_контроль_ранняя, _дата_контроль_поздняя);
КонецЕсли;
//_разница_регистрация=ПолучитьРазницуВРегисрацииВSKUDФактическогоВремениПрохода(_дата_контроль_ранняя, _дата_контроль_поздняя);
Если строкаТЧ.График.ВидГрафика=Перечисления.ВидыРабочихГрафиков.Пятидневка Тогда
Если Сверхурочно=ложь Тогда
строкаТЧ["День"+_строкаДнем] = "Я"+" "+Строка(_разница_регистрация);
Иначе
строкаТЧ["День"+_строкаДнем] = "Я"+" "+Строка(_разница_регистрация)+" "+"С"+Строка(_разница_регистрация_сверхурочно);
КонецЕсли;
ИначеЕсли строкаТЧ.График.ВидГрафика=Перечисления.ВидыРабочихГрафиков.Сменный Тогда
строкаТЧ["День"+_строкаДнем] = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьДеньНачалаСменыПоГрафику(График)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект = &Объект
| И ЗначенияСвойствОбъектов.Свойство = &Свойство";
Запрос.УстановитьПараметр("Объект",График);
Запрос.УстановитьПараметр("Свойство",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("00141"));
Выборка= Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
_дата=Выборка.Значение;
КонецЦикла;
Возврат _дата;
КонецФункции
Функция ПолучитьДеньОкончанияСменыПоГрафику(График)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Значение
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект = &Объект
| И ЗначенияСвойствОбъектов.Свойство = &Свойство";
Запрос.УстановитьПараметр("Объект",График);
Запрос.УстановитьПараметр("Свойство",ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("00142"));
Выборка= Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
_дата=Выборка.Значение;
КонецЦикла;
Возврат _дата;
КонецФункции
//процедура загружает в таблицу значений данные
Процедура ЗагрузитьТаблицуЗначенийДаннымиИзТаблицыLOGS(ИндексСотрудника)
_Стр = ПолучитьТекстЗапросаБазыMySql(ИндексСотрудника);
Table = Connection.Execute(_Стр);
СоздатьТаблицуЗагрузкиДанныхSKUD();
Пока Table.EOF() = 0 do
Value1=Table.Fields("LOGTIME").Value; // текстовоеполе
//Value2=Table.Fields("LOGDATA").Value;//
Value3=Table.Fields("EMPHINT").Value;//
//
//Сообщить(Value1);
//Сообщить(Value2);
//Сообщить(Value3);
_строка = _ТаблицаЗагрузки.Добавить();
_строка.LOGTIME = Value1;
_строка.LEMPHINT = Value3;
Table.MoveNext();
КонецЦикла;
Table.Close();
КонецПроцедуры
Функция ПолучитьРазницуВРегисрацииВSKUDФактическогоВремениПрохода(_дата_начала, _дата_окончания);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВЫБОР
| КОГДА &ПараметрСверхурочно = ЛОЖЬ
| ТОГДА РАЗНОСТЬДАТ(&Дата1, &Дата2, ЧАС) - 1
| ИНАЧЕ РАЗНОСТЬДАТ(&Дата1, &Дата2, ЧАС)
| КОНЕЦ КАК Результат";
Запрос.УстановитьПараметр("Дата1",_дата_начала);
Запрос.УстановитьПараметр("Дата2",_дата_окончания);
Запрос.УстановитьПараметр("ПараметрСверхурочно",Сверхурочно);
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
_разница=Выборка.Результат;
КонецЦикла;
Возврат _разница;
КонецФункции
//получим из таблицы LOGS дату прохода сотрудника
Функция ПолучитьДатуПроходаСотрудника(ДатаРегистрации)
Запрос=Новый Запрос("ВЫБРАТЬ
| Т.LOGTIME
|ПОМЕСТИТЬ ВТТаб
|ИЗ
| &Таб КАК Т");
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Таб",_ТаблицаЗагрузки);
Запрос.Выполнить();
ЗапросТМП=Новый Запрос("ВЫБРАТЬ
| МИНИМУМ(ВТТаб.LOGTIME) КАК LOGTIME
|ИЗ
| ВТТаб КАК ВТТаб
|ГДЕ
| ВТТаб.LOGTIME МЕЖДУ &ДатаРегистрацииНачало И&ДатаРегистрацииКонец");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
ЗапросТМП.УстановитьПараметр("ДатаРегистрацииНачало",НачалоДня(ДатаРегистрации));
ЗапросТМП.УстановитьПараметр("ДатаРегистрацииКонец",КонецДня(ДатаРегистрации));
Выборка = ЗапросТМП.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
_РаняяДатаПрихода=Выборка.LOGTIME;
КонецЦикла;
Возврат _РаняяДатаПрихода;
КонецФункции
//аналогично из таблицы LOGS на дату ухода сотрудника
Функция ПолучитьДатуУходаСотрудника(ДатаРегистрации)
Запрос=Новый Запрос("ВЫБРАТЬ
| Т.LOGTIME
|ПОМЕСТИТЬ ВТТаб
|ИЗ
| &Таб КАК Т");
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Таб",_ТаблицаЗагрузки);
Запрос.Выполнить();
ЗапросТМП=Новый Запрос("ВЫБРАТЬ
| МАКСИМУМ(ВТТаб.LOGTIME) КАК LOGTIME
|ИЗ
| ВТТаб КАК ВТТаб
|ГДЕ
| ВТТаб.LOGTIME МЕЖДУ &ДатаРегистрацииНачало И&ДатаРегистрацииКонец");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
ЗапросТМП.УстановитьПараметр("ДатаРегистрацииНачало",НачалоДня(ДатаРегистрации));
ЗапросТМП.УстановитьПараметр("ДатаРегистрацииКонец",КонецДня(ДатаРегистрации));
Выборка = ЗапросТМП.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
_ПоздняяДатаПрихода=Выборка.LOGTIME;
КонецЦикла;
Возврат _ПоздняяДатаПрихода;
КонецФункции
//функция получает разницу во времени между зафиксированными в проходной датами
//Функция ПолучитьРазницуВРегисрацииВSKUDФактическогоВремениПрохода(_дата_контроль_ранняя, _дата_контроль_поздняя)
// Запрос = Новый Запрос;
// Запрос.Текст = "ВЫБРАТЬ
// | РАЗНОСТЬДАТ(&Дата1, &Дата2, ЧАС) - 1 КАК Разница";
// Запрос.УстановитьПараметр("Дата1",_дата_контроль_ранняя);
// Запрос.УстановитьПараметр("Дата2",_дата_контроль_поздняя);
// Выборка=Запрос.Выполнить().Выбрать();
// Пока Выборка.Следующий() Цикл
// _РазностьДат=Выборка.Разница;
// КонецЦикла;
// Возврат _РазностьДат;
//КонецФункции
//преобразуем параметры дата начала и конец в формат MySQL
Функция ПреобразоватьДатуНачалаВЗначениеMySQL()
_ДатаНачала=Формат(ДатаНачала,"ДФ=yyyy-MM-dd");
Возврат _ДатаНачала;
КонецФункции
Функция ПреобразоватьДатуОкончанияВЗначениеMySQL()
_ДатаКонец=Формат(ДатаОкончания,"ДФ=yyyy-MM-dd");
Возврат _ДатаКонец;
КонецФункции
// функция получает текст запроса в MySql
Функция ПолучитьТекстЗапросаБазыMySql(ИдентификаторВБазе)
Возврат "SELECT `ID`, `LOGTIME`, `AREA`, `LOGDATA`, `EMPHINT`, `DEVHINT` FROM `logs` WHERE DATE(LOGTIME) BETWEEN"+" "+"'"+ПреобразоватьДатуНачалаВЗначениеMySQL()+"'"+" "+"AND"+" "+"'"+ПреобразоватьДатуОкончанияВЗначениеMySQL()+"'"+" "+"AND EMPHINT="+ИдентификаторВБазе+" "+"AND (hex(LOGS.LOGDATA) LIKE 'FE06______03%')";
КонецФункции
//пока пустая
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
// Вставить содержимое обработчика.
КонецПроцедуры
//настройка времени
Процедура Кнопка1Нажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.УстановитьПериод(ДатаНачала,?(ДатаОкончания='0001-01-01', ДатаОкончания, КонецДня(ДатаОкончания)));
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
Если НастройкаПериода.Редактировать() Тогда
ДатаНачала = НастройкаПериода.ПолучитьДатуНачала();
ДатаОкончания = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры