Разработка и Конфигурация · 12 мин
Расчет регистров в 1С: что это и как работают регистры расчета
Что такое расчет регистров в 1С, как устроены регистры расчета, виды расчета, перерасчеты, сторнирование и формулы. Практическое руководство с примерами.
Фраза «расчет регистров в 1С» обычно означает одно из двух: либо работу с объектом конфигурации «Регистр расчета» — механизмом периодических расчетов зарплаты, отпускных, больничных и прочих начислений, либо процедуру пересчета итогов регистров накопления и сведений. Чаще всего под этим запросом скрывается именно первая задача: разобраться, как в 1С устроен расчет заработной платы через регистры расчета и почему сумма в расчетном листке получилась именно такой.
Регистр расчета — это специализированный механизм платформы 1С:Предприятие, созданный для сложных периодических расчетов. В отличие от регистра накопления, он умеет хранить не только результат, но и сам алгоритм: вид расчета, базовый период, график работы, формулу, вытесняющие начисления. Благодаря этому система автоматически рассчитывает зависимые начисления (например, премию процентом от оклада) и умеет выполнять перерасчеты при изменении исходных данных задним числом.
Механизм регистров расчета лежит в основе конфигураций «1С:Зарплата и управление персоналом» (ЗУП) и зарплатных блоков других решений. Понимание его устройства нужно и расчетчику зарплаты, который проверяет корректность начислений, и разработчику, который дорабатывает формулы видов расчета.
Что такое регистр расчета и чем он отличается от других регистров
В платформе 1С существует четыре основных типа регистров: сведений, накопления, бухгалтерии и расчета. Первые три хранят данные — факты, обороты, проводки. Регистр расчета хранит еще и логику вычисления: каждая запись связана с видом расчета, в котором задана формула, и с графиком, определяющим норму времени.
Ключевые отличия регистра расчета:
- Период действия. У записи есть не только дата, но и интервал «с — по», в течение которого действует начисление (например, отпуск с 10 по 23 число).
- Связь с планом видов расчета. Каждая запись относится к конкретному виду расчета — оклад, премия, больничный, — где описана формула и зависимости.
- Базовый период. Регистр умеет вычислять базу — сумму результатов других видов расчета за указанный период, например для расчета премии процентом.
- Вытеснение. Один вид расчета может вытеснять другой по периоду: больничный автоматически «отодвигает» оплату по окладу за дни болезни.
- Перерасчеты. Механизм автоматически отслеживает записи, которые стали недостоверными, и предлагает их пересчитать.
Из каких объектов строится механизм расчета
Механизм расчета в типовой конфигурации — это связка нескольких объектов, каждый из которых отвечает за свою часть. Разбираться в расчете регистров без понимания этой связки сложно, потому что ошибка в любом звене искажает итоговую сумму.
План видов расчета — справочник всех начислений и удержаний. У каждого вида расчета настраиваются: формула (шаблон на встроенном языке или предопределенный алгоритм), список базовых видов расчета, список вытесняющих видов, ведущие виды расчета (которые при изменении требуют перерасчета текущего).
Графики работы — регистр сведений или справочник, задающий норму рабочего времени: сколько часов или дней сотрудник должен был отработать в периоде. От нормы считается, например, оплата по окладу: Оклад * ВремяВДнях / НормаДней.
Документы-регистраторы — «Начисление зарплаты», «Больничный лист», «Отпуск», «Премия». Именно документы создают записи в регистре расчета и при проведении запускают алгоритм вычисления результата.
Регистр расчета — итоговое хранилище записей с полями: сотрудник, вид расчета, период действия, базовый период, результат, отработанное время, показатели (оклад, процент премии и т.д.).
Как платформа рассчитывает запись: пошаговая логика
Когда документ проводится, для каждой строки табличной части создается запись в регистре расчета, и система выполняет стандартную последовательность вычислений. Понимание этой цепочки помогает находить причину неверной суммы.
- 1Документ создает запись в регистре расчета с видом расчета, сотрудником и периодом действия
- 2Система определяет фактический период действия с учетом вытесняющих видов расчета
- 3По графику работы вычисляется норма времени и фактически отработанное время за период
- 4Рассчитывается база — суммы результатов базовых видов расчета за базовый период
- 5Выполняется формула вида расчета с подстановкой показателей, времени и базы
- 6Результат записывается в регистр, при необходимости создаются записи перерасчета зависимых видов
На каждом шаге возможна ошибка настройки. Если неверно заполнен график — исказится норма времени. Если в виде расчета не указан базовый вид — премия процентом посчитается от нуля. Если не настроено вытеснение — сотрудник получит и оклад за дни болезни, и больничный за тот же период.
База, вытеснение и фактический период действия
Три понятия, без которых расчет регистров в 1С не понять до конца, — база, вытеснение и фактический период действия. Именно они отличают регистр расчета от простой таблицы начислений.
База и базовый период
База — это сумма результатов других видов расчета, от которой считается текущее начисление. Например, премия «20% от оклада» берет базу по виду расчета «Оклад» за базовый период — обычно текущий месяц. Базовый период может не совпадать с периодом действия: квартальная премия считается от базы за три месяца. Данные базы получают через виртуальную таблицу регистра База или метод ПолучитьБазу().
Вытеснение по периоду
Вытеснение означает, что два вида расчета не могут действовать одновременно в одни дни. Больничный вытесняет оплату по окладу: фактический период действия оклада сокращается на дни болезни, и норма времени для оклада считается только за оставшиеся дни. Список вытесняющих видов задается в плане видов расчета на специальной закладке.
Перерасчеты: зачем нужны и как с ними работать
Механизм перерасчетов — главная «фишка» регистров расчета. Если данные прошлого периода изменились (сотрудник принес больничный за уже рассчитанный месяц, изменился оклад задним числом), система должна пересчитать все зависимые начисления: оклад, премию от оклада, районный коэффициент и так далее.
Для этого в конфигурации создается объект «Перерасчет», связанный с регистром расчета. Когда запись регистра изменяется, платформа автоматически добавляет в регистр перерасчета строки с записями, которые стали недостоверными. Список зависимостей определяется настройкой ведущих и базовых видов расчета.
На практике расчетчик открывает обработку или документ перерасчета, видит список сотрудников и видов расчета, требующих обновления, и выполняет пересчет одним действием. В типовом ЗУП этот процесс встроен в механизм «доначислений» при повторном расчете месяца.
Программный расчет регистров для разработчика
Разработчику, дорабатывающему расчетный модуль, важно знать основные приемы работы с регистром расчета в коде. Типовой сценарий — в обработчике проведения документа сформировать движения и вызвать расчет.
// Запись движений и расчет по виду расчета
Движения.ОсновныеНачисления.Записать();
Движения.ОсновныеНачисления.Рассчитать();
Метод Рассчитать() выполняет формулы всех записей набора. Если нужен собственный алгоритм, записи перебирают в цикле, получают базу и данные графика, затем присваивают результат:
Для Каждого Запись Из Движения.ОсновныеНачисления Цикл
База = Запись.ПолучитьБазу();
ДанныеГрафика = Запись.ПолучитьДанныеГрафика();
Запись.Результат = Запись.Оклад
* ДанныеГрафика.ВремяВДнях
/ ДанныеГрафика.НормаДней;
КонецЦикла;
Движения.ОсновныеНачисления.Записать();
В типовом ЗУП прямой программный расчет применяется редко: там используется собственный механизм «менеджера расчета зарплаты», который надстраивает платформенные возможности показателями, шкалами и зависимостями. Но базовые принципы — формула, база, график, вытеснение — остаются теми же.
При отладке формулы вида расчета быстрее всего смотреть готовую запись в регистре: откройте документ начисления, перейдите в движения по регистру расчета и сравните показатели, отработанное время и норму с ожидаемыми. В большинстве случаев причина неверной суммы видна сразу — не заполнен показатель или не тот график.
Типичные ошибки и как проверить корректность расчета
Большинство проблем с расчетом регистров сводится к нескольким повторяющимся причинам. Их полезно проверять в первую очередь, прежде чем искать ошибку в коде.
Как проверить результат
Уменьшен на дни вытесняющих начислений (больничный, отпуск)
Совпадает с исходным, хотя в месяце есть вытесняющие документы
Соответствует производственному календарю и графику сотрудника
Ноль или явно неверное число дней
Равна сумме результатов базовых видов за базовый период
Ноль или сумма за другой период
После изменения данных задним числом перерасчеты выполнены и список пуст
В регистре перерасчета висят необработанные строки
Для контроля итогов используйте расчетный листок сотрудника и отчеты по регистру расчета: они показывают, из каких записей сложилась сумма. Если цифра в листке не сходится с ожиданием, раскройте состав начисления до уровня отдельной записи регистра — так видно, какой именно параметр исказил расчет.
Когда регистр расчета не нужен: альтернативы
Не всякая задача начисления требует регистра расчета. Если расчет одноразовый, не зависит от периода действия, графиков и базы — например, фиксированная разовая премия или компенсация, — достаточно регистра накопления или даже табличной части документа. Механизм регистров расчета оправдан там, где есть вытеснение по периоду, зависимость от нормы времени и цепочки перерасчетов.
Сравнение вариантов
Периодические начисления с формулами, базой, вытеснением и перерасчетами: зарплата, отпускные, больничные. Избыточен для простых разовых сумм
Разовые начисления и удержания без зависимости от графика и периода действия. Не умеет вытеснение и автоматические перерасчеты
Простейший случай: сумма вводится вручную и нигде не накапливается. Нет аналитики по периодам и истории
Частые вопросы о расчете регистров в 1С
Чем регистр расчета отличается от регистра накопления?
Регистр накопления хранит факты (приход, расход, остатки), а регистр расчета — еще и логику вычисления: формулу вида расчета, период действия, связь с графиком и базой. Регистр расчета умеет вытеснение по периоду и автоматические перерасчеты зависимых записей, чего у регистра накопления нет.
Почему премия процентом рассчиталась нулем?
Чаще всего в виде расчета премии не указаны базовые виды расчета или неверно задан базовый период — тогда база пустая. Также проверьте, что базовые начисления (например, оклад) уже рассчитаны: премия считается от их результата, а не от плановых значений.
Что делать, если сотрудник принес больничный за уже закрытый месяц?
Введите больничный документом с фактическим периодом болезни. Система зафиксирует необходимость перерасчета: вытеснит оклад за дни болезни и пересчитает зависимые начисления. В типовом ЗУП это оформляется доначислением или сторно при следующем расчете зарплаты.
Можно ли отредактировать запись регистра расчета вручную?
Технически возможно, но делать этого не стоит: ручная правка разрывает связь с документом-регистратором, искажает базу для зависимых расчетов и ломает механизм перерасчетов. Корректируйте данные только документами — сторнирующими или исправительными.
Где посмотреть, из чего сложилась сумма начисления?
Откройте расчетный листок сотрудника и движения документа начисления по регистру расчета: там видны вид расчета, период действия, показатели, отработанное время, норма и результат. Сравнение этих значений с ожидаемыми обычно сразу показывает источник расхождения.
Что важно запомнить
Расчет регистров в 1С — это работа механизма регистров расчета: записи начислений вычисляются по формулам видов расчета с учетом графика, базы и вытеснения, а при изменении данных задним числом система пересчитывает зависимые суммы. Корректность результата проверяйте по четырем точкам: график, база, вытеснение, выполненные перерасчеты.