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

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

Мы часто сталкиваемся с вопросами о том, как правильно управлять историей изменений данных в 1С:Предприятии, особенно когда речь идет о регистрах сведений и удалении записей. Казалось бы, если запись удалена, то и её история не нужна. Однако такой подход может привести к потере ценной информации и невозможности анализа прошлых состояний. Давайте вместе разберемся, как работает механизм истории данных и какие существуют эффективные подходы для сохранения и анализа информации даже после "удаления" записей.

Понимание механизма 'История данных' (Версионирование)

Прежде всего, давайте выясним, что такое История данных, или Версионирование данных, в платформе 1С:Предприятие. Это встроенный механизм, который позволяет автоматически или программно отслеживать и сохранять все изменения прикладных данных. Его основное назначение – это компактное хранение версий объектов, возможность анализа изменений, сравнения состояний и даже восстановления данных до определенного момента времени. Мы можем узнать, кто и когда внес изменения, что особенно важно для контроля и аудита.

Важно отметить, что механизм по умолчанию отключен, но его можно легко активировать как в Конфигураторе, так и в режиме 1С:Предприятие для нужных объектов. Он поддерживает различные объекты конфигурации, включая справочники, документы, константы и, конечно же, регистры сведений. Настройка может быть выполнена для объекта в целом или для отдельных реквизитов, включая табличные части.

Один из ключевых аспектов, который часто вызывает вопросы: что происходит с историей, когда запись удаляется? Механизм истории данных спроектирован таким образом, чтобы хранить информацию об удаленных версиях. То есть, если для объекта включена запись истории, при удалении записи регистра сведений ее история сохраняется. Удаление в этом контексте рассматривается как очередное изменение состояния объекта, которое фиксируется в истории.

История хранится в специальных служебных таблицах информационной базы (например, _DataHistory...), где данные кодируются в бинарном формате. Вместе с самими данными сохраняются и метаданные объекта на момент записи версии, что обеспечивает корректное отображение и анализ даже при изменении структуры конфигурации.

Решение 1: Использование механизма 'История данных' для отслеживания удаленных записей

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

  1. Включение истории для регистра сведений:

    Убедитесь, что для вашего регистра сведений в Конфигураторе или через функциональность в режиме 1С:Предприятие (обычно через раздел "Администрирование" -> "Общие настройки" -> "История данных") включено версионирование. Мы можем включить его для объекта целиком или для конкретных реквизитов, если нам нужна более тонкая настройка.

  2. Фиксация версий:

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

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

    При удалении записи регистра сведений (через метод Удалить() объекта или очистку НабораЗаписей с последующей записью), механизм История данных должен зафиксировать это событие как новую версию объекта, в которой данная запись отсутствует. Таким образом, мы можем отследить факт удаления и восстановить данные, если это потребуется.

  3. Проверка сохранения истории:

    Чтобы убедиться, что история сохраняется, мы можем просмотреть историю объекта через стандартные средства 1С:Предприятия. Если мы видим версии до и после удаления, значит, механизм работает корректно. Также продвинутые пользователи могут проверить содержимое служебных таблиц _DataHistory... напрямую, чтобы убедиться в наличии записей об удаленных версиях.

Решение 2: Альтернативный подход – использование реквизита 'Активность' вместо удаления

Если нам не нужно физически удалять записи из базы данных, но требуется исключить их из текущих отчетов и расчетов, мы можем рассмотреть альтернативный подход, который часто применяется в 1С – использование дополнительного реквизита Активность.

  1. Добавление реквизита 'Активность':

    Мы можем добавить в структуру регистра сведений новый реквизит типа Булево (Логический), например, с именем Активность. По умолчанию его значение будет Истина.

  2. "Удаление" записи через 'Активность':

    Вместо физического удаления записи, мы изменяем значение реквизита Активность на Ложь. Запись при этом остается в базе данных, и вся ее история (если включено версионирование для регистра) также сохраняется. Фактически, мы просто помечаем запись как неактивную.

    
    // Получаем объект регистра сведений для изменения
    ОбъектРегистра = РегистрыСведений.МойРегистр.СоздатьМенеджерЗаписи();
    ОбъектРегистра.Измерение1 = ЗначениеИзмерения; // Указываем ключевые поля
    ОбъектРегистра.Измерение2 = ДругоеЗначениеИзмерения; 
    ОбъектРегистра.Прочитать(); // Читаем существующую запись
    
    Если ОбъектРегистра.Найдена Тогда
        ОбъектРегистра.Активность = Ложь; // Делаем запись неактивной
        ОбъектРегистра.Записать();
    КонецЕсли;
    
  3. Запросы с учетом 'Активности':

    При получении данных из регистра сведений, мы всегда добавляем условие на Активность. Это гарантирует, что в наши выборки попадут только актуальные, "активные" записи. Например, в запросах 1С:

    
    ВЫБРАТЬ
        МойРегистр.Измерение1,
        МойРегистр.Ресурс1
    ИЗ
        РегистрСведений.МойРегистр КАК МойРегистр
    ГДЕ
        МойРегистр.Активность = ИСТИНА
    

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

Преимущества подхода с 'Активностью':

Дополнительные нюансы и полезные советы

При работе с историей данных и регистрами сведений важно учитывать несколько моментов:

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

← К списку