Регистры расчета в 1С:Предприятие 8.3 — это специализированные объекты конфигурации, предназначенные для хранения данных о начислениях, удержаниях и других расчетных операциях. Они незаменимы при автоматизации зарплаты, бухгалтерских проводок или любых систем, где требуется ведение истории изменений показателей по периодам. Однако их создание часто вызывает сложности даже у опытных программистов из-за особенностей структуры и связей с другими объектами.

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

1. Зачем нужен регистр расчета и чем он отличается от других регистров

Регистр расчета — это периодический регистр, который хранит не только текущие значения (как регистр сведений), но и всю историю изменений показателей с привязкой к датам. Его ключевое отличие от регистра накопления или бухгалтерии:

  • 📅 Временные срезы: данные всегда привязаны к конкретному периоду (день, месяц, квартал), что позволяет отслеживать динамику показателей.
  • 🔄 Механизм перерасчета: поддерживает автоматическое аннулирование старых записей при изменении базовых данных (например, оклада сотрудника).
  • 📊 Специализированные отчеты: оптимизирован для построения аналитики по начислениям/удержаниям (например, расчетные листки в ЗУП).

Типичные сценарии использования: Зарплатные системы (начисления, удержания, больничные), бухгалтерский учет (амортизация, резервы), логистика (расчет стоимости доставки по периодам). Без регистра расчета такие задачи пришлось бы реализовывать через сложные алгоритмы с ручным управлением версиями данных.

📊 Для какой задачи вы создаёте регистр расчета?
Зарплата и кадры
Бухгалтерский учет
Логистика/склад
Другое

2. Подготовка: проектирование структуры регистра

Перед созданием регистра в конфигураторе необходимо спроектировать его структуру на бумаге или в виде схемы. От этого этапа зависит 80% успеха: ошибки в проектировании приводят к необходимости полной переработки объекта.

Ключевые элементы, которые нужно определить: Измерения (по чему группируются данные, например, Сотрудник или Подразделение), Ресурсы (что рассчитывается, например, СуммаНачисления или КоличествоДней), Реквизиты (дополнительные атрибуты записей, например, ПричинаИзменения).

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

Определить цель регистра (что будет рассчитываться)|

Составьте список измерений (по каким признакам группируем данные)|

Выбрать ресурсы (какие показатели будем хранить)|

Решить, нужна ли история изменений (периодичность)|

Продумать связи с документами (будут ли записи подчинены документам)-->

Пример структуры для регистра НачисленияЗарплаты:

ЭлементНазваниеТип данныхОписание
ИзмерениеСотрудникСправочникСсылка.СотрудникиКому начислена зарплата
ИзмерениеПодразделениеСправочникСсылка.ПодразделенияГде работает сотрудник
РесурсСуммаЧисло(15,2)Размер начисления
РесурсКоличествоДнейЧисло(5,1)Отработанные дни
РеквизитВидНачисленияПеречислениеСсылка.ВидыНачисленийОклад, премия, больничный и т.д.
⚠️ Внимание: Если регистр будет использоваться для расчета зарплаты, убедитесь, что измерение Сотрудник имеет связь со справочником Физические лица. Это потребуется для корректного формирования отчетности в ПФР и ФНС.

3. Создание регистра расчета в конфигураторе 1С

Перейдите в конфигуратор вашей базы 1С:Предприятие 8.3 и выполните следующие шаги:

  1. Откройте дерево объектов конфигурации и найдите ветку Регистры расчета. Нажмите правой кнопкой и выберите Добавить.

  2. В свойствах регистра укажите: Имя (например, НачисленияЗарплаты), Синоним (отображаемое имя для пользователей), Периодичность (выберите В пределах дня или В пределах месяца в зависимости от задачи).

  3. На закладке Данные добавьте измерения, ресурсы и реквизиты согласно вашему проекту. Для каждого элемента укажите тип данных и свойства (например, Ведущее = Истина для основного измерения).

  4. На закладке Регистраторы укажите документы, которые будут формировать движения по регистру (например, НачислениеЗарплаты).

После создания регистра обязательно выполните проверку конфигурации (Конфигурация → Проверить конфигурацию) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

Что делать если регистр не отображается в списке объектов?

Если после создания регистр не виден в дереве объектов, проверьте:

1. Сохранили ли вы конфигурацию (Ctrl+S).

2. Нет ли ошибок в журнале регистрации (Администрирование → Журнал регистрации).

3. Правильно ли указаны права доступа для текущего пользователя (закладка Права в свойствах регистра).

4. Программное заполнение регистра: движения и записи

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

Способ 1: Движения документа

Если регистр подчинен документу (например, НачислениеЗарплаты), то записи создаются автоматически при проведении. Пример кода в модуле документа:

Процедура ОбработкаПроведения(Отказ, Режим)

// Создаем движение по регистру НачисленияЗарплаты

Движения.НачисленияЗарплаты.Записать();

// Добавляем запись для каждого сотрудника в табличной части

Для Каждого СтрокаТабличнойЧасти Из Начисления Изменить Цикл

Запись = Движения.НачисленияЗарплаты.Добавить();

Запись.Период = Дата;

Запись.Сотрудник = СтрокаТабличнойЧасти.Сотрудник;

Запись.Сумма = СтрокаТабличнойЧасти.Сумма;

Запись.ВидНачисления = СтрокаТабличнойЧасти.ВидНачисления;

КонецЦикла;

КонецПроцедуры

Способ 2: Прямая запись

Для служебных операций (например, корректировка прошлых периодов) можно использовать прямой вызов менеджера регистра:

// Пример прямой записи в регистр

Регистр = РегистрыРасчета.НачисленияЗарплаты.СоздатьМенеджерЗаписи();

Запись = Регистр.Добавить();

Запись.Период = ТекущаяДата();

Запись.Сотрудник = СсылкаНаСотрудника;

Запись.Сумма = 50000;

Запись.ВидНачисления = Перечисления.ВидыНачислений.Оклад;

Регистр.Записать();

⚠️ Внимание: Прямая запись в регистр расчета обходит механизм проверки связей с документами. Это может привести к расхождению данных, если не учесть все зависимости. Используйте этот метод только для технических операций!
💡

Для отладки движений по регистру используйте отчет "Анализ регистра расчета" (Отчеты → Стандартные → Анализ регистра расчета). Он покажет все записи с указанием документов-регистраторов.

5. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе с регистрами расчета. Вот наиболее распространённые ошибки и способы их решения:

  • 🔴 "Движения не формируются": проверьте, указан ли документ как регистратор в свойствах регистра. Также убедитесь, что в модуле документа вызывается метод Движения.ИмяРегистра.Записать().
  • 🔴 "Данные дублируются": это происходит, если не очищаются старые движения перед записью новых. Используйте Движения.ИмяРегистра.Очистить() в начале процедуры проведения.
  • 🔴 "Ошибка блокировки при записи": регистры расчета поддерживают транзакционность. Убедитесь, что все операции с регистром выполняются в одной транзакции (НачатьТранзакцию()/ЗафиксироватьТранзакцию()).
  • 🔴 "Неверные итоги в отчетах": проверьте, правильно ли настроены измерения и ресурсы. Например, если в отчете группировка по Подразделение, а в регистре это реквизит (а не измерение), данные не сгруппируются.

Для диагностики ошибок используйте журнал регистрации (Администрирование → Журнал регистрации) с фильтром по имени регистра. Также полезно включать режим отладки (Сервис → Параметры → Отладка) для пошагового выполнения кода движений.

💡

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

6. Оптимизация производительности регистров расчета

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

  1. Индексирование измерений: для часто используемых измерений (например, Сотрудник) установите флаг Индексировать в свойствах. Это ускорит выборки по этому полю.

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

  3. Архивирование старых данных: для регистров с историей более 3–5 лет настройте автоматическое архивирование через Регламентные задания.

  4. Использование виртуальных таблиц: для отчетов используйте виртуальные таблицы регистра (например, РегистрРасчета.НачисленияЗарплаты.ОстаткиИОбороты), вместо прямого обращения к данным.

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| НачисленияЗарплатыОстатки.Сотрудник,

| НачисленияЗарплатыОстатки.Сумма КАК СуммаНачисления

|ИЗ

| РегистрРасчета.НачисленияЗарплаты.Остатки(

| &Период,

| Сотрудник В (&СписокСотрудников)

| ) КАК НачисленияЗарплатыОстатки";

Запрос.УстановитьПараметр("Период", ТекущаяДата());

Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);

Результат = Запрос.Выполнить();

7. Примеры реальных задач с регистрами расчета

Рассмотрим два типовых сценария, где регистры расчета незаменимы.

Сценарий 1: Расчет зарплаты с учетом изменений окладов

Задача: при изменении оклада сотрудника нужно автоматически пересчитывать начисления за текущий месяц.

Решение:

1. Создайте регистр расчета ОкладыСотрудников с измерением Сотрудник и ресурсом СуммаОклада.

2. В документе ИзменениеОклада формируйте движения по этому регистру.

3. В документе НачислениеЗарплаты читайте актуальный оклад из регистра:

Оклад = РегистрыРасчета.ОкладыСотрудников.ПолучитьПоследнее(Сотрудник, ТекущаяДата()).СуммаОклада;

Сценарий 2: Расчет амортизации основных средств

Задача: ежемесячно рассчитывать амортизацию оборудования с учетом его первоначальной стоимости и срока службы.

Решение:

1. Создайте регистр АмортизацияОС с измерениями ОсновноеСредство и МесяцНачисления, ресурсом СуммаАмортизации.

2. В регламентном задании РасчетАмортизации формируйте записи по всем активам:

Для Каждого ОС Из ОсновныеСредства Цикл

СуммаАмортизации = ОС.ПервоначальнаяСтоимость / ОС.СрокПолезногоИспользования;

Запись = Движения.АмортизацияОС.Добавить();

Запись.ОсновноеСредство = ОС;

Запись.МесяцНачисления = ТекущийМесяц();

Запись.СуммаАмортизации = СуммаАмортизации;

КонецЦикла;

⚠️ Внимание: При расчете амортизации учитывайте правила бухгалтерского учета (ПБУ 6/01). В некоторых случаях может потребоваться корректировка сумм при изменении срока службы или выбытии основного средства.

FAQ: Ответы на частые вопросы

Можно ли в одном регистре расчета хранить и начисления, и удержания?

Технически да, но это нарушает принципы нормализации данных. Лучше создать два отдельных регистра: НачисленияЗарплаты и УдержанияЗарплаты. Это упростит отчетность и снизит риск ошибок при перерасчетах.

Как очистить все данные из регистра расчета?

Для полной очистки используйте метод Очистить() менеджера регистра:

РегистрыРасчета.НачисленияЗарплаты.Очистить();
Внимание! Эта операция необратима и удалит все записи, включая исторические данные. Перед выполнением сделайте резервную копию базы.

Почему в отчете не отображаются данные за прошлый год?

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

Запрос.Текст = "ВЫБРАТЬ ... ИЗ РегистрРасчета.НачисленияЗарплаты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ...)";
Как перенести данные из регистра сведений в регистр расчета?

Для переноса данных напишите обработку, которая:

1. Читает данные из регистра сведений.

2. Преобразует их в формат регистра расчета (добавляет период, измерения).

3. Записывает в регистр расчета с учетом его особенностей (например, проверка на дубли).

Пример кода для переноса окладов:

Выборка = РегистрыСведений.ОкладыСотрудников.Выбрать();

Пока Выборка.Следующий() Цикл

Запись = РегистрыРасчета.ОкладыСотрудниковНовый.СоздатьМенеджерЗаписи().Добавить();

Запись.Период = Выборка.Период;

Запись.Сотрудник = Выборка.Сотрудник;

Запись.СуммаОклада = Выборка.Сумма;

Запись.Записать();

КонецЦикла;

Можно ли изменить структуру регистра расчета после начала эксплуатации?

Да, но с осторожностью. Добавление новых измерений или ресурсов обычно безопасно. Удаление или изменение типов существующих полей может привести к потере данных. Рекомендуемый порядок:

  1. Создайте резервную копию базы.
  2. Внесите изменения в конфигураторе.
  3. Обновите конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных).
  4. Проверьте целостность данных с помощью тестовых отчетов.

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