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