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