Мы часто сталкиваемся с вопросами о том, как правильно управлять историей изменений данных в 1С:Предприятии, особенно когда речь идет о регистрах сведений и удалении записей. Казалось бы, если запись удалена, то и её история не нужна. Однако такой подход может привести к потере ценной информации и невозможности анализа прошлых состояний. Давайте вместе разберемся, как работает механизм истории данных и какие существуют эффективные подходы для сохранения и анализа информации даже после "удаления" записей.
Прежде всего, давайте выясним, что такое История данных, или Версионирование данных, в платформе 1С:Предприятие. Это встроенный механизм, который позволяет автоматически или программно отслеживать и сохранять все изменения прикладных данных. Его основное назначение – это компактное хранение версий объектов, возможность анализа изменений, сравнения состояний и даже восстановления данных до определенного момента времени. Мы можем узнать, кто и когда внес изменения, что особенно важно для контроля и аудита.
Важно отметить, что механизм по умолчанию отключен, но его можно легко активировать как в Конфигураторе, так и в режиме 1С:Предприятие для нужных объектов. Он поддерживает различные объекты конфигурации, включая справочники, документы, константы и, конечно же, регистры сведений. Настройка может быть выполнена для объекта в целом или для отдельных реквизитов, включая табличные части.
Один из ключевых аспектов, который часто вызывает вопросы: что происходит с историей, когда запись удаляется? Механизм истории данных спроектирован таким образом, чтобы хранить информацию об удаленных версиях. То есть, если для объекта включена запись истории, при удалении записи регистра сведений ее история сохраняется. Удаление в этом контексте рассматривается как очередное изменение состояния объекта, которое фиксируется в истории.
История хранится в специальных служебных таблицах информационной базы (например, _DataHistory...), где данные кодируются в бинарном формате. Вместе с самими данными сохраняются и метаданные объекта на момент записи версии, что обеспечивает корректное отображение и анализ даже при изменении структуры конфигурации.
Итак, если наша цель – сохранять полную историю изменений, включая факт удаления, то основной и наиболее прямой путь – это использование встроенного механизма История данных. Давайте разберем его применение подробнее.
Убедитесь, что для вашего регистра сведений в Конфигураторе или через функциональность в режиме 1С:Предприятие (обычно через раздел "Администрирование" -> "Общие настройки" -> "История данных") включено версионирование. Мы можем включить его для объекта целиком или для конкретных реквизитов, если нам нужна более тонкая настройка.
Платформа автоматически фиксирует версии при любой записи версионируемого объекта. Однако в некоторых случаях, особенно при программном изменении данных, может потребоваться явный вызов метода ЗаписатьВерсию() или ОбновитьИсторию() для формирования фактической версии в истории. Например, если мы работаем с набором записей регистра сведений:
// Получаем набор записей регистра сведений
НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение1.Установить(ЗначениеИзмерения);
НаборЗаписей.Прочитать();
// Модифицируем или удаляем записи
// Например, удаляем все записи, соответствующие отбору
НаборЗаписей.Очистить();
// Записываем изменения. Платформа должна зафиксировать версию.
НаборЗаписей.Записать();
// В некоторых случаях, для гарантии фиксации версии, можно использовать
// ОбъектРегистра.ЗаписатьВерсию(); - если работаем через объект
// Или, при работе с набором записей, платформа обычно справляется сама.
При удалении записи регистра сведений (через метод Удалить() объекта или очистку НабораЗаписей с последующей записью), механизм История данных должен зафиксировать это событие как новую версию объекта, в которой данная запись отсутствует. Таким образом, мы можем отследить факт удаления и восстановить данные, если это потребуется.
Чтобы убедиться, что история сохраняется, мы можем просмотреть историю объекта через стандартные средства 1С:Предприятия. Если мы видим версии до и после удаления, значит, механизм работает корректно. Также продвинутые пользователи могут проверить содержимое служебных таблиц _DataHistory... напрямую, чтобы убедиться в наличии записей об удаленных версиях.
Если нам не нужно физически удалять записи из базы данных, но требуется исключить их из текущих отчетов и расчетов, мы можем рассмотреть альтернативный подход, который часто применяется в 1С – использование дополнительного реквизита Активность.
Мы можем добавить в структуру регистра сведений новый реквизит типа Булево (Логический), например, с именем Активность. По умолчанию его значение будет Истина.
Вместо физического удаления записи, мы изменяем значение реквизита Активность на Ложь. Запись при этом остается в базе данных, и вся ее история (если включено версионирование для регистра) также сохраняется. Фактически, мы просто помечаем запись как неактивную.
// Получаем объект регистра сведений для изменения
ОбъектРегистра = РегистрыСведений.МойРегистр.СоздатьМенеджерЗаписи();
ОбъектРегистра.Измерение1 = ЗначениеИзмерения; // Указываем ключевые поля
ОбъектРегистра.Измерение2 = ДругоеЗначениеИзмерения;
ОбъектРегистра.Прочитать(); // Читаем существующую запись
Если ОбъектРегистра.Найдена Тогда
ОбъектРегистра.Активность = Ложь; // Делаем запись неактивной
ОбъектРегистра.Записать();
КонецЕсли;
При получении данных из регистра сведений, мы всегда добавляем условие на Активность. Это гарантирует, что в наши выборки попадут только актуальные, "активные" записи. Например, в запросах 1С:
ВЫБРАТЬ
МойРегистр.Измерение1,
МойРегистр.Ресурс1
ИЗ
РегистрСведений.МойРегистр КАК МойРегистр
ГДЕ
МойРегистр.Активность = ИСТИНА
Как справедливо отмечают опытные разработчики, при работе с регистрами сведений в запросах часто используется условие И Активность = Истина, чтобы исключить неактуальные данные.
Преимущества подхода с 'Активностью':
Активность = Истина.
Активность также фиксируется механизмом История данных, если он включен.
При работе с историей данных и регистрами сведений важно учитывать несколько моментов:
НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
// Можно установить отбор, если нужно очистить часть регистра
// НаборЗаписей.Отбор.Измерение1.Установить(ЗначениеИзмеренияДляОчистки);
НаборЗаписей.Записать(); // Удалит все записи, соответствующие отбору (или весь регистр, если отбора нет)
Однако помните, что такое действие, если для регистра включена история, будет зафиксировано как изменение состояния регистра, при котором записи отсутствуют.
Таким образом, вместо полного удаления записей, которое может привести к потере ценной информации, мы рекомендуем использовать либо встроенный механизм История данных для полного отслеживания всех изменений (включая удаление), либо подход с реквизитом Активность, который позволяет гибко управлять видимостью записей без их фактического удаления.
← К списку