В управлении ИТ-проектами одной из самых «болевых» точек для руководителя проекта (PM) является сбор достоверных данных о трудозатратах. Каждый руководитель, пытавшийся внедрить в своей команде обязательное ежедневное заполнение таймшитов (отчетов о рабочем времени), неизбежно сталкивался с глухим или активным сопротивлением со стороны разработчиков. Программисты — люди творческие и высокооплачиваемые, они искренне считают себя создателями интеллектуального продукта, а заполнение рутинных отчетов в учетной системе воспринимают как оскорбительную бюрократию («я не канцелярская крыса!»). В результате мы получаем либо саботаж и отказ от заполнения, либо формальное занесение «нарисованных» данных в конце недели или месяца, что полностью уничтожает ценность управленческого учета и планирования.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем психологические аспекты поведения ИТ-специалистов и предложим четыре действенных практических метода, которые помогут вам навести порядок в учете трудозатрат без потери лояльности команды.
Прежде чем внедрять новые регламенты, давайте выясним причины, по которым разработчики бойкотируют тайм-трекинг:
Если мы будем использовать исключительно административное давление и штрафы, то получим «итальянскую забастовку» или фальсификацию данных — программисты просто начнут подгонять свои часы под нормативные показатели, копируя текст из технических заданий. Нам же нужны реальные, точные данные для оценки себестоимости проектов и планирования будущих спринтов. Рассмотрим эффективные альтернативные подходы.
Игрофикация — это применение игровых механик в неигровых процессах для повышения вовлеченности пользователей. Если мы не можем полностью избавить программиста от рутины, давайте сделаем эту рутину частью игры. Рассмотрим, как это можно реализовать на базе вашей системы учета задач в 1С:
Такой подход кардинально меняет восприятие процесса: заполнение таймшита становится не повинностью, а способом получить приятные бонусы.
Часто программисты саботируют отчетность просто потому, что никогда не оказывались на месте руководителя проекта и не понимают, как собираются проектные метрики. Отличный способ развить эмпатию и понимание бизнес-процессов — временная ротация ролей.
Рассмотрим, как применить этот метод на практике. Выберите лидера саботажа (самого авторитетного разработчика, который принципиально отказывается заполнять отчеты) и назначьте его ответственным за небольшой блок работ или субпроект на период в 1–2 недели. В его обязанности теперь будет входить:
Сталкнувшись лично с необходимостью защищать бюджет проекта, объяснять заказчику «куда ушли 40 часов разработчиков на этой неделе» и пытаться собрать в кучу невнятные отписки коллег, ваш программист испытает мощный психологический сдвиг. Он быстро осознает, что детальный учет времени — это не прихоть руководителя, а критически важный инструмент выживания проекта. После возвращения к своей основной роли такие сотрудники, как правило, становятся самыми дисциплинированными заполнителями отчетов и помогают транслировать эту культуру остальной команде.
Давайте проанализируем, действительно ли нам необходимо контролировать каждую минуту нахождения программиста за компьютером? В современных Agile-методологиях (Scrum, Kanban) акцент смещается со времени (процесса) на результат (поставку ценности). Если бюджет вашего проекта не завязан жестко на оплату фактически отработанных часов (модель Time & Materials), а строится по фиксу (Fixed Price), то гораздо эффективнее контролировать выполнение конкретных задач в срок.
Организуем процесс следующим образом:
Самый лучший способ заставить программиста заполнять отчеты — сделать так, чтобы он этого не замечал. Мы должны максимально упростить интерфейсы 1С и автоматизировать сбор данных из рабочего окружения разработчика (например, из систем контроля версий Git, SVN или систем управления задачами вроде Jira, Яндекс.Трекер).
Давайте рассмотрим, как можно реализовать автоматический импорт трудозатрат в 1С на основе коммитов в репозиторий Git. Напишем пример кода для интеграции. Мы создадим HTTP-сервис в базе 1С, который будет принимать вебхуки (webhooks) от Git-сервера (например, GitLab или GitHub) при каждом пуше разработчика, анализировать комментарии к коммитам и автоматически создавать или заполнять документ ЕжедневныйОтчет.
Предположим, что разработчик коммитит код с комментарием вида: "Разработка роли КредитныйКонтроль (time: 2.5h)". Наша задача — поймать этот коммит, определить автора по его почте и записать время в 1С.
Создадим метод HTTP-сервиса в нашей конфигурации 1С:
Функция ОбработатьWebhookGit(Запрос)
// Получаем тело запроса от Git-сервера
ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
// Инициализируем чтение JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
ДанныеGit = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Проверяем наличие коммитов в пакете пуша
Если ДанныеGit.Свойство("commits") Тогда
Для Каждого Коммит Из ДанныеGit.commits Цикл
АвторEmail = Коммит.author.email;
Сообщение = Коммит.message;
ДатаКоммита = НайтиДатуКоммита(Коммит.timestamp);
// Находим сотрудника в нашей базе 1С по адресу электронной почты
СотрудникСсылка = Справочники.ФизическиеЛица.НайтиПоРеквизиту("Email", АвторEmail);
Если ЗначениеЗаполнено(СотрудникСсылка) Тогда
// Парсим время и описание работы из текста коммита
СтруктураДанныхРаботы = РазобратьСообщениеКоммита(Сообщение);
Если СтруктураДанныхРаботы.Время > 0 Тогда
// Регистрируем трудозатраты в базе данных
ЗаписатьТрудозатратыВ1С(СотрудникСсылка, ДатаКоммита, СтруктураДанныхРаботы.Описание, СтруктураДанныхРаботы.Время);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Возвращаем успешный ответ Git-серверу
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json");
Ответ.УстановитьТелоИзСтроки("{""status"":""success""}");
Возврат Ответ;
КонецФункции
Теперь разберем вспомогательную функцию РазобратьСообщениеКоммита, которая будет извлекать время работы из текста комментария:
Функция РазобратьСообщениеКоммита(ТекстСообщения)
Результат = Новый Структура;
Результат.Вставить("Описание", ТекстСообщения);
Результат.Вставить("Время", 0);
// Ищем маркер времени в формате "(time: X.Xh)"
ПозМаркера = СтрНайти(ТекстСообщения, "time:");
Если ПозМаркера > 0 Тогда
ЧастьСтрокиВремени = Сред(ТекстСообщения, ПозМаркера + 5);
ПозБуквыH = СтрНайти(ЧастьСтрокиВремени, "h");
Если ПозБуквыH > 0 Тогда
СтрокаЧисла = СокрЛП(Лев(ЧастьСтрокиВремени, ПозБуквыH - 1));
Попытка
Результат.Время = Число(СтрокаЧисла);
// Очищаем описание от служебного тега времени
Результат.Описание = СокрЛП(Лев(ТекстСообщения, ПозМаркера - 1));
Исключение
Результат.Время = 0;
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
И, наконец, проанализируем процедуру ЗаписатьТрудозатратыВ1С, которая создает или обновляет документ ЕжедневныйОтчет сотрудника за указанную дату:
Процедура ЗаписатьТрудозатратыВ1С(Сотрудник, ДатаРаботы, Описание, Время)
// Ищем существующий документ за эту дату для данного сотрудника
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕжедневныйОтчет.Ссылка КАК Ссылка
|ИЗ
| Документ.ЕжедневныйОтчет КАК ЕжедневныйОтчет
|ГДЕ
| ЕжедневныйОтчет.Сотрудник = &Сотрудник
| И НАЧАЛОПЕРИОДА(ЕжедневныйОтчет.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ДатаРаботы, ДЕНЬ)
| И ЕжедневныйОтчет.Проведен = ИСТИНА";
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
Запрос.УстановитьПараметр("ДатаРаботы", ДатаРаботы);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
// Создаем новый отчет
ДокОбъект = Документы.ЕжедневныйОтчет.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Сотрудник = Сотрудник;
Иначе
// Открываем существующий для редактирования
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
КонецЕсли;
// Добавляем новую строку в табличную часть выполненных работ
НоваяСтрока = ДокОбъект.Работы.Добавить();
НоваяСтрока.ОписаниеРаботы = Описание;
НоваяСтрока.ВремяВЧасах = Время;
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("ИнтеграцияGit", УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Внедрение такой технической схемы кардинально снижает нагрузку на программиста. Все, что ему нужно сделать — это написать стандартный осмысленный комментарий при фиксации своего кода (что само по себе является правилом хорошего тона в разработке). Документ в 1С будет сформирован, заполнен и проведен автоматически в фоновом режиме.
Для того чтобы новые подходы прижились в вашей команде, рекомендуем действовать последовательно:
Сочетание психологического вовлечения (игрофикации), развития эмпатии (через ротацию ролей) и технического упрощения процессов (интеграция 1С с Git) позволит вам полностью решить проблему саботажа и выстроить прозрачный, эффективный и экологичный учет рабочего времени на ваших ИТ-проектах.