Как работают настройки «Обновлять историю данных сразу после записи» и «Выполнять обработку после записи версии» в 1С 8.3?

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

Механизм Истории данных, появившийся в платформе 1С:Предприятие 8.3.11, является мощным инструментом для отслеживания изменений объектов метаданных. Однако при настройке свойств справочников или документов на закладке «Прочее» разработчики часто сталкиваются с тем, что поведение системы не совпадает с их ожиданиями. В частности, это касается двух специфических флажков: Обновлять историю данных сразу после записи и Выполнять обработку после записи версии истории данных. Проанализируем ситуацию, разберем по шагам логику работы платформы и выясним, почему в некоторых случаях установка этих галок кажется «бесполезной».

Механизм формирования истории данных: Синхронность против Асинхронности

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

Рассмотрим подробнее работу флажка «Обновлять историю данных сразу после записи»:

  1. Асинхронный режим (флажок снят): Это режим по умолчанию, рекомендуемый для высоконагруженных систем. Когда пользователь или программный код вызывает метод Записать(), платформа не формирует версию истории немедленно. Вместо этого она лишь фиксирует факт изменения объекта в специальной системной очереди (внутренней таблице). Позже системное фоновое задание сканирует эту очередь и создает версии истории в фоновом режиме.
    Почему автор вопроса не увидел разницы: В файловых базах или базах с низкой активностью это фоновое задание отрабатывает практически мгновенно. Создается иллюзия, что история пишется сразу, хотя на самом деле процесс прошел через очередь.
  2. Синхронный режим (флажок установлен): Платформа заставляет систему формировать версию истории данных непосредственно внутри транзакции записи объекта. Это гарантирует, что как только управление вернется в код после метода Записать(), версия уже будет существовать.
    Важный нюанс: Использование этого режима значительно увеличивает время транзакции записи основного объекта. Его не рекомендуется устанавливать для объектов с высокой частотой изменений.

Обработка после записи версии: Модуль менеджера и контекст исполнения

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

Проанализируем ситуацию, почему процедура ОбработкаПослеЗаписиВерсийИсторииДанных может «не отрабатывать»:

Во-первых, стоит проверить сигнатуру метода. Процедура должна быть объявлена в модуле менеджера справочника или документа с ключевым словом Экспорт и принимать ровно один параметр:


Процедура ОбработкаПослеЗаписиВерсийИсторииДанных(Версии) Экспорт
    // Параметр Версии — это массив структур, содержащих данные о созданных версиях
    Для Каждого ТекущаяВерсия Из Версии Цикл
        // Здесь можно реализовать логику, например, уведомление в Telegram об изменениях
    КонецЦикла;
КонецПроцедуры

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

Программное управление процессом

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


ОбъектСпр = Справочники.Товары.СоздатьЭлемент();
ОбъектСпр.Наименование = "Новый товар";

ПараметрыЗаписи = Новый Структура;
// Принудительно указываем синхронное обновление для конкретной записи
ПараметрыЗаписи.Вставить("ОбновлятьИсториюСразуПослеЗаписи", Истина);
// Принудительно вызываем обработчик после записи
ПараметрыЗаписи.Вставить("ВыполнитьОбработкуПослеЗаписиВерсии", Истина);

ОбъектСпр.Записать(ПараметрыЗаписи);

Если в вашей конфигурации (например, на базе БСП) код записи объектов централизован, проверьте, не переопределяются ли там эти параметры программно. Это может полностью игнорировать настройки, сделанные в конфигураторе.

Метод ИсторияДанных.ОбновитьИсторию()

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

Почему версия может не создаться вообще?

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

Подведем итог

Для правильной работы с историей данных придерживайтесь следующих правил:

  1. Используйте асинхронный режим (флажок «Обновить сразу» снят) для документов с большим количеством строк и справочников с интенсивной записью.
  2. Включайте синхронный режим только тогда, когда вам критически важно получить версию истории мгновенно в текущем сеансе (например, для немедленного отображения в форме).
  3. При отладке процедуры ОбработкаПослеЗаписиВерсийИсторииДанных всегда учитывайте, в каком сеансе она выполняется (пользовательском или фоновом).
  4. Проверяйте настройки состава полей истории: если поля не меняются, история не записывается.

Таким образом, «неработающие» галки чаще всего оказываются следствием высокой скорости работы платформы в тестовых условиях или непонимания контекста выполнения серверного кода.

← На главную