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