Как очистить зависимый регистр сведений в 1С:ЗУП 3.1 без перепроведения документов

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

В процессе эксплуатации систем на базе 1С:ЗУП 3.1, особенно при использовании расширений от компании «Первый Бит» (например, БИТ.ФИНАНС или специализированные модули БИТ.ЗУП), пользователи часто сталкиваются с накоплением избыточных данных в регистре Распределение по территориям. Проблема усугубляется тем, что этот регистр является зависимым — то есть его записи жестко подчинены документам-регистраторам. Попытка простого удаления записей через стандартные обработки часто ни к чему не приводит, а перепроводить документы прошлых периодов нельзя из-за закрытой отчетности и ручных правок в отражении зарплаты.

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

Понимание структуры зависимого регистра

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

Рассмотрим основные способы решения этой задачи.

Способ 1. Программная очистка через набор записей

Это самый надежный метод, который позволяет «обнулить» движения конкретного регистра, не вызывая обработчики проведения самого документа. Разберем по шагам, как это реализовать. Нам необходимо создать объект РегистрСведенийНаборЗаписей, установить отбор по регистратору и записать пустой набор с флагом Замещать = Истина.

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


// Выбираем все документы, которые сделали записи в регистр
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   Т.Регистратор КАК Регистратор
    |ИЗ
    |   РегистрСведений.РаспределениеПоТерриториям КАК Т
    |ГДЕ
    |   Т.Период < &ДатаНачалаАктуальности";

Запрос.УстановитьПараметр("ДатаНачалаАктуальности", Дата('20240101'));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

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

Способ 2. Использование коллекции Движения у документа

Если нам нужно действовать более точечно, мы можем обратиться к самому объекту документа. Выясним причину, почему это иногда удобнее: при работе с объектом документа мы можем проверить дополнительные условия (например, статус документа или его дату), прежде чем очищать движения.

Рассмотрим пример кода:


ДокументОбъект = Выборка.Регистратор.ПолучитьОбъект();
// Проверяем наличие регистра в коллекции движений
ДвиженияРегистра = ДокументОбъект.Движения.РаспределениеПоТерриториям;
ДвиженияРегистра.Прочитать();

Если ДвиженияРегистра.Количество() > 0 Тогда
    ДвиженияРегистра.Очистить();
    ДвиженияРегистра.Записать(Истина);
КонецЕсли;

Внимание: Этот метод несколько медленнее, чем первый, так как требует получения объекта документа в память. Для массовой очистки «мусора» за год лучше использовать первый вариант через прямой набор записей регистра.

Методологический подход: Территория по умолчанию

Иногда полная физическая очистка регистра может привести к потере аналитики, которая может понадобиться для ретроспективных отчетов БИТ. Выясним, как минимизировать риски, не перегружая базу «мусором».

Вместо удаления старых записей, мы можем выполнить следующие действия:

  1. Создать новую территорию с названием «Общая (основная)» или использовать существующую головную территорию.
  2. Ввести документ Перемещение между территориями датой начала нового периода (например, 01.01.2024).
  3. Переместить всех сотрудников на эту «дефолтную» территорию.

Этот способ позволяет «закрыть» прошлые распределения. Система БИТ при расчете зарплаты будет видеть новое актуальное состояние и перестанет тянуть старые распределения в новые документы Отражение зарплаты в бухучете.

Риски и рекомендации

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

Итоговая рекомендация: Перед выполнением любых манипуляций с наборами записей в промышленной базе обязательно сделайте резервную копию. Проверьте результат на тестовом контуре, сформировав отчет по проводкам и аналитикам БИТ до и после очистки.

← На главную