Как правильно организовать учет начислений и удержаний: почему регистр накопления лучше регистра сведений

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке собственных модулей расчета заработной платы или учета финансовых издержек внутри нестандартных конфигураций (например, в системах автоматизации автобизнеса) разработчики часто сталкиваются с дилеммой: какой объект метаданных использовать для хранения данных о начислениях. Ошибка на этапе проектирования структуры регистров может привести к тому, что данные будут «затираться», отчеты — показывать неверные суммы, а бухгалтер не сможет проводить начисления несколько раз в месяц.

В этой статье мы подробно разберем, почему попытка использовать Регистр сведений для хранения суммовых показателей часто заканчивается неудачей, и как правильно применить Регистр накопления для решения этой задачи.

Анализ проблемы: почему регистр сведений «не тянет» зарплату

Рассмотрим ситуацию, когда в документе НачислениеЗП предусмотрены табличные части для «Плюсов» (начисления) и «Минусов» (удержания). Основная трудность возникает, когда бухгалтер хочет видеть накопленный итог за месяц, выполняя начисления частями (трижды в месяц). Автор задачи попытался использовать Регистр сведений с измерениями Сотрудник и Договор.

Разберем, почему этот подход ошибочен по своей сути:

  1. Уникальность записей. В регистре сведений комбинация измерений должна быть уникальной в пределах периода. Если у нас есть измерения Сотрудник и Договор, то в один и тот же момент времени (или в рамках одного регистратора) система не позволит записать две разные строки по одному и тому же сотруднику. Каждая новая попытка записи будет перезаписывать предыдущую информацию.
  2. Отсутствие агрегации. Регистры сведений предназначены для хранения состояния (например, «какой сейчас оклад у сотрудника» или «какой сегодня курс валюты»). Они не умеют автоматически суммировать значения при получении данных за период. Для получения итогов за месяц придется писать сложные запросы с группировками.
  3. Негибкость ресурсов. Создание отдельного ресурса под каждый вид начисления (премия, бонус, переработка) — это путь к постоянному изменению конфигурации. Как только появится новый вид «плюшки», вам придется добавлять новый ресурс в регистр и менять программный код.

Переход к Регистру накопления: Обороты против Остатков

Для финансовых расчетов в 1С предусмотрены Регистры накопления. Проанализируем, какой вид регистра выбрать в зависимости от целей учета:

Регистр накопления «Обороты» — идеальный выбор, если нам нужно только знать, сколько всего было начислено и удержано. Он хранит только изменения (приходы/расходы) и позволяет мгновенно получить сумму за любой период (неделя, месяц, квартал). Этот регистр не требует «закрытия в ноль».

Регистр накопления «Остатки» — необходим, если мы ведем полноценный взаиморасчет. Начисление — это наш долг перед сотрудником (Приход), выплата — погашение долга (Расход). В этом случае мы всегда видим конечное сальдо: кто кому и сколько остался должен.

Рассмотрим пример правильной структуры Регистра накопления для начислений:

Именно использование измерения ВидРасчета позволяет добавлять неограниченное количество типов начислений без изменения структуры метаданных.

Решение проблемы уникальности записей при проведении

Если специфика бизнес-логики все же заставляет вас использовать Регистр сведений (хотя это и не рекомендуется для сумм), то для записи нескольких строк по одному сотруднику в одном документе необходимо добавить дополнительное измерение для обеспечения уникальности. Обычно это НомерСтроки (тип Число) или КлючСвязи (тип УникальныйИдентификатор).

Однако при использовании Регистра накопления такая проблема отпадает сама собой — он спроектирован так, чтобы принимать любое количество записей с одинаковыми измерениями, просто складывая их суммы в виртуальных таблицах оборотов.

Работа с периодом регистрации

Чтобы бухгалтер мог начислять зарплату трижды в месяц и видеть общую картину, важно правильно настроить Период регистрации. В 1С зарплатные документы обычно имеют дату документа (текущий момент) и реквизит ПериодРегистрации (начало месяца, за который идет расчет).

При проведении документа записи должны попадать в регистр с периодом, равным НачалоМесяца от периода регистрации. Рассмотрим пример кода в модуле документа:


Процедура ОбработкаПроведения(Отказ, Режим)
    // Очистка старых движений происходит автоматически, 
    // если установлено свойство "Записывать выбранные" или "Удалять автоматически"
    
    Для Каждого СтрокаТЧ Из ТабличнаяЧастьНачисления Цикл
        Движение = Движения.НачисленияСотрудников.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = НачалоМесяца(ДатаРегистрации); 
        Движение.Сотрудник = СтрокаТЧ.Сотрудник;
        Движение.ВидРасчета = СтрокаТЧ.ВидРасчета;
        Движение.Сумма = СтрокаТЧ.Сумма;
    КонецЦикла;
    
    Движения.НачисленияСотрудников.Записать();
КонецПроцедуры

При таком подходе все три документа, созданные в разные дни месяца, «упадут» на одну и ту же дату в регистре (первое число месяца), и любой отчет по итогам месяца покажет их суммарный результат.

Как видеть актуальные данные в форме документа

Автор вопроса упоминал, что бухгалтер хочет видеть накопленные данные прямо в момент заполнения текущего документа. Использование модальных окон для редактирования табличных частей других документов — это крайне нестабильный подход.

Правильнее будет при открытии формы или при выборе сотрудника выполнять запрос к виртуальной таблице Обороты регистра накопления. Проанализируем алгоритм:

  1. При активизации строки или нажатии кнопки «Рассчитать» вызывается серверная функция.
  2. Функция выполняет запрос к РегистрНакопления.НачисленияСотрудников.Обороты(&НачалоМесяца, &КонецМесяца, , Сотрудник = &ТекущийСотрудник).
  3. Результат запроса выводится в информационную панель или заполняет соответствующие колонки в текущей табличной части.

Это гарантирует, что бухгалтер видит реальную картину из базы данных, а не просто содержимое соседнего документа, который мог быть изменен или удален другим пользователем.

Резюме: архитектурные рекомендации

Проанализировав ситуацию, можно сделать следующие выводы:

Соблюдение этих правил позволит вам построить надежную систему, которая не «рухнет» при росте объема данных и будет понятна любому другому 1С-разработчику, который столкнется с поддержкой вашего кода.

← На главную